使用QueryRunner类实现查询
- public Object query(Connection conn, String sql, ResultSetHandler rsh,Object… params) throws SQLException:执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭。
- public Object query(String sql, ResultSetHandler rsh, Object… params) throws SQLException: 几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造方法的数据源(DataSource) 或使用的setDataSource 方法中重新获得 Connection。
- public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException : 执行一个不需要置换参数的查询操作。
- public Object query( String sql, ResultSetHandler rsh) throws SQLException : 执行一个不需要置换参数的查询操作。
ResultSetHandler接口
该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。
ResultSetHandler 接口提供了一个单独的方法:Object handle (java.sql.ResultSet rs)
该方法的返回值将作为QueryRunner类的query()方法的返回值。
@Test public void testResultSetHandler() { // 1.创建QueryRunner的实例 QueryRunner qr = new QueryRunner();
Connection conn = null;
try { // 2.获取连接 conn = JDBCTools.getConnection();
class MyResultSetHandler implements ResultSetHandler{ @Override public Object handle(ResultSet rs) throws SQLException { Student stu = new Student(); if (rs.next()) { stu.setId(rs.getInt(1)); stu.setSname(rs.getString(2)); stu.setSex(rs.getString(3)); stu.setMajor(rs.getString(4)); stu.setClasses(rs.getString(5)); } return stu; } }
String sql = “select sno,sname,sex,major,classes from t_stu where sno =?”; // 3、使用query方法 // QueryRunner 的 query 方法的返回值取决于其 ResultSetHandler 参数的handle 方法的返回值 Object obj = qr.query(conn, sql, new MyResultSetHandler(),1);
System.out.println(obj); } catch (SQLException e) { e.printStackTrace(); } finally { JDBCTools.free(null, null, conn); } } |
- ArrayHandler:把结果集中的第一行数据转成对象数组。
- ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。
- BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
- BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
- ColumnListHandler:将结果集中某一列的数据存放到List中。
- KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。
- MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
- MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
BeanHandler实现类
/* * BeanHandler: 把结果集的第一条记录转为创建 BeanHandler 对象时传入的 Class参数对应的对象. * 当JavaBean的属性名与字段名不一致时,可以通过指定别名告知属性名 */ public static void main(String[] args) throws SQLException { //1、连接池 DataSource ds = new ComboPooledDataSource(“mypool”);
//2、直接使用QueryRunner QueryRunner qr = new QueryRunner(ds); String sql = “select pid as id,pname,price,description from t_goods where pid =?”; Goods goods = qr.query(sql, new BeanHandler<Goods>(Goods.class), 1); System.out.println(goods); } |
BeanListHandler实现类
/* * BeanListHandler: 把结果集转为一个 List, 该 List 不为 null, 但可能为空集合(size() 方法返回 0) 若 * SQL 语句的确能够查询到记录, List 中存放创建 BeanListHandler 传入的 Class对象对应的对象. */ public static void main(String[] args) throws SQLException { //1、连接池 DataSource ds = new ComboPooledDataSource(“mypool”);
//2、直接使用QueryRunner QueryRunner qr = new QueryRunner(ds); String sql = “select pid as id,pname,price,description from t_goods”; List<Goods> query = qr.query(sql, new BeanListHandler<Goods>(Goods.class)); for (Goods goods : query) { System.out.println(goods); } } |
MapHandler实现类
public static void main(String[] args) throws SQLException { // 1、连接池 DataSource ds = new ComboPooledDataSource(“mypool”);
// 2、直接使用QueryRunner QueryRunner qr = new QueryRunner(ds);
String sql = “select did,count(*) from employee where did = 1”; Map<String, Object> map = qr.query(sql, new MapHandler()); Set<Entry<String, Object>> entrySet = map.entrySet(); for (Entry<String, Object> entry : entrySet) { // System.out.println(entry.getKey() +”–>” + entry.getValue()); if (“did”.equals(entry.getKey())) { System.out.println(“部门编号:” + entry.getValue()); } else { System.out.println(“人数:” + entry.getValue()); } } } |
MapListHandler实现类
public static void main(String[] args) throws SQLException { //1、连接池 DataSource ds = new ComboPooledDataSource(“mypool”);
//2、直接使用QueryRunner QueryRunner qr = new QueryRunner(ds);
String sql = “select did,count(*) from employee group by did”; /* * did count(*) * 1 7 * 2 3 * 3 1 * * List: * map: * key(did) value(1) * key(count(*) value(7) * 第二行 * map: * key(did) value(2) * key(count(*) value(3) * 第三行 * map: * key(did) value(3) * key(count(*) value(1) * */ List<Map<String, Object>> query = qr.query(sql, new MapListHandler()); for (Map<String, Object> map : query) { Set<Entry<String, Object>> entrySet = map.entrySet(); for (Entry<String, Object> entry : entrySet) { //System.out.println(entry.getKey() +”–>” + entry.getValue()); if(“did”.equals(entry.getKey())){ System.out.println(“部门编号:” + entry.getValue()); }else{ System.out.println(“人数:” + entry.getValue()); }
} } } |
ScalarHandler实现类
/* * ScalarHandler: 把结果集转为一个数值(可以是任意基本数据类型和字符串, Date 等)返回 * ScalarHandler()只取第一行第一列 * ScalarHandler(int columnIndex):取第一行的第columnIndex列 * ScalarHandler(String columnName):取第一行的列名为columnName列的值 */ @Test public static void main(String[] args) throws SQLException { //1、连接池 DataSource ds = new ComboPooledDataSource(“mypool”);
//2、直接使用QueryRunner QueryRunner qr = new QueryRunner(ds);
// String sql = “select count(*) from t_goods”; String sql = “select max(price) from t_goods”; Object query = qr.query(sql, new ScalarHandler()); System.out.println(query); } |
上一篇: Java培训课程之数据库连接池的必要性
下一篇: Java培训课程之使用QueryRunner类实现更新