JDBC使用DBUtils

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);
		}
}
原文地址:https://www.cnblogs.com/naihuangbao/p/10124487.html