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

    @Test
public 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,Float
BeanUtils.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对象中

@Test
public 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中

@Test
public 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对象中获取

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

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

获取数据库的元数据

    @Test
public 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 block
e.printStackTrace();
}
}

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

获取参数元数据

    PreparedStatement sta=null;
Connection conn=null;
@Test
public void Test2()
{
//获取连接池
ComboPooledDataSource pool = new ComboPooledDataSource();
try {
//获取连接
conn = pool.getConnection();
//准备SQL语句
String sql ="insert into student(sid,sname) values(?,?)";
//获得Statement
sta = 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 block
e.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 block
e.printStackTrace();
}
}
}
}
}

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

获取结果集的元数据

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

    @Test
public 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 block
e.printStackTrace();
} }

这就完成了~

优缺点

优点:比较通用

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

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. python Popen卡死问题

    程序经常卡死,定位了半天才定位到原因,原来是Popen导致的卡死: 程序如下: s = subprocess.Popen([*,*,*], stdout=subprocess.PIPE) ret = ...

  2. WebService和Http的POST和GET请求区别和示例

    web service(SOAP) Webservice的一个最基本的目的就是提供在各个不同平台的不同应用系统的协同工作能力.Web service 就是一个应用程序,它向外界暴露出一个能够通过Web ...

  3. Spark记录-源码编译spark2.2.0(结合Hive on Spark/Hive on MR2/Spark on Yarn)

    #spark2.2.0源码编译 #组件:mvn-3.3.9 jdk-1.8 #wget http://mirror.bit.edu.cn/apache/spark/spark-2.2.0/spark- ...

  4. 关于css中a标签的样式

    CSS为一些特殊效果准备了特定的工具,我们称之为“伪类”.其中有几项是我们经常用到的,下面我们就详细介绍一下经常用于定义链接样式的四个伪类,它们分别是: :link :visited :hover : ...

  5. 使用WebHelper调用Asp.net WebAPI

    1.WebHelper using System; using System.Collections.Generic; using System.Collections.Specialized; us ...

  6. 移动端手势库hammerJS 2.0.4官方文档翻译(转)

    hammerJS是一个优秀的.轻量级的触屏设备手势库,现在已经更新到2.04版本,跟1.0版本有点天壤地别了,毕竟改写了事件名并新增了许多方法,允许同时监听多个手势.自定义识别器,也可以识别滑动方向. ...

  7. [转载]10款流行的Markdown编辑器

    10款流行的Markdown编辑器 http://www.csdn.net/article/2014-05-05/2819623 作为一个开源人,如果你不会使用Markdown语法,那你就OUT了!M ...

  8. JavaScript编写风格指南 (二)

    七:注释 // 频繁的使用注释有助于他人理解你的代码// 1.代码晦涩难懂// 2.可能被误认为是错误的代码// 3.必要但不明显的针对特定浏览器的代码// 4.对于对象,方法或者属性,生成文档是有必 ...

  9. 20155306 2016-2017-2 《Java程序设计》第八周学习总结

    20155306 2016-2017-2 <Java程序设计>第八周学习总结 教材学习内容总结 第十五章 通用API 15.1 日志 java.util.loggging包提供了日志功能相 ...

  10. 20155218 2006-2007-2 《Java程序设计》第5周学习总结

    20155218 2006-2007-2 <Java程序设计>第5周学习总结 教材学习内容总结 java中的错误都会被包装成对象,且是可抛出的. 通常称错误处理为异常处理,程序设计本身的错 ...