1.为什么要使用java连接池?
在我们用传统的JDBC 连接数据库,必须经常进行创建和销毁,并且销毁对象也不是很彻底,所以为了节省时间、效率,可以使用连接池。
2.如何使用连接池?
在程序开始的时候,可以创建几个连接,将连接放入到连接池中.用户使用连接的时候,可以从连接池中进行获取.用完之后,可以将连接归还连接池。
常见连接池的有C3PO,DBCP,当然我们也可以自己定义——以下为所写代码:
public class MyDataSource implements DataSource{
// 创建一个List集合用于存放多个连接对象.
privateList<Connection> list = new ArrayList<Connection>();
// 在程序开始的时候,初始化几个连接,将连接存放到list中.
publicMyDataSource() {
// 初始化3个连接:
for(inti=1;i<=3;i++){
Connectionconn = JDBCUtils.getConnection();
list.add(conn);
}
}
@Override
// 获得连接的方法:
publicConnection getConnection() throws SQLException {
if(list.size()<= 0){
for(inti=1;i<=3;i++){
Connectionconn = JDBCUtils.getConnection();
list.add(conn);
}
}
Connectionconn = list.remove(0);
returnconn;
}
// 归还连接的方法:
publicvoid addBack(Connection conn){
list.add(conn);
}
...
}
3.什么是DBUtils?
我们知道在执行select语句之后得到的是ResultSet,然后我们还需要对ResultSet进行转换,得到最终我们想要的数据。你可以希望把ResultSet的数据放到一个List中,也可能想把数据放到一个Map中,或是一个Bean中。
DBUtils提供了一个接口ResultSetHandler,它就是用来ResultSet转换成目标类型的工具。你可以自己去实现这个接口,把ResultSet转换成你想要的类型。
DBUtils提供了很多个ResultSetHandler接口的实现,这些实现已经基本够用了,我们通常不用自己去实现ResultSet接口了。
MapHandler:单行处理器!把结果集转换成Map<String,Object>,其中列名为键! |
MapListHandler:多行处理器!把结果集转换成List<Map<String,Object>>; |
BeanHandler:单行处理器!把结果集转换成Bean,该处理器需要Class参数,即Bean的类型; |
BeanListHandler:多行处理器!把结果集转换成List<Bean>; |
ColumnListHandler:多行单列处理器!把结果集转换成List<Object>,使用ColumnListHandler时需要指定某一列的名称或编号,例如:newColumListHandler(“name”)表示把name列的数据放到List中。 |
ScalarHandler:单行单列处理器!把结果集转换成Object。一般用于聚集查询,例如select count(*) fromtab_student。 |
MapListHandler处理器
Bean处理器
Column处理器
4.QueryRunner查询方式?
QueryRunner的查询方法是:
public <T> Tquery(String sql, ResultSetHandler<T> rh, Object… params)
public <T> Tquery(Connection con, String sql, ResultSetHandler<T> rh, Object… params)
query()方法会通过sql语句和params查询出ResultSet,然后通过rh把ResultSet转换成对应的类型再返回。
java代码:
@Test
public void fun2() throws SQLException {
DataSource ds = JdbcUtils.getDataSource();
QueryRunner qr = new QueryRunner(ds);
String sql = "select * from tab_student";
List<Map<String,Object>>list = qr.query(sql, new MapListHandler()[ThinkPad1] );
for(Map<String,Object> map : list) {
System.out.println(map);
}
}
@Test
public void fun3() throws SQLException {
DataSource ds = JdbcUtils.getDataSource();
QueryRunner qr = new QueryRunner(ds);
String sql = "select * from tab_student wherenumber=?";
Student stu = qr.query(sql, new BeanHandler<Student>(Student.class)[ThinkPad1] , "S_2000");
System.out.println(stu);
}