DBUtils是java编程中的数据库操作实用工具,小巧简单实用。
DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。
Dbutils三个核心功能介绍
- QueryRunner中提供对sql语句操作的API.
- ResultSetHandler接口,用于定义select操作后,怎样封装结果集.
- DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法
注意:DBUtils就是JDBC的简化开发工具包。需要项目导入commons-dbutils-1.6.jar才能够正常使用DBUtils工具。
QueryRunner核心类:
- QueryRunner(DataSource ds):传入参数为连接池
- update(String sql,Object...params):执行insert、update、delete操作
- query(String sql,ResultSetHandler rsh,Object...params):执行select操作
1.针对insert、delete、update操作
public void testUpdateInsert() {
Connection conn=null;
QueryRunner qr=new QueryRunner();
String sql="insert into student(sname,age) values(?,?)";
try {
conn=JDBCTools.getConnection();
qr.update(conn, sql, "zhaoliu",100);//可以执行insert、delete、update
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTools.close(null, conn);
}
}
2.针对select查询
前提:
student类
package com.jdbc.dbutils;
public class Student {
private int id;
private String name;
private int age;
public Student() {
super();
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
}
public Student(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
JDBCTools工具类
package com.jdbc.dbutils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class JDBCTools {
public static Connection getConnection() throws SQLException {
DataSource dSource=new ComboPooledDataSource("helloc3p0");
return dSource.getConnection();
}
public static void close(Statement stat,Connection conn) {
close(null,stat, conn);
}
public static void close(ResultSet rs,Statement stat,Connection conn) {
if(rs!=null) {
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if(stat!=null) {
try {
stat.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
【ResultSetHandler接口】:
注:query方法的返回值取决于ResultSetHandler的handle()方法的返回值。
class MyResultSetHandler implements ResultSetHandler{
@Override
public Object handle(ResultSet rs) throws SQLException {
// TODO Auto-generated method stub
List students=new ArrayList<>();
while(rs.next()) {
int sid=rs.getInt(1);
String sname=rs.getString(2);
int sage=rs.getInt(3);
Student stu=new Student(sid,sname,sage);
students.add(stu);
}
return students;
}
}
@Test
public void testResultSetHandler() {
query方法的返回值取决于其ResultSetHandler的handle()方法的返回值
Connection connection=null;
try {
connection=JDBCTools.getConnection();
QueryRunner qr=new QueryRunner();
String sql="select sid,sname,age from student";
Object object=qr.query(connection, sql, new MyResultSetHandler());
System.out.println(object);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally {
JDBCTools.close(null, connection);
}
}
【BeanHandler】:把结果集的第一条记录转为创建BeanHandler对象时传入的Class参数所对应的对象。
【BeanListHandler】:把结果集转为一个List,该List不为null,但可能为空集合(size()方法的返回值为0)。若SQL语句能查询到记录,List中存放创建BeanHandler传入Class对象对应的对象。
@Test
public void testBeanHandler() {
/*BeanHandler:把结果集的第一条记录转为创建BeanHandler对象时传入的Class参数所对应的对象*/
Connection connection=null;
try {
QueryRunner qr=new QueryRunner();
connection=JDBCTools.getConnection();
//注意此处SQL中的别名保持与实体类对象的属性名一致
String sql="select sid id,sname name,age from student where sid>=?";
Student student=qr.query(connection, sql, new BeanHandler<>(Student.class), 5);
System.out.println(student);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally {
JDBCTools.close(null, connection);
}
}
@Test
public void testBeanListHandler() {
/*BeanListHandler:
* 把结果集转为一个List,该List不为null,但可能为空集合(size()方法返回值为0)
* 若SQL语句能够查询到记录,List中存放创建BeanListHandler传入的Class对象对应的对象。
* */
Connection connection=null;
try {
QueryRunner qr=new QueryRunner();
connection=JDBCTools.getConnection();
//注意此处SQL中的别名保持与实体类对象的属性名一致
String sql="select sid id,sname name,age from student where sid>=?";
List students=qr.query(connection, sql, new BeanListHandler<>(Student.class), 5);
System.out.println(students);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally {
JDBCTools.close(null, connection);
}
}
【MapHandler】:返回SQL对应的第一条记录对应的Map对象,键:SQL查询的列名,值:列的值。
【MapListHandler】:将结果集转为一个Map的List,Map对应查询的一条记录,键:SQL查询的列名,值:列对应的值。
@Test
public void testMapHandler() {
/*MapHandler:返回SQL对应的第一条记录对应的Map对象
* 键:SQL查询的列名,值:列的值
* */
Connection connection=null;
try {
QueryRunner qr=new QueryRunner();
connection=JDBCTools.getConnection();
//注意此处SQL中的别名保持与实体类对象的属性名一致
String sql="select sid id,sname name,age from student";
Map students=qr.query(connection, sql, new MapHandler());
System.out.println(students);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally {
JDBCTools.close(null, connection);
}
}
@Test
public void testMapListHandler() {
/*MapListHandler:将结果集转为一个Map的List
* Map对应查询的一条记录:键:SQL查询的列名,值:列的值
* MapListHandler:返回的多条记录对应的Map的集合
* */
Connection connection=null;
try {
QueryRunner qr=new QueryRunner();
connection=JDBCTools.getConnection();
//注意此处SQL中的别名保持与实体类对象的属性名一致
String sql="select sid id,sname name,age from student";
List
【ScalarHandler】:把结果集转为一个数值(任意基本数据类型、字符串、Date等)返回。如果查询多列的值,默认返回第一列的值。
@Test
public void testScalarHandler() {
/*ScalarHandler:把结果集转为一个数值(可以是任意基本数据类型、字符串、Date等)返回
* 如果查询多列的值,默认返回第一列的值
* */
Connection connection=null;
try {
QueryRunner qr=new QueryRunner();
connection=JDBCTools.getConnection();
//注意此处SQL中的别名保持与实体类对象的属性名一致
String sql="select count(*) from student";
Object num=qr.query(connection, sql, new ScalarHandler<>());
System.out.println("ScalarHandler:"+num);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally {
JDBCTools.close(null, connection);
}
}