common-dbutils.jar
1、QueryRunner :
作用: 简化了查询,增删改的代码。
update方法:
1)
//执行增、删、改语句
int update(String sql, Object... params)
2)
//支持事务
int update(Connection con, String sql, Object... parmas)
需要调用者提供Connection,这说明本方法不再管理Connection了。
query方法:
1)
//可执行查询
T query(String sql, ResultSetHandler rsh, Object... params)
运行机制:它会先得到ResultSet,然后调用rsh的handle()把rs转换成需要的类型!
2)
//支持事务
T query(Connection con, String sql, ResultSetHadler rsh, Object... params)
ResultSetHandler接口:
1)
//把一行结果转换成指定类型的javaBean对象
BeanHandler(单行) 构造器需要一个Class类型的参数.
2)
//把多行就是转换成List对象,一堆javabean
BeanListHandler(多行) 构造器也是需要一个Class类型的参数。
3)
MapHandler(单行) --> 把一行结果集转换Map对象
> 一行记录:
sid sname age gender
1001 zs 99 male
> 一个Map:
{sid:1001, sname:zs, age:99, gender:male}
4)
MapListHandler(多行) --> 把一行记录转换成一个Map,多行就是多个Map,即List<Map>!
5)
ScalarHandler(单行单列) --> 通常用与select count(*) from t_stu语句!结果集是单行单列的!它返回一个Object
2、QueryRunner类的使用 :
public class Demo3 {
@Test
public void fun1() throws SQLException {
QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
String sql = "insert into t_stu values(?,?,?,?)";
Object[] params = {1002, "liSi", 88, "female"};
qr.update(sql, params);
}
@Test
public void fun2() throws SQLException {
QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
String sql = "select * from t_stu where sid=?";
Object[] params = {1001};
Stu stu = qr.query(sql, new BeanHandler<Stu>(Stu.class), params);
System.out.println(stu);
}
/**
* BeanListHandler的应用,它是多行处理器
* 每行对象一个Stu对象!
* @throws Exception
*/
@Test
public void fun3() throws Exception {
QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
String sql = "select * from t_stu";
List<Stu> stuList = qr.query(sql, new BeanListHandler<Stu>(Stu.class));
System.out.println(stuList);
}
/**
* MapHandler的应用,它是单行处理器,把一行转换成一个Map对象
* @throws SQLException
*/
@Test
public void fun4() throws SQLException {
QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
String sql = "select * from t_stu where sid=?";
Object[] params = {1001};
Map map = qr.query(sql, new MapHandler(), params);
System.out.println(map);
}
/**
* MapListHandler,它是多行处理器,把每行都转换成一个Map,即List<Map>
* @throws SQLException
*/
@Test
public void fun5() throws SQLException {
QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
String sql = "select * from t_stu";
List<Map<String,Object>> mapList = qr.query(sql, new MapListHandler());
System.out.println(mapList);
}
/**
* ScalarHandler,它是单行单列时使用,最为合适!
* @throws SQLException
*/
@Test
public void fun6() throws SQLException {
QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
String sql = "select count(*) from t_stu";
Number cnt = (Number)qr.query(sql, new ScalarHandler());
long c = cnt.longValue();
System.out.println(c);
}
}
3、查询及增删改内部原理:
public class QR<T> {
private DataSource dataSource;
public QR(DataSource dataSource) {
this.dataSource = dataSource;
}
public QR() {
super();
}
public int update(String sql, Object... params) {
Connection con = null;
PreparedStatement pstmt = null;
try {
con = dataSource.getConnection();
pstmt = con.prepareStatement(sql);
initParams(pstmt, params);
return pstmt.executeUpdate();
} catch(Exception e) {
throw new RuntimeException(e);
} finally {
try {
if(pstmt != null) pstmt.close();
if(con != null) con.close();
} catch(SQLException e1) {}
}
}
private void initParams(PreparedStatement pstmt, Object... params)
throws SQLException {
for(int i = 0; i < params.length; i++) {
pstmt.setObject(i+1, params[i]);
}
}
public T query(String sql, RsHandler<T> rh, Object... params) {
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
con = dataSource.getConnection();
pstmt = con.prepareStatement(sql);
initParams(pstmt, params);
rs = pstmt.executeQuery();
return rh.handle(rs);
} catch(Exception e) {
throw new RuntimeException(e);
} finally {
try {
if(pstmt != null) pstmt.close();
if(con != null) con.close();
} catch(SQLException e1) {}
}
}
}
interface RsHandler<T> {
public T handle(ResultSet rs) throws SQLException;
}
调用:
public class Demo2 {
@Test
public void fun1() {
Stu s = load(1001);
System.out.println(s);
}
public void addStu(Stu stu) {
QR qr = new QR(JdbcUtils.getDataSource());
String sql = "insert into stu values(?,?,?,?)";
Object[] params = {stu.getSid(), stu.getSname(), stu.getAge(), stu.getGender()};
qr.update(sql, params);
}
public Stu load(int sid) {
QR qr = new QR(JdbcUtils.getDataSource());
String sql = "select * from stu where sid=?";
Object[] params = {sid};
RsHandler<Stu> rh = new RsHandler<Stu>() {
public Stu handle(ResultSet rs) throws SQLException {
if(!rs.next()) return null;
Stu stu = new Stu();
stu.setSid(rs.getInt("sid"));
stu.setSname(rs.getString("sname"));
stu.setAge(rs.getInt("age"));
stu.setGender(rs.getString("gender"));
return stu;
}
};
return (Stu) qr.query(sql, rh, params);
}
}