cehkongfu_beanutils-dbutils

合集下载

如何使用DBUtils

如何使用DBUtils

如何使用DBUtils?1.什么是DBUtils?Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,由于JDBC 资源清理非常的繁琐且容易出错,使用它能够简化JDBC应用程序的开发,抽出复杂重复的代码,同时也不会影响程序的性能,便于编程人员进行数据库的操作。

2.DBUtils的优点1)DBUtils对JDBC的编程步骤进行简单的封装,只需要提供连接池对象或者是连接对象即可;2)对于数据表的读操作,它可以把结果转换成List,Array等java对象,便于程序员操作;3)对于数据表的写操作,也变得很简单(只需写sql语句)。

3. DbUtils中的核心组件* QueryRunner,替换了原生jdbc中的语句平台(Statement 以及PreparedStatement),是用来简化SQL语句操作的,可以连接参数,可以有效的防止sql注入。

* ResultSetHandler,这个接口是针对于封装查询结果集的,用于定义select操作后面,怎么样进行封装及结果集。

它还提供了八大结果集实现类,可以保证不管是单行单列、多行多列、单列多行、单行多列都有对应的结果集。

* DbUtils,主要用来释放资源、处理事务。

但需要注意的是DbUtils类是一个工具类,定义了关闭资源与事务处理的方法。

4. 核心组件简介QueryRunner1)QueryRunner(DataSource ds):传入参数为连接池,返回QueryRuner对象2)update(String sql,Object params):执行insert update delete操作(创建,修改,删除等操作)注解:括号内的是sql语句和sql语句当中的问号指定的值3)query(String sql,ResultSetHandler rsh,Object…params):执行select操作注解:ResultSetHandler rsh是用来将查询结果封装成对象简要说明:QueryRunner的update()方法可以用来执行insert、update、delete语句。

ApacheCommonBeanUtils

ApacheCommonBeanUtils

ApacheCommonBeanUtils目前 Commons 简介目前已经开发有release 出来的版本有BeanUtils, Betwixt, CLI, Collections, DBCP, Digester, Discovery, EL, FileUpload, HttpClient, Jelly, Jexl, JXPath, Lang, Latka, Logging, Modeler, Net, Pool, Validator 等等每个版本都不太一样, 随时都有更新的可能, 至于还没有 release 出来正式的版本, 有一些项目, 可能也正在使用了 !! 也是有可能因为其他项目做出来的一些元件, 可以抽出来共用的, 例如目前struts 用的Resources ( Resource bundle component ) , 也被列入 SandBox 研发中, 准备 release 更符合所有项目的组件.jakarta 为何要有 commons 这个 project 出现, 就是希望大家不用重复开发一样的组件, 达到 reusable 的目的 !! 而且他们都有容易使用的特性, 也是各个 jakarta committer 牛人们的精华杰作, 因此, 绝对不能错过这一个open source project !! 各位亲爱的java 同胞们 .................BeanUtils 介绍当我在选择要先介绍哪一个组件, 实在犹豫了很久, 因为每一个实在都是精华, 久久无法做出决定, 所以呢, 只好按照是否 release 再按照字母的先后, 做一个排序, 希望大家明白 ....所谓 BeanUtils 为何要开发呢, 每个工程师或许在写 JavaBean 的时候, 都会乖乖地去写 getters 和 setters, 就是 getXXX() 及 setXXX()methods, 但是当你的 object 是动态产生的, 也许是用文件, 也许是其他原因, 那你该如何去存取数据呢 !!几个例子你可能会用到 BeanUtils, 当然, 这是已经存在的项目了•BSF : Script Language 和 Java Object Model 之间•Velocity/JSP : 使用 template 建立相似的网页•jakarta taglibs/ Struts/ Cocoon: 建立自己特殊的Tag Libraries for JSP 或 XSP•ant build.xml / tomcat server.xml : XML-based 的配置文件( configuration resources )你大可以使用 java api 中的 ng.reflect 及 java.beans 来达到这些数据交换 ~~ 不过呢, 难度有点高 =.="" ,但是, BeanUtils 将会减低你开发的时间 !!目前最新的版本为 1.6.1 (2003/2/18 released),下载位置为Binary & SourceBeanUtils API 介绍BeanUtils 的Java API主要的 package 总共四项mons.beanutilsmons.beanutils.convertersmons.beanutils.localemons.beanutils.locale.converters其实除了第一项之外, 其他的都是后来的版本才加上去的, converters 就是专门处理不同传入的 object 该如何转换, locale 呢,就是为了国际化的处理, 所以重点我都会摆在第一项!!而其中最常用到的 class 是 PropertyUtils 及 ConvertUtils 还有DynaBeans( 有用 struts dynaform 的应该不陌生 )BeanUtils.PropertyUtils 介绍基本上, 我假设大家对JavaBean 的开发都没有问题, 就是对getters 及 setters 都了解是什么. 先假设, Employee classpublic class Employee {public Address getAddress(String type);public void setAddress(String type, Address address);public Employee getSubordinate(int index);public void setSubordinate(int index, Employee subordinate);public String getFirstName();public void setFirstName(String firstName);public String getLastName();public void setLastName(String lastName);}在 PropertyUtils 中会区分为三种 method 状态•Simple - 如果你是用到 primitive 语法, 如 int, String 或其他自行开发的 objects 等等, 只需要单一的对象就可以取得数据••PropertyUtils.getSimpleProperty(Object bean, String name)••PropertyUtils.setSimpleProperty(Object bean, String name, Object value)••Employee employee = ...;String firstName = (String)PropertyUtils.getSimpleProperty(employee, "firstName");String lastName = (String)PropertyUtils.getSimpleProperty(employee, "lastName");.............PropertyUtils.setSimpleProperty(employee, "firstName", firstName);PropertyUtils.setSimpleProperty(employee, "lastName", lastName);•Indexed - 如果你是用到Collection 或List 实作出来的objects , 只需要使用一个 index 数值就可以取得对象的状态••PropertyUtils.getIndexedProperty(Object bean, String name)••PropertyUtils.getIndexedProperty(Object bean, String name, int index)••PropertyUtils.setIndexedProperty(Object bean, String name, Object value)••PropertyUtils.setIndexedProperty(Object bean, String name, int index, Object value)••Employee employee = ...;int index = ...;String name = "subordinate[" + index + "]";Employee subordinate = (Employee)PropertyUtils.getIndexedProperty(employee, name);Employee employee = ...;int index = ...;Employee subordinate = (Employee)PropertyUtils.getIndexedProperty(employee, "subordinate", index);•Mapped - 如果你是用到 Map 延伸出來的 objects , 只需要使用一个 key 值就可以取得数据••PropertyUtils.getMappedProperty(Object bean, String name)••PropertyUtils.getMappedProperty(Object bean, String name, String key)••PropertyUtils.setMappedProperty(Object bean, String name, Object value)••PropertyUtils.setMappedProperty(Object bean, String name, String key, Object value)••Employee employee = ...;Address address = ...;PropertyUtils.setMappedProperty(employee, "address(home)", address);Employee employee = ...;Address address = ...;PropertyUtils.setMappedProperty(employee, "address", "home", address);但是如果你是巢状(nested)的数据结构, 你该如何取得你要的数据呢PropertyUtils.getNestedProperty(Object bean, String name)PropertyUtils.setNestedProperty(Object bean, String name, Object value)你只需要简单地使用 ".", 就可以得到你要的数据了String city = (String)PropertyUtils.getNestedProperty(employee,"address(home).city");千万要记住, BeanUtils 是要让你随心所欲使用, 所以呢 index ,mapped 当然都可以这样使用Employee employee = ...;String city = (String) PropertyUtils.getProperty(employee,"subordinate[3].address(home).city");BeanUtils.DynaBean and BeanUtils.DynaClass 介绍所有的 Dynamic JavaBean 都是实现 DynaBean 或 DynaClass 这两个interface, 也可能会用到DynaProperty class 来存取properties . 我们为何要用到 Dynamic JavaBean 呢, 例如, 你从数据库取出来的数据, 有时候可能是三个栏位, 有时候是四个栏位, 如果我们对于每个Bean 都要去写一个class, 就会很累, 所以对于每一种javabean 我们就设定他的属性有哪些, 接着就可以使用 PropertyUtils 来将他的数值取出, 如此, 可以减少很多开发工时. 在 Struts 的课程中, 很多人问到我, 请问每一个 ActionForm 都必须写成 java 文件吗, 当然, 不需要的, 否则一个网页一个 ActionForm ( 假设都不一样 ), 那么, 这么浪费时间的工作, 为何还要使用 Struts 来作为 Framework 呢, 所以我们都是使用 org.apache.struts.action.DynaActionForm!!MutableDynaClass ( since $1.5 ) 这是蛮新的一个 DynaClass, 是为了动态可以调整 properties !•BasicDynaBean and BasicDynaClass - 基本的 Dynamic 类型••BasicDynaClass(ng.String name, ng.Class dynaBeanClass, DynaProperty[] properties)••BasicDynaBean(DynaClass dynaClass)••DynaProperty[] props = new DynaProperty[]{new DynaProperty("address", java.util.Map.class),new DynaProperty("subordinate", mypackage.Employee[].class),new DynaProperty("firstName", String.class),new DynaProperty("lastName", String.class)};BasicDynaClass dynaClass = new BasicDynaClass("employee", null, props);DynaBean employee = dynaClass.newInstance();employee.set("address", new HashMap());employee.set("subordinate", new mypackage.Employee[0]);employee.set("firstName", "Fred");employee.set("lastName", "Flintstone");•ResultSetDynaClass (Wraps ResultSet in DynaBeans) - 使用 ResultSet 的 Dynamic JavaBean••ResultSetDynaClass(java.sql.ResultSet resultSet)••ResultSetDynaClass(java.sql.ResultSet resultSet, boolean lowerCase)••如果 lowerCase 设为 false , 返回的数据栏位名将根据 JDBC 返回的为准. default 为 true.Connection conn = ...;Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery("select account_id, name from customers");Iterator rows = (new ResultSetDynaClass(rs)).iterator();while (rows.hasNext()) {DynaBean row = (DynaBean) rows.next();System.out.println("Account number is " +row.get("account_id") +" and name is " + row.get("name"));}rs.close();stmt.close();•RowSetDynaClass (Disconnected ResultSet as DynaBeans) - 使用 RowSet 的 Dynamic JavaBean••RowSetDynaClass(java.sql.ResultSet resultSet)••RowSetDynaClass(java.sql.ResultSet resultSet, boolean lowerCase)••如果 lowerCase 设为 false , 返回的数据栏位名将根据 JDBC 返回的为准. default 为 true.••Connection conn = ...; // Acquire connection from pool Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery("SELECT ...");RowSetDynaClass rsdc = new RowSetDynaClass(rs);rs.close();stmt.close();...; // Return connection to poolList rows = rsdc.getRows();...; // Process the rows as desired•WrapDynaBean and WrapDynaClass - 包装过的Dynamic JavaBean••如果你对于 DynaBean 的功能强大, 非常佩服的同时, 手边的JavaBean 又不能随随便便就不用那你就把他包装起来 ....••••WrapDynaClass(ng.Class beanClass)••WrapDynaBean(ng.Object instance)••ConvertingWrapDynaBean(ng.Object instance) ••MyBean bean = ...;DynaBean wrapper = new WrapDynaBean(bean);String firstName = wrapper.get("firstName");BeanUtils.ConvertUtils 介绍在很多情况, 例如struts framework 中, 就常常用到request.getParameter 的参数, 需要转换成正确的数据类型, 所以ConvertUtils 就是来处理这些动作.ConvertUtils().convert(ng.Object value)ConvertUtils().convert(ng.String[] values, ng.Class clazz)ConvertUtils().convert(ng.String value, ng.Class clazz)HttpServletRequest request = ...;MyBean bean = ...;HashMap map = new HashMap();Enumeration names = request.getParameterNames();while (names.hasMoreElements()) {String name = (String) names.nextElement();map.put(name, request.getParameterValues(name));}BeanUtils.populate(bean, map);// it will use ConvertUtils for convertings目前支持的类型有•ng.BigDecimal•ng.BigInteger•boolean and ng.Boolean•byte and ng.Byte•char and ng.Character•ng.Class•double and ng.Double•float and ng.Float•int and ng.Integer•long and ng.Long•short and ng.Short•ng.String•java.sql.Date•java.sql.Time•java.sql.Timestamp也可以建立自己的 converterConverter myConverter =newmons.beanutils.converter.IntegerConverter();ConvertUtils.register(myConverter, Integer.TYPE); // Native typeConvertUtils.register(myConverter, Integer.class); //Wrapper class。

兄弟连_马剑威_JavaWeb_028_开源工具DbUtils的使用

兄弟连_马剑威_JavaWeb_028_开源工具DbUtils的使用

第讲:开源具的使用第28讲:开源工具DbUtils的使用课程大纲•1、DbUtils简介•2、更新操作•3、查询操作1、DBUtils简介•DBUtils是apache下的一个小巧的JDBC轻量级封装的工具包,其最核心的特性是结果集的封装,可以直接将查询出来的结果集封装成JavaBean,这就为我们做了最枯燥乏味、最容易出错的一大部分工作。

•下载地址:•/proper/commons-dbutils/download_dbutils.cgi2、更新操作•QueryRunner类•runner.update("delete from user where userName=?","用户名");••int rowEffects = runner.update("insert into user(userName,password,comment) values(?,?,?)", "用户名","密码","备注");3、查询操作•//返回bean•User user = runner.query("select * from user where userId=?", 1,new BeanHandler<User>(User.class));•//返回beanlist•System.out.println("返回BeanList结果......");•List<User> beanListResult =•runner.query("select * from user",())•new BeanListHandler(User.class));3、查询操作•//返回一个值•Object increaseId=runner.query("select last_insert_id()", new ScalarHandler());THANKYOU!微信号:weige-java扫一扫,关注威哥微信公众平台。

commons-dbutils使用介绍,commons-dbutils是JDBC的替代品

commons-dbutils使用介绍,commons-dbutils是JDBC的替代品

commons-dbutils使⽤介绍,commons-dbutils是JDBC的替代品commons-dbutils是Apache开源组织提供的⽤于操作数据库的⼯具包。

今天为⼤家介绍⼀下该包的常⽤⽅法。

对于数据库的操作⽆外乎增删改查,⽽增删改本质上可以归为⼀类,操作⽅式相同,只是SQL语法不同⽽已,所以我将以修改和查询两类来介绍commons-dbutils的⽤法。

⾸先我们来创建⼀个测试类,使⽤JUnit进⾏测试。

import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import mons.dbutils.DbUtils;import mons.dbutils.QueryRunner;import org.junit.After;import org.junit.Before;import org.junit.Test;public class DBUtilsTest{private Connection conn = null;@Beforepublic void initConnection() throws SQLException, ClassNotFoundException{printCurrentMethodName();Class.forName("org.h2.Driver");conn = DriverManager.getConnection("jdbc:h2:h2.db", "test", "123");}@Beforepublic void initDatabase() throws SQLException{printCurrentMethodName();QueryRunner runner = new QueryRunner();runner.update(conn,"CREATE TABLE IF NOT EXISTS USER_INFO (userId VARCHAR(20) PRIMARY KEY, userName VARCHAR(50))");}@Afterpublic void destory(){printCurrentMethodName();DbUtils.closeQuietly(conn);}/*** 打印当前运⾏⽅法名称*/public void printCurrentMethodName(){System.out.println(Thread.currentThread().getStackTrace()[2].getMethodName());System.out.println("==================================================");}}在这段测试代码中,我们是⽤h2作为数据库进⾏测试以及定义了⼀些连接、数据库的初始化及销毁的⽅法。

利用Spring 对Apache Common BeanUtil进行定制 - slaser...

利用Spring 对Apache Common BeanUtil进行定制 - slaser...

利用Spring 对Apache Common BeanUtil进行定制- slaser...Apache BeanUtil简介。

Apache Common BeanUtil是一个常用的在对象之间复制数据的工具类,著名的web开发框架struts就是依赖于它进行ActionForm的创建。

BeanUtil最常用的类是mons.beanutils.BeanUtils。

BeanUtils最常用的方法为: 1. public voidcopyProperties(ng.Object dest, ng.Object orig) 把orig中的值copy到dest中. 2. public java.util.Map describe(ng.Object bean) 把Bean的属性值放入到一个Map里面。

3. public void populate(ng.Object bean, java.util.Map properties) 把properties里面的值放入bean中。

4. public void setProperty(ng.Object bean,ng.String name, ng.Object value) 设置Bean对象的名称为name的property的值为value. 5. public String getProperty(ng.Object bean, ng.String name) 取得bean对象中名为name的属性的值。

详细的使用方法可以参见官方网站:/commons/beanutils/ Apache Common BeanUtil的常见使用场景。

&lt;!--[if !supportLists]--&gt;1. &lt;!--[endif]--&gt;同类之间不同对象要求进行数据复制。

User user1 = &#8230;; User user2 = &#8230;;BeanUtils.copyProperties(user2,user1);&lt;!--[if !supportLists]--&gt;2.&lt;!--[endif]--&gt;不同类不同对象之间的数据复制。

BeanUtils

BeanUtils

1. 概述第一次接触BeanUtils是在学习Struts的过程中,在Struts中它被大量用于处理FormBean。

BeanUtils主要提供了对于JavaBean进行各种操作,BeanUtils一共分4个包:Ø mons.beanutilsØ mons.beanutils.convertersØ mons.beanutils.localeØ mons.beanutils.locale.converters其中上面两个是BeanUtils的默认实现,它没有针对本地化的任何处理,这个可以提高执行效率。

但是若你的程序对于本地化有要求的话,那还是使用下面2个包比较安全。

2. mons.beanutils这个包主要提供用于操作JavaBean的工具类,Jakarta-Common-BeanUtils 的主要功能都在这个包里实现。

下面分别介绍几个主要的工具类:2.1.BeanUtil1、首先,我先定义一个JavaBean作为之后例子的操作对象。

public class Company{private String name;private HashMap address = new HashMap();private String[] otherInfo;private ArrayList product;private ArrayList employee;private HashMap telephone;public Company(){}public String getName(){return name;}public void setName(String name){ = name;}public String getAddress(String type){return address.get(type).toString();}public void setAddress(String type, String address) {this.address.put(type,address);}public String[] getOtherInfo(){return otherInfo;}public void setOtherInfo(String[] otherInfo){this.otherInfo = otherInfo;public ArrayList getProduct(){return product;}public void setProduct(ArrayList product) {this.product = product;}public ArrayList getEmployee(){return employee;}public void setEmployee(ArrayList employee) {this.employee = employee;}public HashMap getTelephone(){return telephone;}public void setTelephone(HashMap telephone) {this.telephone = telephone;}2、BeanUtils可以直接get和set一个属性的值。

ApacheBeanUtils与SpringBeanUtils性能比较

ApacheBeanUtils与SpringBeanUtils性能比较

ApacheBeanUtils与SpringBeanUtils性能⽐较在我们实际项⽬开发过程中,我们经常需要将不同的两个对象实例进⾏属性复制,从⽽基于源对象的属性信息进⾏后续操作,⽽不改变源对象的属性信息,⽐如DTO数据传输对象和数据对象DO,我们需要将DO对象进⾏属性复制到DTO,但是对象格式⼜不⼀样,所以我们需要编写映射代码将对象中的属性值从⼀种类型转换成另⼀种类型。

对象拷贝在具体介绍两种 BeanUtils 之前,先来补充⼀些基础知识。

它们两种⼯具本质上就是对象拷贝⼯具,⽽对象拷贝⼜分为深拷贝和浅拷贝,下⾯进⾏详细解释。

什么是浅拷贝和深拷贝在Java中,除了基本数据类型之外,还存在类的实例对象这个引⽤数据类型,⽽⼀般使⽤ “=”号做赋值操作的时候,对于基本数据类型,实际上是拷贝的它的值,但是对于对象⽽⾔,其实赋值的只是这个对象的引⽤,将原对象的引⽤传递过去,他们实际还是指向的同⼀个对象。

⽽浅拷贝和深拷贝就是在这个基础上做的区分,如果在拷贝这个对象的时候,只对基本数据类型进⾏了拷贝,⽽对引⽤数据类型只是进⾏引⽤的传递,⽽没有真实的创建⼀个新的对象,则认为是浅拷贝。

反之,在对引⽤数据类型进⾏拷贝的时候,创建了⼀个新的对象,并且复制其内的成员变量,则认为是深拷贝。

简单来说:浅拷贝:对基本数据类型进⾏值传递,对引⽤数据类型进⾏引⽤传递般的拷贝,此为浅拷贝深拷贝:对基本数据类型进⾏值传递,对引⽤数据类型,创建⼀个新的对象,并复制其内容,此为深拷贝。

BeanUtils前⾯简单讲了⼀下对象拷贝的⼀些知识,下⾯就来具体看下两种 BeanUtils ⼯具Apache 的 BeanUtils⾸先来看⼀个⾮常简单的BeanUtils的例⼦publicclass PersonSource {private Integer id;private String username;private String password;private Integer age;// getters/setters omiited}publicclass PersonDest {private Integer id;private String username;private Integer age;// getters/setters omiited}publicclass TestApacheBeanUtils {public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {//下⾯只是⽤于单独测试PersonSource personSource = new PersonSource(1, "pjmike", "12345", 21);PersonDest personDest = new PersonDest();BeanUtils.copyProperties(personDest,personSource);System.out.println("persondest: "+personDest);}}persondest: PersonDest{id=1, username='pjmike', age=21}从上⾯的例⼦可以看出,对象拷贝⾮常简单,BeanUtils最常⽤的⽅法就是://将源对象中的值拷贝到⽬标对象//将源对象中的值拷贝到⽬标对象public static void copyProperties(Object dest, Object orig) throws IllegalAccessException, InvocationTargetException {BeanUtilsBean.getInstance().copyProperties(dest, orig);}默认情况下,使⽤mons.beanutils.BeanUtils对复杂对象的复制是引⽤,这是⼀种浅拷贝关注公众号程序员⼩乐回复关键字“offer”获取算法⾯试题和答案。

Apache_Commons_DbUtils_快速上手

Apache_Commons_DbUtils_快速上手

/advance/796954_3.htmlHibernate太复杂,iBatis不好用,JDBC代码太垃圾,DBUtils在简单与优美之间取得了完美平衡。

一、概述DbUtils小巧的Java数据库操作工具,它在JDBC的基础上做了科学的封装,旨在简化JDBC代码混乱与重复。

对于JDBC代码,存在很多问题,算是对Java的批判:1、操作过程复杂,代码操作一个模式,大量的重复。

2、结果集难以处理,拿到一个ResultSet干屁啊,一个一个度,转称JavaBean,后来形成List,太麻烦了。

3、到处都强制检查SQLException,烦不烦啊,影响代码的美观和可读性。

当然,以上的批判不是说JDBC设计不合理,二是缺乏更高层操作API的支持。

因此才产生了众多的开源数据库操作的框架和工具包。

二、熟悉DBUtils的API针对DBUitlsAPI的包,做个简单的翻译,以便迅速掌握API的使用。

1、------------------------------------包mons.dbutilsDbUtils是一个为简化JDBC操作的小类库。

接口摘要ResultSetHandler 将ResultSet转换为别的对象的工具。

RowProcessor 将ResultSet行转换为别的对象的工具。

类摘要BasicRowProcessor - RowProcessor接口的基本实现类。

BeanProcessor - BeanProcessor匹配列名到Bean属性名,并转换结果集列到Bean对象的属性中。

DbUtils 一个JDBC辅助工具集合。

ProxyFactory 产生JDBC接口的代理实现。

QueryLoader 属性文件加载器,主要用于加载属性文件中的 SQL 到内存中。

QueryRunner 使用可插拔的策略执行SQL查询并处理结果集。

ResultSetIterator 包装结果集为一个迭代器。

2、------------------------------------包mons.dbutils.handlers-------ResultSetHandler接口的实现类类摘要AbstractListHandler 将ResultSet转为List的抽象类ArrayHandler 将ResultSet转为一个Object[]的ResultSetHandler实现类ArrayListHandler 将ResultSet转换为List<Object[]>的ResultSetHandler实现类BeanHandler 将ResultSet行转换为一个JavaBean的ResultSetHandler实现类BeanListHandler 将ResultSet转换为List<JavaBean>的ResultSetHandler实现类ColumnListHandler 将ResultSet的一个列转换为List<Object>的ResultSetHandler实现类KeyedHandler 将ResultSet转换为Map<Map>的ResultSetHandler实现类MapHandler 将ResultSet的首行转换为一个Map的ResultSetHandler实现类MapListHandler 将ResultSet转换为List<Map>的ResultSetHandler实现类ScalarHandler 将ResultSet的一个列到一个对象。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

利用Jakarta Commons组件beanutils、dbutils简化JDBC数据库操作一、dbutils、beanutils包简介commons-dbutils是一个非常小的类包,无需花费太多时间去阅读它的doc,核心只是两个类mons.dbutils.DbUtils、mons.dbutils.QueryRunner和一个接口mons.dbutils.ResultSetHandler。

DbUtils类DbUtils是一个用来做一些如关闭连接、装载JDBC驱动程序之类的常规工作提供有用方法的类,它里面所有的方法都是静态的。

这个类里的重要方法有:⏹public static void close(…) throws java.sql.SQLException:DbUtils类提供了三个重载的关闭方法。

这些方法检查所提供的参数是不是NULL,如果不是的话,它们就关闭Connection、Statement和ResultSet。

⏹public static void closeQuietly(…): 这一类方法不仅能在Connection、Statement和ResultSet为NULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLEeception。

如果你不想捕捉这些异常的话,这对你是非常有用的。

在重载CloseQuietly方法时,特别有用的一个方法是closeQuietly(Connection conn,Statementstmt,ResultSet rs),这是因为在大多数情况下,连接、声明和结果集(ResultSet)是你要用的三样东西,而且在最后的块你必须关闭它们。

使用这一方法,你最后的块就可以只需要调用这一方法即可。

⏹public static void CommitAndCloseQuietly(Connection conn):这一方法用来提交连接,然后关闭连接,并且在关闭连接时不向上抛出在关闭时发生的一些SQL异常。

⏹public static boolean loadDriver(ng.String driverClassName):这一方法装载并注册JDBC驱动程序,如果成功就返回true。

使用这种方法,你不需要去捕捉这个异常ClassNotFoundException。

QueryRunner类这个类简单化了执行SQL查询,它与ResultSetHandler组合在一起使用就可能完成大部分的数据库操作,它能够大大减少你所的编码量。

QueryRunner类提供了两个构造方法:一个是默认的构造方法;另一个需要一个javax.sql.DataSource 来作为参数。

因此,在你不用为一个方法提供一个数据库连接的情况下,提供给构造器的DataSource)被用来获得一个新的连接并将继续进行下去。

这个类中的重要方法包括以下这些:⏹public Object query(Connection conn, String sql, Object[] params, ResultSetHandlerrsh) throws SQLException:执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。

该方法它会内在地处理PreparedStatement 和ResultSet 的创建和关闭。

最重要的是参数ResultSetHandler会把从ResultSet中获得的数据转换成一个更容易的或是应用程序特定的格式供我们使用。

⏹public Object query(String sql, Object[] params, ResultSetHandler rsh) throwsSQLException:这几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造方法的数据源(DataSource) 或使用的setDataSource 方法中重新获得的。

⏹public Object query(Connection conn, String sql, ResultSetHandler rsh) throwsSQLException :执行一个不需要置换参数的查询操作。

⏹public int update(Connection conn, String sql, Object[] params) throws SQLException:用来执行一个更新(插入、更新或删除)操作。

⏹public int update(Connection conn, String sql) throws SQLException:用来执行一个更新操作,不需要置换参数。

ResultSetHandler接口正如它的名字所提示的,这一接口执行处理一个jaca.sql.ResultSet,将数据按要求转换为另一种形式。

ResultSetHandler接口提供了一个单独的方法:Object handle (java.sql.ResultSet .rs)。

因此任何ResultSetHandler 的执行需要一个结果集(ResultSet)作为参数传入,然后才能处理这个结果集,再返回一个对象。

因为返回类型是ng.Object,所以除了不能返回一个原始的Java类型之外,其它的返回类型并没有什么限制。

common-dbutils组件包针对这个接口提供了九个实现类:⏹ArrayHandler:把结果集中的第一行数据转成对象数组。

⏹ArrayListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到List中。

⏹BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。

⏹BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。

⏹ColumnListHandler:将结果集中某一列的数据存放到List中。

⏹KeyedHandler:将结果集中的每一行数据都封装到一个Map里,然后再根据指定的key把每个Map再存放到一个Map里。

⏹MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。

⏹MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List⏹ScalarHandler:将结果集中某一条记录的其中某一列的数据存成Object如果这九个实现类中没有任何一个提供了你想要的服务,你可以自己写一个实现类。

其它类和接口mons.dbutils.QueryLoader类:属性文件加载器,主要用于加载属性文件中的SQL到内存中。

mons.dbutils.wrappers.SqlNullCheckedResultSet类:这个类是用来对sql语句执行完成之后的的数值进行null的替换。

mons.dbutils.wrappers.StringTrimmedResultSet类:去除ResultSet中字段的左右空格。

mons.dbutils.RowProcessor接口:它提供了把结果集的行数据转换成其它格式的功能。

它的实现类是mons.dbutils.BasicRowProcessor类。

二、实例数据准备(oracle):create table book (id number(16) primary key,title varchar2(32),authors varchar2(32));insert into book (ID, TITLE, AUTHORS) values (1, 'javase', '李刚');insert into book (ID, TITLE, AUTHORS) values (2, 'spring', 'rod jhonson');insert into book (ID, TITLE, AUTHORS) values (3, 'oracle', 'lary alison');--------------------------------------------------------------------------------------book.javapackage my.ceh.dbutil_beanutil;public class Book {public int id;public String title;public String authors ;public String getAuthors() {return authors;}public void setAuthors(String authors) {this.authors = authors;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}}BeanutilJDBCTest.javapackage my.ceh.dbutil_beanutil;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Iterator;import java.util.List;import java.util.Map;import mons.beanutils.DynaBean;import mons.beanutils.PropertyUtils;import mons.beanutils.ResultSetDynaClass; import mons.beanutils.RowSetDynaClass;import mons.dbutils.DbUtils;import mons.dbutils.QueryRunner;import mons.dbutils.handlers.BeanListHandler; import mons.dbutils.handlers.MapListHandler;public class BeanutilsJDBCTest {public static void main(String[] args) {BeanutilsJDBCTest test = new BeanutilsJDBCTest();System.out.println("----------test1()-----------");test.test1();System.out.println("----------test2()-----------");test.test2();System.out.println("----------test3()-----------");test.test3();System.out.println("----------test4()-----------");test.test4();}public void test1() {// TODO Auto-generated method stubConnection con = null;Statement st = null;ResultSet rs = null;try {Class.forName("oracle.jdbc.driver.OracleDriver");String url = "jdbc:oracle:thin:@localhost:1521:orcl";con = DriverManager.getConnection(url, "cehkongfu", "cehkongfu");st = con.createStatement();rs = st.executeQuery("select * from book");ResultSetDynaClass rsDynaClass = new ResultSetDynaClass(rs);while (itr.hasNext()) {DynaBean dBean = (DynaBean) itr.next();System.out.println(PropertyUtils.getSimpleProperty(dBean, "title")+ "-------"+ PropertyUtils.getSimpleProperty(dBean, "authors"));}} catch (Exception e) {e.printStackTrace();} finally {try {if (rs != null) {rs.close();}if (st != null) {st.close();}if (con != null) {con.close();}} catch (Exception e) {e.printStackTrace();}}}public void test2() {// TODO Auto-generated method stubConnection con = null;Statement st = null;ResultSet rs = null;try {Class.forName("oracle.jdbc.driver.OracleDriver");String url = "jdbc:oracle:thin:@localhost:1521:orcl";con = DriverManager.getConnection(url, "cehkongfu", "cehkongfu");st = con.createStatement();rs = st.executeQuery("select * from book");RowSetDynaClass rsdc = new RowSetDynaClass(rs);List rsDynaClass = rsdc.getRows();System.out.println("title ------------- authors ");Iterator itr = rsDynaClass.iterator();while (itr.hasNext()) {DynaBean dBean = (DynaBean) itr.next();try {System.out.println(PropertyUtils.getSimpleProperty(dBean, "title")+ "-----"+PropertyUtils.getSimpleProperty(dBean, "authors"));} catch (Exception e) {// TODO自动生成 catch 块e.printStackTrace();}}} catch (Exception e) {} finally {try {if (rs != null) {rs.close();}if (st != null) {st.close();}if (con != null) {con.close();}} catch (Exception e) {e.printStackTrace();}}}public void test3() {// TODO Auto-generated method stubConnection conn = null;String jdbcURL = "jdbc:oracle:thin:@localhost:1521:orcl";String jdbcDriver = "oracle.jdbc.driver.OracleDriver";try {DbUtils.loadDriver(jdbcDriver);// Username "root". Password "root"conn = DriverManager.getConnection(jdbcURL, "cehkongfu","cehkongfu");QueryRunner qRunner = new QueryRunner();System.out.println("***Using MapListHandler***");// 以下部分代码采用Map存储方式,可以采用Bean的方式代替进行处理List lMap = (List) qRunner.query(conn,"select title,authors from book", new MapListHandler());// 以下是处理代码,可以抽取出来System.out.println("title ------------- authors ");for (int i = 0; i < lMap.size(); i++) {Map vals = (Map) lMap.get(i);System.out.println(vals.get("title")+ "-------------"+ vals.get("authors"));}} catch (SQLException ex) {} finally {DbUtils.closeQuietly(conn);}}public void test4() {// TODO Auto-generated method stubConnection conn = null;String jdbcURL = "jdbc:oracle:thin:@localhost:1521:orcl";String jdbcDriver = "oracle.jdbc.driver.OracleDriver";try {DbUtils.loadDriver(jdbcDriver);conn = DriverManager.getConnection(jdbcURL, "cehkongfu", "cehkongfu");QueryRunner qRunner = new QueryRunner();System.out.println("***Using BeanListHandler ***");// 以下部分代码采用Map存储方式,可以采用Bean的方式代替进行处理List lBeans = (List) qRunner.query(conn," select title,authors from book ",new BeanListHandler( Book.class));// 以下是处理代码,可以抽取出来System.out.println("title ------------- authors ");for (int i = 0; i < lBeans.size(); i++) {Book vals = (Book) lBeans.get(i);System.out.println(vals.getTitle()+ "-------------"+ vals.getAuthors());}} catch (SQLException ex) {ex.printStackTrace();} finally {DbUtils.closeQuietly(conn);}}}。

相关文档
最新文档