什么是BeanUtils工具

BeanUtils工具是一种方便我们对JavaBean进行操作的工具,是Apache组织下的产品。

BeanUtils工具一般可以方便javaBean的哪些操作?

1)beanUtils 可以便于对javaBean的属性进行赋值。

2)beanUtils 可以便于对javaBean的对象进行赋值。

3)beanUtils可以将一个MAP集合的数据拷贝到一个javabean对象中。

BeanUtils的使用

使用beanUtils按照以下步骤~

前提:约定前提: 参数名称 需要和javabean的属性名称保持一致!!!!

步骤一

导包:导入commons-beanutils-1.8.3 包

与 commons-logging-1.1.3 包

步骤二

写代码使用~下面就来演示下常见的用法

1)设置javaBean的参数

  1. @Test
  2. public void test1() throws Exception
  3. {
  4. //先演示一下不用工具时的做法
  5. //1.生成对象
  6. Student s = new Student();
  7.  
  8. /*2.通过set方法赋值
  9. s.setId(1);
  10. s.setName("VN");
  11. s.setAge(19);
  12. s.setClassID(5);
  13. s.setBirthday(new Date());
  14. 用以上这种方法来给对象的属性赋值实在是太麻烦了,下面我们用BeanUtils来进行赋值
  15. */
  16.  
  17. //1.得到javaBean的一个字节码对象
  18. Class clazz = Class.forName("com.vmaxtam.beanutiltest.Student");
  19.  
  20. //2.生成该字节码的一个对象
  21. Object obj = clazz.newInstance();
  22.  
  23. //4.注册一个日期格式转换器
  24. ConvertUtils.register(new DateLocaleConverter(), java.util.Date.class);
  25.  
  26. //3.使用工具对该对象进行赋值
  27. //注意: 对于基本数据类型,beanutils工具进行自动类型转换。把String自动转成Integer,Double,Float
  28. BeanUtils.setProperty(obj, "id", "1");
  29. BeanUtils.setProperty(obj, "name", "VN");
  30. BeanUtils.setProperty(obj, "age", "19");
  31. BeanUtils.setProperty(obj, "classID", "5");
  32. //如果要使用特殊的日期类型,则String->Date 不能自动转换,这时候就要注册一个转换器
  33. BeanUtils.setProperty(obj, "birthday", "1996-06-06");
  34.  
  35. System.out.println(obj);
  36. }

对比一下,我们发现,使用BeanUtils里赋值好像更麻烦。。。但这只是在这段代码中而已,运用BeanUtils上面代码的这个功能,

我们可以写出一个通用的方法,可以把请求中的参数拷贝到javaBean对象中!

  1. 约定前提: 请求中的参数名称 需要和javabean的属性名称保持一致!!!!
  2. public static <T>T requestToBean(HttpServletRequest request , Class<T> clazz)
  3. {
  4. //创建javaBean对象
  5. Object obj=null;
  6. try {
  7. obj=clazz.newInstance();
  8. } catch (Exception e) {
  9. e.printStackTrace();
  10. throw new RuntimeException(e);
  11. }
  12.  
  13. //得到请求中的每个参数
  14. Enumeration<String> enu = request.getParameterNames();
  15. while(enu.hasMoreElements())
  16. {
  17. //获得参数名
  18. String name = enu.nextElement();
  19. //获得参数值
  20. String value = request.getParameter(name);
  21. //然后把参数拷贝到javaBean对象中
  22. try {
  23. BeanUtils.setProperty(obj, name, value);
  24. } catch (Exception e) {
  25. e.printStackTrace();
  26. throw new RuntimeException(e);
  27. }
  28. }
  29. return (T)obj;
  30. }

上面这个方法是一个泛型方法,传不同的javaBean进去都可以从request中获取参数值。在一个工程较大的项目中,如果使用这个通用的方法,就能节省很多代码。

2)把一个javaBean的属性拷贝到另一个javaBean对象中

  1. @Test
  2. public void test2() throws Exception
  3. {
  4. //1.生成对象
  5. Student s1 = new Student();
  6. Student s2 = new Student();
  7.  
  8. //2.通过set方法赋值
  9. s1.setId(1);
  10. s1.setName("VN");
  11. //s1.setAge(19);//基本数据类型可以为null,null也能拷贝
  12. s1.setClassID(5);
  13. s1.setBirthday(new Date());//特殊类型不能为null
  14.  
  15. //需求:把s1的属性值拷贝到S2中,注意参数的顺序
  16. BeanUtils.copyProperties(s2, s1);
  17.  
  18. System.out.println(s1);
  19. System.out.println(s2);
  20. }

一句代码就完成拷贝了,不用像以前那样先用get()方法把s1的属性值拿出来,再用set()方法供给s2属性赋值

3)把一个map集合中的数据拷贝到javaBean中

  1. @Test
  2. public void test3() throws Exception
  3. {
  4. //1.生成对象
  5. Map<String,Object> map = new HashMap<String,Object>();
  6.  
  7. //2.给一些参数
  8. map.put("id", 2);
  9. map.put("name", "EZ");
  10. map.put("age", 22);
  11. map.put("classID", 3);
  12. map.put("birthday", new Date());
  13.  
  14. //需求:把map的属性值拷贝到S中
  15. Student s = new Student();
  16. BeanUtils.copyProperties(s, map);
  17.  
  18. System.out.println(s);
  19. }

上面这个也是一步到位,也是使用copyProperties()这个方法来完成,这样减少了我们很多的操作了,十分简便。

下面介绍一个新的概念,学会这个东西后,它能够和beanUtils组合写出更多的通用代码!方便我们的项目!

元数据(MetaData)

什么是数据库的元数据

数据库中的元数据有三种:

1)数据库元数据(DatabaseMetaData):可以从connection对象中获取。

这些元数据的信息包括:当前使用什么数据库,数据库的版本,数据库驱动的版本

2)参数元数据(ParameterMetaData):可以从PreparedStatement中获取,指sql语句中的参数

元数据的信息:参数的个数,以及每个参数的类型

3)结果集元数据(ResultSetMetaData):可以从ResultSet对象中获取

元数据信息:结果集的列数,以及每列的名称

下面就来显示下怎么获取这些信息吧~

获取数据库的元数据

  1. @Test
  2. public void Test1()
  3. {
  4. //获取连接池
  5. ComboPooledDataSource pool = new ComboPooledDataSource();
  6. try {
  7. //获取连接
  8. Connection conn = pool.getConnection();
  9. //获取数据库元数据
  10. DatabaseMetaData md = conn.getMetaData();
  11.  
  12. //获得数据库的主版本和副版本
  13. int mj = md.getDatabaseMajorVersion();
  14. int mi =md.getDatabaseMinorVersion();
  15. System.out.println(mj + "."+ mi);
  16.  
  17. //获得驱动版本
  18. int dmj = md.getDriverMajorVersion();
  19. int dmi = md.getDriverMinorVersion();
  20. System.out.println(dmj + "."+dmi);
  21.  
  22. //当前使用什么数据库
  23. String b =md.getDatabaseProductName();
  24. System.out.println(b);
  25.  
  26. } catch (SQLException e) {
  27. // TODO Auto-generated catch block
  28. e.printStackTrace();
  29. }
  30. }

这个和beanutils没什么关系,所以不是重点。

获取参数元数据

  1. PreparedStatement sta=null;
  2. Connection conn=null;
  3. @Test
  4. public void Test2()
  5. {
  6. //获取连接池
  7. ComboPooledDataSource pool = new ComboPooledDataSource();
  8. try {
  9. //获取连接
  10. conn = pool.getConnection();
  11. //准备SQL语句
  12. String sql ="insert into student(sid,sname) values(?,?)";
  13. //获得Statement
  14. sta = conn.prepareStatement(sql);
  15.  
  16. //获取元数据
  17. ParameterMetaData md = sta.getParameterMetaData();
  18. //获取参数的一些信息:参数的个数
  19. int count = md.getParameterCount();
  20. //然后利用这个数来给参数赋值
  21. //方便参数赋值
  22. Object value[] = new Object[]{17,"VN"};
  23. for(int i = 0;i<count ;i++)
  24. {
  25. sta.setObject(i+1, value[i]);
  26. }
  27. //执行
  28. sta.executeUpdate();
  29.  
  30. //有可能具体数据库厂商不支持下面方法
  31. //System.out.println("第一个参数的类型:"+md.getParameterTypeName(1));
  32.  
  33. } catch (SQLException e) {
  34. // TODO Auto-generated catch block
  35. e.printStackTrace();
  36. }finally{
  37. //关闭资源
  38. if(sta!=null){
  39. try {
  40. sta.close();
  41. } catch (SQLException e) {
  42. e.printStackTrace();
  43. }if(conn!=null)
  44. {
  45. try {
  46. conn.close();
  47. } catch (SQLException e) {
  48. // TODO Auto-generated catch block
  49. e.printStackTrace();
  50. }
  51. }
  52. }
  53. }
  54. }

以上就是使用元数据来对预编译的SQL语句来进行方便的参数赋值的方法~当参数比较多的时候,我们就不必一个一个地自己赋值,可以利用循环来给它赋值。

获取结果集的元数据

我们先发送一个查询语句获得一个结果集,然后可以利用元数据来很方便地封装结果集返回的结果~

  1. @Test
  2. public void Test3()
  3. {
  4.  
  5. try {
  6. //获取连接池
  7. ComboPooledDataSource pool = new ComboPooledDataSource();
  8. //获取连接
  9. conn = pool.getConnection();
  10. //准备SQL语句
  11. String sql="select * from student";
  12. //获得statement对象
  13. sta = conn.prepareStatement(sql);
  14.  
  15. //执行,返回结果集
  16. ResultSet res = sta.executeQuery();
  17. //获取结果集的元素据
  18. ResultSetMetaData rd = res.getMetaData();
  19.  
  20. //利用元数据来封装对象
  21. List<Students> list = new ArrayList<Students>();
  22. //获得结果集的列数
  23. int colcount = rd.getColumnCount();
  24. //循环结果集来封装对象
  25. while(res.next())
  26. {
  27. Students s = new Students();
  28. for(int i = 1; i <= colcount ; i++)
  29. {
  30.  
  31. //得到列名
  32. String colname = rd.getColumnName(i);
  33. //得到列值
  34. Object value = res.getObject(colname);
  35. //利用BeanUtils,放入对象中
  36. BeanUtils.setProperty(s, colname, value);
  37. }
  38. //把封装好的对象放入集合
  39. list.add(s);
  40. }
  41. //然后可以对List其他操作~
  42. } catch (Exception e) {
  43. e.printStackTrace();
  44. throw new RuntimeException(e);
  45. }
  46. //关闭资源
  47. }

这就是利用元数据和BeanUtil结合方便我们封装结果集数据的一个例子了~利用这个特点,我们可以写出更多的通用的方法。

利用元数据和BeanUtil 编写通用的 更新方法 和 查询方法

以下就是一个通用的查询方法

参数说明:

    sql:要预编译的查询语句

    values:把sql语句的参数放到这个数组中

    clazz:最后集合中返回的javaBean的类型

  1. public static <T> List<T> query(String sql,Object[] values,Class<T> clazz)
  2. {
  3. Connection conn = null;
  4. PreparedStatement sta = null;
  5. ResultSet res = null;
  6.  
  7. try {
  8. //获取连接池
  9. ComboPooledDataSource pool = new ComboPooledDataSource();
  10. //获取连接
  11. conn = pool.getConnection();
  12. //获取statement对象,预编译
  13. sta = conn.prepareStatement(sql);
  14.  
  15. //利用参数的元数据给预编译的SQL语句赋值
  16. ParameterMetaData pmd = sta.getParameterMetaData();
  17. //获得参数个数
  18. int pcount = pmd.getParameterCount();
  19.  
  20. //赋值
  21. if(values != null)
  22. {
  23. for(int i=1 ;i<=pcount;i++)
  24. {
  25. sta.setObject(i, values[i-1]);
  26. }
  27. }
  28.  
  29. //执行
  30. res = sta.executeQuery();
  31.  
  32. //获得结果集元数据
  33. ResultSetMetaData rsmd = res.getMetaData();
  34. //创建存储对象的集合
  35. List<T> list = new ArrayList<T>();
  36. //获取列的数量
  37. int colcount = rsmd.getColumnCount();
  38. //封装对象
  39. while(res.next())
  40. {
  41. //生成要封装的对象的实例
  42. Object obj = clazz.newInstance();
  43. for(int i=1;i<=colcount;i++)
  44. {
  45. //获得列名
  46. String colname = rsmd.getColumnName(i);
  47. //获得列值
  48. Object colvalue = res.getObject(i);
  49. //封装
  50. BeanUtils.setProperty(obj, colname, colvalue);
  51. }
  52. //把封装好的对象放入集合
  53. list.add((T) obj);
  54. }
  55. return (List<T>)list;
  56. } catch (Exception e) {
  57. e.printStackTrace();
  58. throw new RuntimeException(e);
  59. }finally{
  60. //释放资源
  61. if(res!=null){
  62. try {
  63. res.close();
  64. } catch (SQLException e1) {
  65. e1.printStackTrace();
  66. }}
  67. if(sta!=null){
  68. try {
  69. sta.close();
  70. } catch (SQLException e) {
  71. e.printStackTrace();
  72. }}
  73. if(conn!=null){
  74. try {
  75. conn.close();//放回连接池
  76. } catch (SQLException e) {
  77. e.printStackTrace();
  78. }}
  79. }
  80. }

以上就是一个通用的查询方法啦~下面来看一个通用的更新方法,比上面的简单~

通用的更新方法

  1. public static void update(String sql,Object[] values)
  2. {
  3. Connection conn =null;
  4. PreparedStatement sta = null;
  5.  
  6. try {
  7.  
  8. //获取连接池
  9. ComboPooledDataSource pool = new ComboPooledDataSource();
  10. //获取连接
  11. conn = pool.getConnection();
  12. //预编译
  13. sta= conn.prepareStatement(sql);
  14.  
  15. //获取参数的元数据
  16. ParameterMetaData pmt = sta.getParameterMetaData();
  17.  
  18. //获取参数的个数
  19. int pcount = pmt.getParameterCount();
  20. //参数赋值
  21. for(int i = 1; i<=pcount;i++)
  22. {
  23. sta.setObject(i, values[i-1]);
  24. }
  25.  
  26. //执行更新
  27. sta.executeUpdate();
  28.  
  29. } catch (SQLException e) {
  30. // TODO Auto-generated catch block
  31. e.printStackTrace();
  32. }
  33.  
  34. }

这就完成了~

优缺点

优点:比较通用

缺点:就是每次调用这两个方法都要在内部生产一个连接池,这样一个连接池来完成一条语句是十分浪费的,所以这一点可以改进~改进方法也比较简单~这里就不演示了~

BeanUtils工具的更多相关文章

  1. 第13天 JSTL标签、MVC设计模式、BeanUtils工具类

    第13天 JSTL标签.MVC设计模式.BeanUtils工具类 目录 1.    JSTL的核心标签库使用必须会使用    1 1.1.    c:if标签    1 1.2.    c:choos ...

  2. Beanutils工具常用方法

      BeanUtils工具是一种方便我们对JavaBean进行操作的工具,是Apache组织下的产品.其主要目的是利用反射机制对JavaBean的属性进行处理. BeanUtils工具一般可以方便ja ...

  3. 利用BeanUtils工具类封装表单数据

    一.BeanUtils工具类的使用 1.首先导入BeanUtils工具类的jar包 commons-beanutils-1.8.0.jar commons-logging-1.1.1.jar 2.se ...

  4. BeanUtils工具的实现

    BeanUtils工具的实现 自定义一个将数据映射到类里的方法 方法一: package utils; import java.lang.reflect.Field; import java.lang ...

  5. BeanUtils 工具类

    一.BeanUtils 概述     BeanUtils 是阿帕奇提供的一套专门用于将一些数据封装到java对象中的工具类;          名词:javaBean:特定格式的java类称为java ...

  6. JavaWeb 之 BeanUtils 工具类

    在上一个用户登录案例中,当从浏览器接收参数后,还需要创建 JavaBean 类,对其的属性每一项赋值,如果属性少,可以手动完成,但是当属性非常多,这时就发现非常不方便,在这里提供一个可以封装 Java ...

  7. JDBC--使用beanutils工具类操作JavaBean

    1.在JavaEE中,Java类的属性通过getter,setter来定义: 2.可使用BeanUtils工具包来操作Java类的属性: --Beanutils是由Apache公司开发,能够方便对Be ...

  8. EL表达式和JSTL(二)——BeanUtils工具

    BeanUtils工具 大对数人习惯使用JavaBean的get和set方法来获取和设置JavaBean的属性,但是在Java EE编程的过程中,会经常从配置文件中读取数据,但是从配置文件中读取的数据 ...

  9. JavaBean 内省API BeanUtils工具 泛型 xml xml约束

    1 什么是JavaBean?有何特征? 1)符合特定规则的类    2)JavaBean分二类:     a)侠义的JavaBean         .私有的字段(Field)         .对私 ...

随机推荐

  1. Jenkins + Pipeline 构建流水线发布

      Jenkins + Pipeline 构建流水线发布 利用Jenkins的Pipeline配置发布流水线 参考: https://jenkins.io/doc/pipeline/tour/depl ...

  2. Scala进阶之路-Scala的基本语法

    Scala进阶之路-Scala的基本语法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.函数式编程初体验Spark-Shell之WordCount var arr=Array( ...

  3. Solr记录-solr介绍及配置

    Solr是一个开源搜索平台,用于构建搜索应用程序. 它建立在Lucene(全文搜索引擎)之上. Solr是企业级的,快速的和高度可扩展的. 使用Solr构建的应用程序非常复杂,可提供高性能. 为了在C ...

  4. 一致性哈希算法介绍,及java实现

    应用场景 在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括: 轮循算法(Round Robin).哈希算法(HASH).最少连接算法(Least Connection).响应速度算法(Res ...

  5. javascript惰性函数

    惰性函数:所谓惰性函数就是创建了一个新函数并且将其分配给保存了另外函数的同一个变量,就以一个新函数覆盖了旧函数.某种程度上,回收了旧函数指针以指向一个新函数. 板栗: var scareMe = fu ...

  6. CSS-3 新弹性盒模型属性

    flex 语法:flex:none | [ flex-grow ] || [ flex-shrink ] || [ flex-basis ] 取值: none:none关键字的计算值为: 0 0 au ...

  7. Angular 下的 directive (part 2)

    ngCloak ngCloak指令被使用在,阻止angular模板从浏览器加载的时候出现闪烁的时候.使用它可以避免闪烁问题的出现.   该指令可以应用于<body>元素,但首选使用多个ng ...

  8. 第9月第15天 设计模式 adapter mvc

    1. 有一道iOS面试题,iOS中都有什么设计模式?很少有答案说包括adapter. gof 书中adapter模式有以下内容: 实现: ... b ) 使 用 代 理 对 象 在这种方法中, T r ...

  9. Servlet笔记9--转发与重定向

    关于Web中资源跳转的问题: 转发和重定向基本代码: package com.bjpowernode.javaweb; import java.io.IOException; import javax ...

  10. weblogica