什么是dbutils,它的作用?
DBUtils是java编程中的数据库操作实用工具,小巧简单实用。
DBUtils封装了对JDBC的操作,简化了JDBC操作。可以少写代码。
1.对于数据表的读操作,他可以把结果转换成List,Array,Set等java集合,便于程序员操作;
2.对于数据表的写操作,也变得很简单(只需写sql语句)
3.可以使用数据源,使用JNDI,数据库连接池等技术来优化性能–重用已经构建好的数据库连接对象
①QueryRunner类
②ResultSetHandler接口
③DBUtils类
1、QueryRunner中提供对sql语句操作的API.它主要有三个方法
query() 用于执行select
update() 用于执行insert update delete
batch() 批处理
2、ResultSetHandler接口
用于定义select操作后,怎样封装结果集.
3、DbUtils类
它就是一个工具类,定义了关闭资源与事务处理的方法
Dbutils快速入门实现步骤:
①导入jar包 (commons-dbutils-1.4.jar)注意: c3p0与mysql驱动jar也要导入。
②创建QueryRunner对象
③使用query方法执行select语句
④使用ResultSetHandler封装结果集
⑤使用DbUtils类释放资源
①new QueryRunner(); 它的事务可以手动控制。
也就是说此对象调用的方法(如:query、update、batrch)参数中要有Connection对象。
②new QueryRunner(DataSource ds); 它的事务是自动控制的。一个sql一个事务。
此对象调用的方法(如:query、update、batrch)参数中无需Connection对象。
query(sql,ResultSetHandler,Object…params);
update(sql,Object…params);
batch(sql,Object[][]);
进行基本的CRUD操作:练一下
/**
* @author CSDN_LQR
* @TODO 使用QueryRunner执行query、insert、update、delete、batch
*/
public class TestCRUD {
@Test
public void test1() {
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
try {
List list = qr.query("select * from users",
new ResultSetHandler>() {
@Override
public List handle(ResultSet rs)
throws SQLException {
List list = new ArrayList();
while (rs.next()) {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setPassword(rs.getString("password"));
user.setEmail(rs.getString("email"));
user.setBirthday(rs.getDate("birthday"));
list.add(user);
}
return list;
}
});
for (User user : list) {
System.out.println(user.toString());
}
} catch (SQLException e) {
e.printStackTrace();
}
}
@Test
public void test2() {
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
try {
List list = qr.query("select * from users",
new BeanListHandler(User.class));
for (User user : list) {
System.out.println(user.toString());
}
} catch (SQLException e) {
e.printStackTrace();
}
}
@Test
public void testInsert() throws SQLException {
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
qr.update(
"insert into users(name,password,email,birthday) values(?,?,?,?)",
"菜10", "123456", "[email protected]", new Date());
}
@Test
public void testUpdate() throws SQLException {
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
qr.update("update users set name=?,password=? where id=?", "周杰杰",
"123321", 8);
}
@Test
public void testDelete() throws SQLException {
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
qr.update("delete from users where id=?", 8);
}
@Test
public void testBatch() throws SQLException {
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
Object[][] params = new Object[10][];// 高维的10表示要批量执行10次
for (int i = 0; i < params.length; i++) {// 低维表示每次执行时要携带的参数
params[i] = new Object[] { "菜10" + i, "123456", "[email protected]",
new Date() };
}
qr.batch(
"insert into users(name,password,email,birthday) values(?,?,?,?)",
params);
}
}
//ArrayHandler:适合取1条记录。把该条记录的每列值封装到一个数组中Object[]
//ArrayListHandler:适合取多条记录。把每条记录的每列值封装到一个数组中Object[],把数组封装到一个List中
//ColumnListHandler:取某一列的数据。封装到List中。
//KeyedHandler:取多条记录,每一条记录封装到一个Map中,再把这个Map封装到另外一个Map中,key为指定的字段值。
//MapHandler:适合取1条记录。把当前记录的列名和列值放到一个Map中
//MapListHandler:适合取多条记录。把每条记录封装到一个Map中,再把Map封装到List中
//ScalarHandler:适合取单行单列数据
BeanHandler
BeanListHandler
实战代码:
/**
* @author CSDN_LQR
* @TODO //ResultSetHandler下的所有结果处理器
* //ArrayHandler:适合取1条记录。把该条记录的每列值封装到一个数组中Object[]
* //ArrayListHandler:适合取多条记录。把每条记录的每列值封装到一个数组中Object[],把数组封装到一个List中
* //ColumnListHandler:取某一列的数据。封装到List中。
* //KeyedHandler:取多条记录,每一条记录封装到一个Map中,再把这个Map封装到另外一个Map中,key为指定的字段值。
* //MapHandler:适合取1条记录。把当前记录的列名和列值放到一个Map中
* //MapListHandler:适合取多条记录。把每条记录封装到一个Map中,再把Map封装到List中
* //ScalarHandler:适合取单行单列数据 //BeanHandler //BeanListHandler
*/
public class TestResultSetHandler {
@Test
// ArrayHandler:适合取1条记录。把该条记录的每列值封装到一个数组中Object
public void testArrayHandler() throws SQLException {
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
Object[] arr = qr.query("select * from users", new ArrayHandler());
for (Object object : arr) {
System.out.println(object);
}
}
@Test
// ArrayListHandler:适合取多条记录。把每条记录的每列值封装到一个数组中Object[],把数组封装到一个List中
public void testArrayListHandler() throws SQLException {
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
List