Apache---DbUtils组件的使用
DbUtils组件
commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能!
下载jar包
jar包:http://mirrors.shu.edu.cn/apache/commons/dbutils/binaries/
dbutils的源码文件:http://mirrors.shu.edu.cn/apache/commons/dbutils/source/
下载jar包的同时也可以下载相关的源码文件,在编码的过程中可以通过源码的关联去查看相关对象和相关方法,也方便我们平时的学习。
MyEclipse源码关联方法
按住Ctrl键,把鼠标移动要关联源码的对象中去,再点进去,选择Attach Source,如果源码文件没有解压的话,就选择External File,找到存放源码的正确路径;若是个文件夹的话,就选择External Folder,找到存放源码的正确路径。
API
org.apache.commons.dbutils.QueryRunner--->DbUtils核心工具类对象
org.apache.commons.dbutils.ResultSetHandler---->结果集,
QueryRunner
该类简化了sql查询,与ResultSetHandler组合一起能够完成大部分的数据库操作,减少代码量。主要方法如下:
查询
public <T> T query(Connection conn,String sql,ResultSetHandler<T> rsh)throwsSQLException ---->执行一个不需要置换参数的查询操作
public <T> T query(Connection conn,String sql,ResultSetHandler<T> rsh,Object... params)throws SQLException---->执行一个查询操作,params为可变的置换参数
批处理
public int[] batch(Connection conn,String sql,Object[][] params)throws SQLException---->params对象数组中的数据都是用来插入,可以一次性插入数组里面的全部数据
//批处理
@Test
public void testBatch() throws Exception {
String sql="insert into admin (userName,passWord) values(?,?)";
conn= JdbcUtils.getConnection();
// 创建DbUtils核心工具类对象
QueryRunner qr= new QueryRunner();
//执行插入
qr.batch(conn, sql,new Object[][]{{"ld","1212"},{"婧","221221"}});
JdbcUtils.closeAll(conn, null, null);
}
更新
public int update(Connection conn,String sql,Object... params) throws SQLException---->执行更新(删除、修改、插入)操作,params为可变置换参数
public int update(Connection conn,String sql ) throws SQLException----执行不需要置换参数的更新
@Test
public void testUpdate() throws Exception {
String sql="delete from admin where id=?";
conn= JdbcUtils.getConnection();
// 创建DbUtils核心工具类对象
QueryRunner qr= new QueryRunner();
//执行更新
qr.update(conn, sql, 2);
JdbcUtils.closeAll(conn, null, null);
}
ResultSetHandler
该接口用于处理java.sql.ResultSet,将数据按照要求转换为另一种形式,只提供了一个方法handle(ResultSet rs),我们可以自己来自定义实现该接口,只需要重写该handle(ResultSet rs)方法就行了,或者直接使用它的实现类来处理。
常用的实现类
BeanHandler--->查询返回结果集中第一行数据封装到一个javaBean
BeanListHandler--->查询返回结果集每一行数据都封装到JavaBean,存放到List中去
ArrayHandler--->查询返回结果集中第一行数据转成对象数组
ArrayListHandler--->查询返回结果集每一行数据转成对象数组,存放都List中去
MapHandler--->查询返回结果集第一行数据封装到一个Map,key是列名称,value是对应的值
BeanMapHandler--->把查询的每一行都封装为JavaBean,再添加到Map
ScalarHandler--->查询返回结果记录的第一行的第一列,在聚合函数统计的时候使用,如count()函数
编码实现
表的创建
create table `Admin`(
`id` int(11) NOT NULL AUTO_INCREMENT ,
`userName` varchar(20) ,
`passWord` varchar(20) ,
PRIMARY KEY (`id`)
)
连接|关闭数据库的工具类
public class JdbcUtils {
private static String url="jdbc:mysql://localhost:3306/jdbc_deom";
private static String user="root";
private static String password="root";
/**
* 返回连接
* @return
*/
public static Connection getConnection(){
try {
//注册连接驱动
Class.forName("com.mysql.jdbc.Driver");
//返回连接
return DriverManager.getConnection(url, user, password);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 关闭所有连接
* @param conn
* @param stm
* @param rs
*/
public static void closeAll(Connection conn,Statement stm,ResultSet rs){
try {
if (rs!=null){
rs.close();
rs=null;
}
if (stm !=null){
stm.close();
stm=null;
}
if (conn !=null){
conn.close();
conn=null;
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
JavaBean
public class Admin {
private int id;
private String userName;
private String passWord;
public Admin() {
super();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
@Override
public String toString() {
return "Admin [id=" + id + ", userName=" + userName + ", passWord="
+ passWord + "]";
}
}
自定义结果集
去实现接口ResultSetHandler并复写里面的方法handler(ResultSet rs)
public class MyJdbc {
private Connection conn;
@Test
public void testSet() throws Exception {
String sql="select * from admin where id=?";
conn=JdbcUtils.getConnection();
QueryRunner qr=new QueryRunner();
Admin a=qr.query(conn, sql, new ResultSetHandler<Admin>(){
//复写handle方法
public Admin handle(ResultSet rs) throws SQLException {
if(rs.next()){
Admin admin=new Admin();
//封装数据
admin.setId(rs.getInt("id"));
admin.setUserName(rs.getString("userName"));
admin.setPassWord(rs.getString("passWord"));
return admin;
}
return null;
}
},4);
System.out.println(a);
conn.close();
}
}
利用DbUtils组件提供的结果集对象封装数据
- 使用BeanHandler结果集
@Test
public void testQuery() throws Exception {
String sql="select * from admin where id=?";
conn=JdbcUtils.getConnection();
//创建Dbutils核心工具类对象
QueryRunner qr=new QueryRunner();
Admin admin=qr.query(conn, sql, new BeanHandler<Admin>(Admin.class),4);
System.out.println(admin);
conn.close();
}
- 使用BeanListHandler结果集
@Test
public void testList() throws Exception {
String sql="select * from admin";
conn=JdbcUtils.getConnection();
//创建DBUtils的核心工具类对象
QueryRunner qr=new QueryRunner();
//查询返回一个集合,数据都封装进JavaBean对象里面去,再存储到List
List<Admin> list=qr.query(conn, sql, new BeanListHandler<Admin>(Admin.class));
System.out.println(list);
conn.close();
}
使用ArrayHandler结果集
@Test
public void testArray() throws Exception {
String sql="select * from admin";
conn=JdbcUtils.getConnection();
//创建DBUtils的核心工具类对象
QueryRunner qr=new QueryRunner();
//返回表里面的第一条数据
Object [] obj=qr.query(conn, sql, new ArrayHandler());
System.out.println(obj[1]);
conn.close();
}
使用ArrayListHandler结果集
@Test
public void testArrayList() throws Exception {
String sql="select * from admin";
conn=JdbcUtils.getConnection();
//创建DBUtils的核心工具类对象
QueryRunner qr=new QueryRunner();
//返回表里面的第一条数据
List<Object[]> obj=qr.query(conn, sql, new ArrayListHandler());
for (Object[] objects : obj) {
System.out.println(objects[0]+":"+objects[1]+":"+objects[2]);
}
conn.close();
}
- 使用MapHandler结果集
@Test
public void testMap() throws Exception {
String sql="select * from admin";
conn=JdbcUtils.getConnection();
//创建DBUtils的核心工具类对象
QueryRunner qr=new QueryRunner();
Map<String, Object> map= qr.query(conn, sql, new MapHandler());
System.out.println(map.keySet());
}
使用BeanMapHandler结果集
@Test
public void testBeanMap() throws Exception {
String sql="select * from admin";
conn=JdbcUtils.getConnection();
//创建DBUtils的核心工具类对象
QueryRunner qr=new QueryRunner();
Map<Integer,Admin>map=qr.query(conn, sql, new BeanMapHandler<Integer,Admin>(Admin.class));
System.out.println(map.keySet());
System.out.println(map);
conn.close();
}
- 使用ScalarHandler结果集
@Test
public void testScalarHandler() throws Exception {
String sql="select count(*) from admin";
conn=JdbcUtils.getConnection();
//创建DBUtils的核心工具类对象
QueryRunner qr=new QueryRunner();
System.out.println(qr.query(conn, sql, new ScalarHandler()));
}