1.commons-dbutils
commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。
commons-dbutilsAPI包括:
- org.apache.commons.dbutils.QueryRunner
- org.apache.commons.dbutils.ResultSetHandler
工具类
- org.apache.commons.dbutils.DbUtils
2.QueryRunner类
该类简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。
QueryRunner类提供了两个构造方法:
- 默认的构造方法;
- 需要一个 javax.sql.DataSource 来作参数的构造方法。
QueryRunner类的主要方法:
执行一个不需要置换参数的查询操作。
执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数
用来执行一个更新(插入、更新或删除)操作。
用来执行一个不需要置换参数的更新操作。
2.1 使用DBUtils进行更新操作,更新操作可用于insert,update,delete.
public void testQueryRunnerUpdate() { QueryRunner queryRunner=new QueryRunner(); Connection connection=null; String sql="DELETE FROM USERS WHERE ID IN (?,?)"; try{ connection=JDBCTools.getConnection(); queryRunner.update(connection,sql,1,2); }catch(Exception e){ e.printStackTrace(); }finally{ JDBCTools.release(null, null, connection); } }
数据库连接和释放工具类 JDBCTools.java
//获取数据库的连接 @Test public static Connection getConnection() throws Exception{ String driverClass=null; String jdbcUrl=null; String user=null; String password=null; InputStream in=JDBCTools.class.getResourceAsStream("/jdbc.properties"); Properties properties=new Properties(); properties.load(in); driverClass=properties.getProperty("driver"); jdbcUrl=properties.getProperty("jdbcUrl"); user=properties.getProperty("user"); password=properties.getProperty("password"); Class.forName(driverClass); Connection connection=DriverManager.getConnection(jdbcUrl,user,password); return connection; } @Test public void testGetConnection() throws Exception{ getConnection(); } //数据库释放 public static void release(ResultSet resultset,Statement statement,Connection connection){ if(statement!=null){ try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if(connection!=null){ try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } if(resultset!=null){ try { resultset.close(); } catch (SQLException e) { e.printStackTrace(); } } }
3.使用DBUtils进行查询操作
@Test public void testQuery(){ Connection connection=null; try{ connection=JDBCTools.getConnection(); String sql="SELECT id,name,email,birth FROM CUSTOMER"; Object obj=queryRunner.query(connection, sql, new MyResultSetHandler()); System.out.println(obj); }catch(Exception e){ e.printStackTrace(); }finally{ JDBCTools.release(null, null, connection); } } //QueryRunner的返回值取决于ResultSetHandler的返回值 QueryRunner queryRunner=new QueryRunner(); class MyResultSetHandler implements ResultSetHandler{ @Override public Object handle(ResultSet resultset) throws SQLException { List<Customer> customers=new ArrayList<Customer>(); while(resultset.next()){ Integer id=resultset.getInt(1); String name=resultset.getString(2); String email=resultset.getString(3); Date date=resultset.getDate(4); Customer customer=new Customer(id,name,email,date); customers.add(customer); } return customers; } }
4.ResultSetHandler接口的实现类
4.1 BeanHandler
把结果集的第一条记录转为创建BeanHandler对象时传入的Class参数对应的对象。
示例代码:
public void testBeanHandler() { Connection connection=null; try{ connection=JDBCTools.getConnection(); String sql="SELECT ID,NAME,EMAIL,BIRTH FROM CUSTOMER WHERE ID>=?"; Customer customer=(Customer) queryRunner.query(connection,sql,new BeanHandler(Customer.class),2); System.out.println(customer); }catch(Exception e){ e.printStackTrace(); }finally{ JDBCTools.release(null, null, connection); } }
运行结果返回:
Customer [id=2, name=Winda, email=3455345466@163.com, birth=1995-02-14]
4.2 BeanListHandler
将结果集中的每一条数据都封装到一个对应的JavaBean实例中,存放到List里。
public void testBeanListHandler(){ Connection connection=null; try{ connection=JDBCTools.getConnection(); String sql="SELECT ID,NAME,EMAIL,BIRTH FROM CUSTOMER"; List<Customer> customers=(List<Customer>) queryRunner.query(connection,sql,new BeanListHandler(Customer.class)); System.out.println(customers); }catch(Exception e){ e.printStackTrace(); }finally{ JDBCTools.release(null, null, connection); } }
返回结果为:
[Customer [id=1, name=Tom, email=231233134@163.com, birth=1983-09-11], Customer [id=2, name=Winda, email=3455345466@163.com, birth=1995-02-14], Customer [id=3, name=A, email=5534565656@163.com, birth=1995-06-23], Customer [id=4, name=B, email=9444532232@163.com, birth=1992-03-11], Customer [id=5, name=C, email=4234412132@163.com, birth=1996-09-14], Customer [id=6, name=D, email=5634645645@163.com, birth=1990-09-19]]
4.3 MapHandler
返回SQL对应的第一条记录对应的Map对象。键对应列名,值对应列的值。
示例代码:
public void testMapHandler(){ Connection connection=null; try{ connection=JDBCTools.getConnection(); String sql="SELECT ID,NAME,EMAIL,BIRTH FROM CUSTOMER"; Map<String,Object> result= queryRunner.query(connection,sql,new MapHandler()); System.out.println(result); }catch(Exception e){ e.printStackTrace(); }finally{ JDBCTools.release(null, null, connection); } }
返回结果:
{ID=1, BIRTH=1983-09-11, EMAIL=231233134@163.com, NAME=Tom}
4.4 MapListHandler
将结果集中的每一行数据都封装到一个Map里,然后再存放到List。
public void testMapListHandler(){ Connection connection=null; try{ connection=JDBCTools.getConnection(); String sql="SELECT ID,NAME,EMAIL,BIRTH FROM CUSTOMER"; List<Map<String,Object>> result= queryRunner.query(connection,sql,new MapListHandler()); System.out.println(result); }catch(Exception e){ e.printStackTrace(); }finally{ JDBCTools.release(null, null, connection); } }
4.5 ScalarHandler
把结果集转为一个数值返回,这个数值可以是任意类型和String,Date等。
public void testScalarHandler(){ Connection connection=null; try{ connection=JDBCTools.getConnection(); String sql="SELECT NAME FROM CUSTOMER WHERE ID=?"; Object result= queryRunner.query(connection,sql,new ScalarHandler(),2); System.out.println(result); }catch(Exception e){ e.printStackTrace(); }finally{ JDBCTools.release(null, null, connection); } }