1.DbUtils介绍
最早操作数据库使用的是Java自带的JDBC技术,JDBC操作数据库的时候存在很多严重的重复代码,并且需要程序员手动的释放相应的资源信息。于是Apache组织又一次站出来,对JDBC技术进行简单的封装,形成可以快速对数据进行CRUD操作的DbUtils工具类。
c3p0连接池
//数据源
ComboPooledDataSource cpds = new ComboPooledDataSource();
2.操作数据库之增删改
// 创建执行Sql的QueryRunner对象 ,这里不控制事务,需要传递数据源
QueryRunner qr = new QueryRunner(cpds));
//书写sql语句
//添加一条记录
//String sql = "insert into user values(null, ?, ?)";
//删除一条记录
//String sql = "delete from users where id = ?";
//修改一条记录
String sql = "update users set password = ? where username = ?";
// 执行sql,需要给出参数数据
//qr.update(sql, "lisi", "123");
//qr.update(sql, 1);
qr.update(sql , "lisi", "李四");
3.操作数据库之查询(重点)
ResultSetHandler实现类
在DbUtils工具类,针对ResultSetHandler接口提供了11个实现类:
ArrayHandler:它是把从数据库中查询的第一个行数据保存在数组中。
ArrayListHandler:把查询的每一行数据都保存在数组中,然后把所有的数组保存在List集合中
MapHandler:它会将查询到数据表中的第一行以列名作为map的key,列值作为map的value保存在map集合中。
MapListHandler:将查询到数据表中的每一行以列名作为map的key,列值作为map的value保存在map集合中,每一行都是Map集合,然后把当前这个Map保存在List集合中。
BeanHandler:把查询的第一行数据封装到一个JavaBean上
BeanListHandler:把查询的每一行数据封装到一个JavaBean上,然后把每个JavaBean保存在List集合。
BeanMapHandler:把查询的每一行数据封装到一个JavaBean上,把这个对象作为map的value值存在,然后需要使用某一列作为Map的key。
ColumnListHandler:把数据库中的某一列查询出来保存在List集合中。
KeyedHandler:把查询到的每一行数据中的列名作为key,列值作为value存储Map集合中,然后再将创建KeyedHandler对象时指定指定的列名作为新的Map的key,将每行数据已经封装的Map作为新的Map的value值保存。
ScalarHandler:可以获取到当前数据库中的数据记录条数。如果在创建ScalarHandler对象的时候,指定列名那么就会在查询的结果中,获取当前这列中第一行的的结果。
例子:
ArrayListHandler演示
// 创建执行Sql的QueryRunner对象 ,这里不控制事务,需要传递数据源
QueryRunner qr = new QueryRunner(cpds);
// 书写sql语句 查询所有数据
String sql = "select * from users";
// 执行sql
List<Object[]> query = qr.query(sql, new ArrayListHandler());
// 遍历数组
for (Object[] obj : query) {
System.out.println(Arrays.toString(obj));
}
查询结果:
MapHandler演示(重点)
QueryRunner qr = new QueryRunner(dbcp);
//书写sql语句 ,查询所有用户信息
String sql = "select * from users ";
Map<String, Object> map = qr.query(sql, new MapHandler());
// 遍历集合
for (Entry<String, Object> entry : map.entrySet()) {
System.out.println( entry.getKey() +"==="+entry.getValue() );
}
以下是只写执行sql语句部分,前几步操作和前面一致
MapListHandler演示(重点)
String sql = "select * from users ";
List<Map<String, Object>> list = qr.query(sql, new MapListHandler());
BeanHandler演示(重点)
String sql = "select * from users where id = ?";
/*
* 执行sql。在创建BeanHandler对象的时候,需要指定出查询数据封装的JavaBean对应的Class类
*/
User user = qr.query(sql, new BeanHandler<User>(User.class), 4);
BeanListHandler演示(重点)
String sql = "select * from users ";
/*
* 执行sql。在创建BeanListHandler对象的时候,
* 需要指定出查询数据封装的JavaBean对应的Class类,
* BeanListHandler 底层会将封装的JavaBean对象再保存到List集合中
*/
List<User> query = qr.query(sql, new BeanListHandler<User>(User.class));
BeanMapHandler演示
String sql = "select * from users ";
/*
* 在创建BeanMapHandler对象的时候, 需要指定出查询数据封装的JavaBean对应的Class类,
* 同时需要在指定表中的某一列作为Map集合的key值。每一行的数据封装的JavaBean中作为Map的value值
*/
Map<Integer, User> map = qr.query(sql, new BeanMapHandler<Integer , User>(User.class,"id"));
运行结果
ScalarHandler演示(重点)
//获取到当前数据库中的数据记录条数
String sql = "select count(*) from users";
Long number = qr.query(sql, new ScalarHandler<Long>());
运行结果
如果在创建ScalarHandler对象的时候指定列名,返回的是当前这列第一行的值。
String sql = "select * from users";
String s = qr.query(sql, new ScalarHandler<String>("username"));
查询结果:
此篇介绍了DButil技术的增删该查,在真正的工作阶段,都会使用hibernate,mybatis等数据库框架,因此本人感觉意义不大!