一、QueryRunner类
该类简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。
QueryRunner类提供了两个构造方法:
- 默认的构造方法
- 需要一个 javax.sql.DataSource 来作参数的构造方法。
QueryRunner类主要方法
public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh) throws SQLException
执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭。
public Object query(String sql, Object[] params, ResultSetHandler rsh) throws SQLException
几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造方法的数据源(DataSource) 或使用的setDataSource 方法中重新获得 Connection。
public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException
执行一个不需要置换参数的查询操作。
public int update(Connection conn, String sql, Object[] params) throws SQLException
用来执行一个更新(插入、更新或删除)操作。
public int update(Connection conn, String sql) throws SQLException
用来执行一个不需要置换参数的更新操作。
二、使用QueryRunner类实现CRUD
public class QueryRunnerCRUD {
@Test
public void add() throws SQLException {
// 将数据源传递给QueryRunner,QueryRunner内部通过数据源获取数据库连接
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
System.out.println(qr);
String sql = "insert into student(id,username,password,age,address) values(null,?,?,?,?)";
Object params[] = { "小张", "123", 18, "成都" };
int count = qr.update(sql, params);
System.out.println(count > 0 ? "成功" : "失败");
}
@Test
public void delete() throws SQLException {
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "delete from student where id=?";
int count = qr.update(sql, 3);
System.out.println(count > 0 ? "成功" : "失败");
}
@Test
public void update() throws SQLException {
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "update student set username=? where id=?";
Object params[] = { "哈哈", 2 };
int count = qr.update(sql, params);
System.out.println(count > 0 ? "成功" : "失败");
}
@Test
public void find() throws SQLException {
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "select * from student where id=?";
Object params[] = { 4 };
Student s = (Student) qr.query(sql, params, new BeanHandler(Student.class));
System.out.println(s);
}
@Test
public void getAll() throws SQLException {
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "select * from student";
List<Student> list = (List) qr.query(sql, new BeanListHandler(Student.class));
for (Student s : list) {
System.out.println(s);
}
System.out.println(list.size());
}
}
ResultSetHandler接口的实现类
-
ArrayHandler:把结果集中的第一行数据转成对象数组。
-
ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。
-
BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
-
BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
-
ColumnListHandler:将结果集中某一列的数据存放到List中。
-
KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。
-
MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
-
MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
public class ResultSetHandlerDemo {
/*
* 把结果集中的第一行数据转成对象数组
*/
@Test
public void testArrayHandler() throws SQLException {
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "select * from student";
Object result[] = (Object[]) qr.query(sql, new ArrayHandler());
System.out.println(Arrays.asList(result)); // list toString()
}
/*
* 把结果集中的每一行数据都转成一个数组,再存放到List中。
*/
@Test
public void testArrayListHandler() throws SQLException {
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "select * from student";
List<Object[]> list = (List) qr.query(sql, new ArrayListHandler());
for (Object[] o : list) {
System.out.println(Arrays.asList(o));
}
}
/*
* 将结果集中某一列的数据存放到List中。
*/
@Test
public void testColumnListHandler() throws SQLException {
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "select * from student";
List list = (List) qr.query(sql, new ColumnListHandler("username"));
System.out.println(list);
}
/*
* 将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。
*/
@Test
public void testKeyedHandler() throws Exception {
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "select * from student";
Map<Integer, Map> map = (Map) qr.query(sql, new KeyedHandler("id"));
for (Map.Entry<Integer, Map> me : map.entrySet()) {
int id = me.getKey();
Map<String, Object> innermap = me.getValue();
for (Map.Entry<String, Object> innerme : innermap.entrySet()) {
String columnName = innerme.getKey();
Object value = innerme.getValue();
System.out.println(columnName + "=" + value);
}
System.out.println("----------------");
}
}
/*
* •将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
*/
@Test
public void testMapHandler() throws SQLException {
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "select * from student";
Map<String, Object> map = (Map) qr.query(sql, new MapHandler());
for (Map.Entry<String, Object> me : map.entrySet()) {
System.out.println(me.getKey() + "=" + me.getValue());
}
}
/*
* 将结果集中的每一行数据都封装到一个Map里,然后再存放到List
*/
@Test
public void testMapListHandler() throws SQLException {
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "select * from student";
List<Map> list = (List) qr.query(sql, new MapListHandler());
for (Map<String, Object> map : list) {
for (Map.Entry<String, Object> me : map.entrySet()) {
System.out.println(me.getKey() + "=" + me.getValue());
}
}
}
@Test
public void testScalarHandler() throws SQLException {
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "select count(*) from student";
int count = ((Long) qr.query(sql, new ScalarHandler(1))).intValue();
System.out.println(count);
}
}