一、介绍:
ommons-dbutils是Apache 组织提供的一个开源 JDBC 工具类库,对传统操作数据库的类进行二次封装,可以把结果集转化成List。
二、几个重要的包
1. org.apache.commons.dbutils (该包中的类主要帮助我们更便捷的操作JDBC)
2. org.apache.commons.dbutils.handlers(该包中的类都是实现org.apache.commons.dbutils.ResultSetHandler接口的实现类)
3. org.apache.commons.dbutils.wrappers(该包中的类主要是封装了对Sql结果集的操作)
三、使用这个DbUtils的一些优势:
1. 防止了资源的泄露,写一段JDBC的准备代码其实并不麻烦,但是那些操作确实是
十分耗时和繁琐的,也会导致有时候数据库连接忘记关闭了导致异常难以追踪。
2. 干净整洁的持久化代码,把数据持久化到数据库的代码被打打削减,剩下的代码
能够清晰简洁的表达你的操作目的。
3. 自动把ResultSets中的工具映射到JavaBean中,你不需要手动的使用Setter方法
将列值一个个赋予相应的时日,Resultset中的每一个行都大表一个完成的
Bean实体。
四、Commonsdbutils主要相关类及接口的简介:
主要讲解两个类
org.apache.commons.dbutils.DbUtils和
org.apache.commons.dbutils.QueryRunner
一个接口
org.apache.commons.dbutils.ResultSethandler
2.1:DbUtils类
为做一些诸如关闭连接、装载JDBC驱动程序之类的常规工作提供有用方法的类,
它里面所有的方法都是静态的。
A:loadDriver(StringdriveClassName): 这一方法装载并注册JDBC驱动程序,
如果成功就返回TRUE,不需要去捕捉 ClassNotFoundException异常。通过返回
值判断驱动程序是否加载成功。
B:close方法:DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的
参数是不是NULL,如果不是的话,它们就关闭连接 (Connection)、声明
(Statement)或者结果集(ResultSet)对象。
C:closeQuietly方法: closeQuietly这一方法不仅能在连接、声明或者结果集
为NULL情况下避免关闭,还能隐藏一些在程序中抛出 的SQLException。如果你
不想捕捉这些异常的话,这对你是非常有用的。在重载closeQuietly方法时,
特别有用的一个方法是 closeQuietly(Connection conn,Statement stmt,
ResultSet rs),使用这一方法,你最后的块就可以只需要调用这一方法即可。
D: commitAndCloseQuietly(Connection conn)方法和
commitAndClose (Connection conn)方法:这两个方法用来提交连接,然后关
闭连接,不同的是commitAndCloseQuietly(Connection conn)方法关闭连接时
不向上抛出在关闭时发生的一些SQL异常而commitAndClose (Connection conn)
方法向上抛出SQL异常。
2.2:QueryRunner类
该类简单化了 SQL 查询,它与 ResultSetHandler(接口 后面将会介绍) 组
合在一起使用可以完成大部分的数据库操作,能够大大减少编码量
【构造函数(1):QueryRunner() (2):QueryRunner(Datasource ds)】。
A:query(Connectionconn, String sql, Object[] params, ResultSetHandler rsh)
方法:这一方法执行一个带参数的选择查询,在这个查询中,对象阵列的值被用来作为
查询的置换参数。这一方法内在地处理 PreparedStatement 和ResultSet 的创建和关
闭。ResultSetHandler对象把从 ResultSet得来的数据转变成一个更容易的或是应用
程序特定的格式来使用。
B:query(Stringsql, Object[] params, ResultSetHandler rsh)方法:这几乎与第
一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构
造器的数据源(DataSource) 或使用的setDataSource 方法中重新获得的。
C:query(Connectionconn, String sql, ResultSetHandler rsh)方法:这执行一个
带参数的选择查询。
D:update(Connectionconn, String sql, Object[] params)方法:这一方法被用来
执行一个带参数的插入、更新或删除操作。对象阵列为声明保存着置换参数。
E:update(String sql, Object[] params)方法: 这几乎与上一种种方法一样;
唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造器的数
据源(DataSource) 或使用的setDataSource 方法中重新获得的。
F:update(Connectionconn, String sql)方法:这执行一个带参数的插入、
更新或删除操作。
2.3:ResultSetHandler接口
正如它的名字所示,这一接口执行处理一个java.sql.ResultSet,将数据转变
并处理为任何一种形式,这样有益于其应用而且使用起来更容易。这一组件提供了
ArrayHandler :将ResultSet中第一行的数据转化成对象数组
ArrayListHandler将ResultSet中所有的数据转化成List,List中存放的是Object[]
BeanHandler :将ResultSet中第一行的数据转化成类对象
BeanListHandler :将ResultSet中所有的数据转化成List,List中存放的是类对象
ColumnListHandler :将ResultSet中某一列的数据存成List,List中存放的是Object对象
KeyedHandler :将ResultSet中存成映射,key为某一列对应为Map。Map中存放的是数据
MapHandler :将ResultSet中第一行的数据存成Map映射
MapListHandler :将ResultSet中所有的数据存成List。List中存放的是Map
ScalarHandler :将ResultSet中一条记录的其中某一列的数据存成Object等转化类。
ResultSetHandler接口提供了一个单独的方法:
Object handle(java.sql.ResultSet .rs)。因此任何ResultSetHandler
的执行需要一个结果集(ResultSet)作为参数传入,然后才能处理这个结果集,
再返回一个对象。因为返回类型是java.lang.Object,所以除了不能返回一个
原始的Java类型之外,其它的返回类型并没有什么限制。如果你发现这七个执
行程序中没有任何一个提供了你想要的服务,你可以自己写执行程序并使用它。
五、几个应用案例
注意:在使用dbutils类库的时候,实体类的属性名称和数据库的字段名称必须要一致,否则数据封装会失败。
1.插入数据(User是一个实体类)
public int addUser(User user) {
conn = JDBC.getConnection(); //纯jdbc写的一个工具类,获取连接
int count = 0;
String sql = "insert into tb_user(name,loginName,password,email,sex,hobby,birthday) values(?,?,?,?,?,?,?)";
Date birthday = user.getBirthday();
long longbirthday = birthday.getTime();
java.sql.Date birth = new java.sql.Date(longbirthday);
try {
count = runner.update(conn, sql, user.getName(),user.getLoginName(),user.getPassword(),
user.getEmail(),user.getSex(),user.getHobby(),birth);
} catch (SQLException e) {
e.printStackTrace();
return 0;
}
return count;
}
2.查询数据
public String userLogin(String username, String password) {
conn = JDBC.getConnection();
String sql = "select * from tb_user where loginName=? and password=?";
User user = null;
try {
user = runner.query(conn, sql, new BeanHandler<User>(User.class), username,password); //返回的是一个User对象
} catch (SQLException e) {
e.printStackTrace();
}
return user.getLoginName();
}
3.更新数据
public boolean updatePwd(String newPwd, String username) {
conn = JDBC.getConnection();
String sql = "update tb_user set password=? where loginName=?";
int count = 0;
Object[] params = {newPwd,username};
try {
//count = runner.update(conn, sql, newPwd,username);
count = runner.update(conn, sql,params); //参数可以先放入一个Object数组中传入
} catch (SQLException e) {
e.printStackTrace();
}
return count>0?true:false;
}
4.查询数据并返回list集合
public List<User> getAll(){
conn = JDBC.getConnection();
String sql = "select * from tb_user"; //tb_user是一个测试用的数据表
List list = null;
try {
list = runner.query(conn, sql, new BeanListHandler<User>(User.class));
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
5.查询数据并返回Map集合
public Map<Integer,User> getMapAll(){
conn = JDBC.getConnection();
String sql = "select * from tb_user";
Map<Integer,User> map = null;
try {
map = runner.query(conn, sql, new BeanMapHandler<Integer,User>(User.class,"id"));
} catch (SQLException e) {
e.printStackTrace();
}
return map;
}
使用BeanMapHandler对象时注意,你所查询的数据表中应该有一个主键,名字可以任意。
ommons-dbutils是Apache 组织提供的一个开源 JDBC 工具类库,对传统操作数据库的类进行二次封装,可以把结果集转化成List。
二、几个重要的包
1. org.apache.commons.dbutils (该包中的类主要帮助我们更便捷的操作JDBC)
2. org.apache.commons.dbutils.handlers(该包中的类都是实现org.apache.commons.dbutils.ResultSetHandler接口的实现类)
3. org.apache.commons.dbutils.wrappers(该包中的类主要是封装了对Sql结果集的操作)
三、使用这个DbUtils的一些优势:
1. 防止了资源的泄露,写一段JDBC的准备代码其实并不麻烦,但是那些操作确实是
十分耗时和繁琐的,也会导致有时候数据库连接忘记关闭了导致异常难以追踪。
2. 干净整洁的持久化代码,把数据持久化到数据库的代码被打打削减,剩下的代码
能够清晰简洁的表达你的操作目的。
3. 自动把ResultSets中的工具映射到JavaBean中,你不需要手动的使用Setter方法
将列值一个个赋予相应的时日,Resultset中的每一个行都大表一个完成的
Bean实体。
四、Commonsdbutils主要相关类及接口的简介:
主要讲解两个类
org.apache.commons.dbutils.DbUtils和
org.apache.commons.dbutils.QueryRunner
一个接口
org.apache.commons.dbutils.ResultSethandler
2.1:DbUtils类
为做一些诸如关闭连接、装载JDBC驱动程序之类的常规工作提供有用方法的类,
它里面所有的方法都是静态的。
A:loadDriver(StringdriveClassName): 这一方法装载并注册JDBC驱动程序,
如果成功就返回TRUE,不需要去捕捉 ClassNotFoundException异常。通过返回
值判断驱动程序是否加载成功。
B:close方法:DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的
参数是不是NULL,如果不是的话,它们就关闭连接 (Connection)、声明
(Statement)或者结果集(ResultSet)对象。
C:closeQuietly方法: closeQuietly这一方法不仅能在连接、声明或者结果集
为NULL情况下避免关闭,还能隐藏一些在程序中抛出 的SQLException。如果你
不想捕捉这些异常的话,这对你是非常有用的。在重载closeQuietly方法时,
特别有用的一个方法是 closeQuietly(Connection conn,Statement stmt,
ResultSet rs),使用这一方法,你最后的块就可以只需要调用这一方法即可。
D: commitAndCloseQuietly(Connection conn)方法和
commitAndClose (Connection conn)方法:这两个方法用来提交连接,然后关
闭连接,不同的是commitAndCloseQuietly(Connection conn)方法关闭连接时
不向上抛出在关闭时发生的一些SQL异常而commitAndClose (Connection conn)
方法向上抛出SQL异常。
2.2:QueryRunner类
该类简单化了 SQL 查询,它与 ResultSetHandler(接口 后面将会介绍) 组
合在一起使用可以完成大部分的数据库操作,能够大大减少编码量
【构造函数(1):QueryRunner() (2):QueryRunner(Datasource ds)】。
A:query(Connectionconn, String sql, Object[] params, ResultSetHandler rsh)
方法:这一方法执行一个带参数的选择查询,在这个查询中,对象阵列的值被用来作为
查询的置换参数。这一方法内在地处理 PreparedStatement 和ResultSet 的创建和关
闭。ResultSetHandler对象把从 ResultSet得来的数据转变成一个更容易的或是应用
程序特定的格式来使用。
B:query(Stringsql, Object[] params, ResultSetHandler rsh)方法:这几乎与第
一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构
造器的数据源(DataSource) 或使用的setDataSource 方法中重新获得的。
C:query(Connectionconn, String sql, ResultSetHandler rsh)方法:这执行一个
带参数的选择查询。
D:update(Connectionconn, String sql, Object[] params)方法:这一方法被用来
执行一个带参数的插入、更新或删除操作。对象阵列为声明保存着置换参数。
E:update(String sql, Object[] params)方法: 这几乎与上一种种方法一样;
唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造器的数
据源(DataSource) 或使用的setDataSource 方法中重新获得的。
F:update(Connectionconn, String sql)方法:这执行一个带参数的插入、
更新或删除操作。
2.3:ResultSetHandler接口
正如它的名字所示,这一接口执行处理一个java.sql.ResultSet,将数据转变
并处理为任何一种形式,这样有益于其应用而且使用起来更容易。这一组件提供了
ArrayHandler :将ResultSet中第一行的数据转化成对象数组
ArrayListHandler将ResultSet中所有的数据转化成List,List中存放的是Object[]
BeanHandler :将ResultSet中第一行的数据转化成类对象
BeanListHandler :将ResultSet中所有的数据转化成List,List中存放的是类对象
ColumnListHandler :将ResultSet中某一列的数据存成List,List中存放的是Object对象
KeyedHandler :将ResultSet中存成映射,key为某一列对应为Map。Map中存放的是数据
MapHandler :将ResultSet中第一行的数据存成Map映射
MapListHandler :将ResultSet中所有的数据存成List。List中存放的是Map
ScalarHandler :将ResultSet中一条记录的其中某一列的数据存成Object等转化类。
ResultSetHandler接口提供了一个单独的方法:
Object handle(java.sql.ResultSet .rs)。因此任何ResultSetHandler
的执行需要一个结果集(ResultSet)作为参数传入,然后才能处理这个结果集,
再返回一个对象。因为返回类型是java.lang.Object,所以除了不能返回一个
原始的Java类型之外,其它的返回类型并没有什么限制。如果你发现这七个执
行程序中没有任何一个提供了你想要的服务,你可以自己写执行程序并使用它。
五、几个应用案例
注意:在使用dbutils类库的时候,实体类的属性名称和数据库的字段名称必须要一致,否则数据封装会失败。
1.插入数据(User是一个实体类)
public int addUser(User user) {
conn = JDBC.getConnection(); //纯jdbc写的一个工具类,获取连接
int count = 0;
String sql = "insert into tb_user(name,loginName,password,email,sex,hobby,birthday) values(?,?,?,?,?,?,?)";
Date birthday = user.getBirthday();
long longbirthday = birthday.getTime();
java.sql.Date birth = new java.sql.Date(longbirthday);
try {
count = runner.update(conn, sql, user.getName(),user.getLoginName(),user.getPassword(),
user.getEmail(),user.getSex(),user.getHobby(),birth);
} catch (SQLException e) {
e.printStackTrace();
return 0;
}
return count;
}
2.查询数据
public String userLogin(String username, String password) {
conn = JDBC.getConnection();
String sql = "select * from tb_user where loginName=? and password=?";
User user = null;
try {
user = runner.query(conn, sql, new BeanHandler<User>(User.class), username,password); //返回的是一个User对象
} catch (SQLException e) {
e.printStackTrace();
}
return user.getLoginName();
}
3.更新数据
public boolean updatePwd(String newPwd, String username) {
conn = JDBC.getConnection();
String sql = "update tb_user set password=? where loginName=?";
int count = 0;
Object[] params = {newPwd,username};
try {
//count = runner.update(conn, sql, newPwd,username);
count = runner.update(conn, sql,params); //参数可以先放入一个Object数组中传入
} catch (SQLException e) {
e.printStackTrace();
}
return count>0?true:false;
}
4.查询数据并返回list集合
public List<User> getAll(){
conn = JDBC.getConnection();
String sql = "select * from tb_user"; //tb_user是一个测试用的数据表
List list = null;
try {
list = runner.query(conn, sql, new BeanListHandler<User>(User.class));
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
5.查询数据并返回Map集合
public Map<Integer,User> getMapAll(){
conn = JDBC.getConnection();
String sql = "select * from tb_user";
Map<Integer,User> map = null;
try {
map = runner.query(conn, sql, new BeanMapHandler<Integer,User>(User.class,"id"));
} catch (SQLException e) {
e.printStackTrace();
}
return map;
}
使用BeanMapHandler对象时注意,你所查询的数据表中应该有一个主键,名字可以任意。

7128

被折叠的 条评论
为什么被折叠?



