什么是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的参数

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

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

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

约定前提: 请求中的参数名称 需要和javabean的属性名称保持一致!!!!
public static <T>T requestToBean(HttpServletRequest request , Class<T> clazz){//创建javaBean对象    Object obj=null;try {obj=clazz.newInstance();} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}//得到请求中的每个参数Enumeration<String> enu = request.getParameterNames();while(enu.hasMoreElements()){//获得参数名String name = enu.nextElement();//获得参数值String value = request.getParameter(name);//然后把参数拷贝到javaBean对象中try {BeanUtils.setProperty(obj, name, value);} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}}return (T)obj;}

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

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

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

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

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

@Testpublic void test3() throws Exception{//1.生成对象Map<String,Object> map = new HashMap<String,Object>();//2.给一些参数map.put("id", 2);map.put("name", "EZ");map.put("age", 22);map.put("classID", 3);map.put("birthday", new Date());//需求:把map的属性值拷贝到S中Student s = new Student();BeanUtils.copyProperties(s, map);System.out.println(s);}

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

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

元数据(MetaData)

什么是数据库的元数据

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

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

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

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

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

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

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

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

获取数据库的元数据

    @Testpublic void Test1(){//获取连接池ComboPooledDataSource pool = new ComboPooledDataSource();try {//获取连接Connection conn = pool.getConnection();//获取数据库元数据DatabaseMetaData md =     conn.getMetaData();//获得数据库的主版本和副版本int mj = md.getDatabaseMajorVersion();int mi =md.getDatabaseMinorVersion();System.out.println(mj + "."+ mi);//获得驱动版本int dmj = md.getDriverMajorVersion();int dmi = md.getDriverMinorVersion();System.out.println(dmj + "."+dmi);//当前使用什么数据库String b =md.getDatabaseProductName();System.out.println(b);} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}    }

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

获取参数元数据

    PreparedStatement sta=null;Connection conn=null;@Testpublic void Test2(){//获取连接池ComboPooledDataSource pool = new ComboPooledDataSource();try {//获取连接conn = pool.getConnection();//准备SQL语句String sql ="insert into student(sid,sname) values(?,?)";//获得Statementsta = conn.prepareStatement(sql);//获取元数据ParameterMetaData md = sta.getParameterMetaData();//获取参数的一些信息:参数的个数int count = md.getParameterCount();//然后利用这个数来给参数赋值//方便参数赋值Object value[] = new Object[]{17,"VN"};for(int i = 0;i<count ;i++){sta.setObject(i+1, value[i]);}//执行sta.executeUpdate();//有可能具体数据库厂商不支持下面方法//System.out.println("第一个参数的类型:"+md.getParameterTypeName(1));} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{//关闭资源if(sta!=null){try {sta.close();} catch (SQLException e) {e.printStackTrace();}if(conn!=null){try {conn.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}}

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

获取结果集的元数据

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

    @Testpublic void Test3(){try {//获取连接池ComboPooledDataSource pool = new ComboPooledDataSource();//获取连接conn = pool.getConnection();//准备SQL语句String sql="select * from student";//获得statement对象sta = conn.prepareStatement(sql);//执行,返回结果集ResultSet res = sta.executeQuery();//获取结果集的元素据ResultSetMetaData rd = res.getMetaData();//利用元数据来封装对象List<Students> list = new ArrayList<Students>();//获得结果集的列数int colcount = rd.getColumnCount();//循环结果集来封装对象while(res.next()){Students s = new Students();for(int i = 1; i <= colcount ; i++){//得到列名String colname = rd.getColumnName(i);//得到列值Object value = res.getObject(colname);//利用BeanUtils,放入对象中BeanUtils.setProperty(s, colname, value);}//把封装好的对象放入集合list.add(s);}//然后可以对List其他操作~        } catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}//关闭资源}

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

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

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

参数说明:

    sql:要预编译的查询语句

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

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

    public static <T> List<T> query(String sql,Object[] values,Class<T> clazz){Connection conn = null;PreparedStatement sta = null;ResultSet res = null;try {//获取连接池ComboPooledDataSource pool = new ComboPooledDataSource();//获取连接conn = pool.getConnection();//获取statement对象,预编译sta = conn.prepareStatement(sql);    //利用参数的元数据给预编译的SQL语句赋值ParameterMetaData pmd = sta.getParameterMetaData();//获得参数个数int pcount = pmd.getParameterCount();//赋值if(values != null){for(int i=1 ;i<=pcount;i++){sta.setObject(i, values[i-1]);}}//执行res = sta.executeQuery();//获得结果集元数据ResultSetMetaData rsmd = res.getMetaData();//创建存储对象的集合List<T> list = new ArrayList<T>();//获取列的数量int colcount = rsmd.getColumnCount();//封装对象while(res.next()){//生成要封装的对象的实例Object obj = clazz.newInstance();for(int i=1;i<=colcount;i++){//获得列名String colname = rsmd.getColumnName(i);//获得列值Object colvalue = res.getObject(i);//封装BeanUtils.setProperty(obj, colname, colvalue);}//把封装好的对象放入集合list.add((T) obj);}return (List<T>)list;            } catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}finally{//释放资源if(res!=null){try {res.close();} catch (SQLException e1) {e1.printStackTrace();}}if(sta!=null){try {sta.close();} catch (SQLException e) {e.printStackTrace();}}if(conn!=null){try {conn.close();//放回连接池} catch (SQLException e) {e.printStackTrace();}}}    }

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

通用的更新方法

    public static void update(String sql,Object[] values){Connection conn =null;PreparedStatement sta = null;try {//获取连接池ComboPooledDataSource pool = new ComboPooledDataSource();//获取连接conn = pool.getConnection();//预编译sta= conn.prepareStatement(sql);//获取参数的元数据ParameterMetaData pmt = sta.getParameterMetaData();//获取参数的个数int pcount = pmt.getParameterCount();//参数赋值for(int i = 1; i<=pcount;i++){sta.setObject(i, values[i-1]);}//执行更新sta.executeUpdate();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

这就完成了~

优缺点

优点:比较通用

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

BeanUtils 用法相关推荐

  1. 【Java 代码实例 14】BeanUtils用法详解,附源码分析

    目录 一.org.apache.commons.beanutils.BeanUtils简介 二.使用的前置条件 三.添加pom 四.org.apache.commons.beanutils.BeanU ...

  2. (转载)BeanUtils.copyProperties() 用法

    BeanUtils.copyProperties() 用法 标签: hibernateuserjdbc数据库strutsjava 2009-10-17 23:04 35498人阅读 评论(6) 收藏  ...

  3. BeanUtils.copyProperties与PropertyUtils.copyProperties用法及区别

    转自:http://www.cnblogs.com/fayf/articles/1272982.html 一.简介:BeanUtils提供对Java反射和自省API的包装.其主要目的是利用反射机制对J ...

  4. BeanUtils之populate的用法

    BeanUtils之populate的用法 BeanUtils.populate( Object bean, Map properties ), 这个方法会遍历map<key, value> ...

  5. BeanUtils.copyProperties的用法

    前言 org.springframework.beans.BeanUtils,它提供了对java反射和自省API的包装.它里面还有很多工具类,这里我们介绍一下copyProperties. 我们如果有 ...

  6. BeanUtils.copyProperties() 用法

    转载自 https://blog.csdn.net/jdjdndhj/article/details/62056137 第一步: BeanUtils.copyProperties()与Property ...

  7. BeanUtils.populate的用法

    BeanUtils位于org.apache.commons.beanutils.BeanUtils下面,其方法populate的作用解释如下: 完整方法: BeanUtils.populate( Ob ...

  8. BeanUtils.populate()用法

    BeanUtils.populate()源码分析 BeanUtils.populate( user , request.getParameteMap() ) 看完这两篇应该可以对这个方法有一个更深的认 ...

  9. BeanUtils威力和代价

    2019独角兽企业重金招聘Python工程师标准>>> BeanUtils: 威力和代价(转载综合) Apache Jakarta Commons项目非常有用.我曾在许多不同的项目上 ...

  10. 别再用 BeanUtils 了,这款 PO VO DTO 转换神器不香么?

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:toutiao.com/i6891531055631696395 老铁们是不是经常为写一些实体转换的原始代码感到头疼,尤其是实 ...

最新文章

  1. 最简单的前后端分离部署(Koa2)
  2. python类包含对象的个数_python类与对象各个算数运算魔法方法总结
  3. 【系统架构设计师】2020-08-06
  4. Spring框架(二) ---- bean的歧义性
  5. python ui自动化测试框架_Python自动化测试框架
  6. UVA216 ——dfs
  7. Origin使用手册/笔记第一部分:工作表行列操作
  8. 垃圾回收算法与实现系列-JVM无锁实现
  9. 《天天数学》连载34:二月三日
  10. 增强的PolyBase SQL 2019-外部表SQL Server,目录视图和下推式
  11. ELK logstash grok匹配失败存另外的es表
  12. 补丁生成与应用工具 V1.5.4
  13. html调用js文件函数_函数式编程中的战斗机(三)--elm调用javascript的flags方式
  14. IDEA打包jar包及运行jar包命令
  15. kube-proxy 部署
  16. 前端javascript如何分享内容到twitter和Email
  17. android开发流程
  18. NFC应用(二)读写器模式
  19. Could not find  artifact org.pentaho:pentaho-aggdesigner-algorithm:jar:5.1.5-jhyde
  20. 腾讯天美游戏客户端 一面凉经

热门文章

  1. Garmin NUVI C255 固件刷机教程
  2. Docker镜像使用详解
  3. 软件工程造价师和软件造价评估师有什么区别?
  4. 《优化算法》人工鱼群算法学习 超详细解析 附JAVA和matlab示例
  5. Android 自定义车牌键盘
  6. 48 个 Linux 面试问题和答案
  7. 罗技鼠标G304驱动与讲解(其余类型驱动见文末)
  8. (20191123)matlab绘制指定数值的等高线并添加标注+Matlab绘制平行x或y轴或任意直线
  9. STM32G030C8T6跑马灯程序V0.2(四)
  10. 最全TCP/UDP端口号整理