JDBC代码简化–DBUtils
第一部分:DBUtils的介绍
使用传统的JDBC开发,冗余的代码过多。为了简化代码,使用DBUtils进行开发。
DBUtils是Java编程中的数据库操作实用工具,它封装了对JDBC的操作,简化了JDBC的操作,大大简化了代码。
第二部分:DBUtils的核心类
1.QueryRunner(DataSource ds),提供数据源(连接池),DBUtils底层会自动维护连接对象。
QueryRunner的核心方法:
update(String sql,Object...params):该方法用于执行数据的添加,删除,和更新相关操作。
query(String sql,ResultSetHandler<T> rsh,Object...params):该方法用于执行数据库的查询操作。
注:如果是调用了QueryRunner()无参的构造方法来创建QueryRunner对象,则在需要数据库进行添加,删除,更新操作就要调用update(Connection con,String sql,Object…params)方法;查询操作调用query(Connection con,String sql,ResultSetHandler rsh,Object…params)
第四部分:DBUtils的实例
4.1:添,删,改的例子
步骤:
1.导入相应的jar包,如:数据库驱动,c3p0的jar包,DBUtils的jar包.
2.编写c3p0的配置文件
3.编写c3p0的工具类,用于获取数据源
4.编写BDUtils的代码,先创建QueryRunner对象,在编写SQL语句,如果需要参数就设置参数,执行SQL语句.
c3p0的配置文件:c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<!-- 加载的类名 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<!-- 数据库的url地址 -->
<property name="jdbcUrl">jdbc:mysql://localhost:3306/mydatabase</property>
<!-- 用户名 -->
<property name="user">root</property>
<!-- 密码 -->
<property name="password">123</property>
<property name="maxIdleTime">30</property>
<!-- 最大连接数 -->
<property name="maxPoolSize">100</property>
<!-- 最小连接数 -->
<property name="minPoolSize">10</property>
<!-- 控制数据源中PreparedStatement的对象数量 -->
<property name="maxStatements">200</property>
</default-config>
<!-- This app is massive! -->
<named-config name="mysql">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/mydatabase</property>
<property name="user">root</property>
<property name="password">123</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
</named-config>
</c3p0-config>
c3p0的工具类:
package com.wgy.JDBC.Utils;
import java.sql.Connection;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class C3P0Utils {
// 创建下面的类会自动加载位于src目录下的配置文件(c3p0-config.xml),并且加载名字为MySQL的数据
// ComboPooledDataSource dataSource2 = new ComboPooledDataSource("mysql");
private static ComboPooledDataSource dataSource = new ComboPooledDataSource("mysql");
private static Connection con = null;
public static ComboPooledDataSource getComboPooledDataSource() {
return dataSource;
}
public static Connection getConnection() {
try {
return dataSource.getConnection();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
DBUtils的测试类:
package com.wgy.JDBC.Datasource.Test;
import java.sql.SQLException;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.junit.Test;
import com.wgy.JDBC.Utils.C3P0Utils;
public class DBUtilsTest {
//使用DBUtils实现数据的删除
@Test
public void DelectUser(){
try {
QueryRunner qr = new QueryRunner(C3P0Utils.getComboPooledDataSource());
String sql = "DELETE FROM new_user_table WHERE uid = ?";
Object[] params = {13};
int rows = qr.update(sql, params);
if(rows>0){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//使用DBUtils实现数据的更行
@Test
public void updateUser(){
try {
QueryRunner qr = new QueryRunner(C3P0Utils.getComboPooledDataSource());
String sql = "update new_user_table set uage = ? where uid = ?";
Object[] pararms = {20,13};
int rows = qr.update(sql, pararms);
if(rows>0){
System.out.println("更新成功");
}else{
System.out.println("更新失败");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//使用DBUtils實現數據的添加
@Test
public void InsertUser(){
try {
QueryRunner qr = new QueryRunner(C3P0Utils.getComboPooledDataSource());
//編寫sql語句
String sql = "insert into new_user_table values(null,?,?)";
//設置參數
Object[] params = {"汾九",1};
//執行SQL語句
int rows = qr.update(sql,params);
if(rows>0){
System.out.println("插入成功");
}else{
System.out.println("插入失敗");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
4.2:查询的例子
步骤:
1.导入相应的jar包,如:数据库驱动,c3p0的jar包,DBUtils的jar包.
2.编写c3p0的配置文件
3.编写c3p0的工具类,用于获取数据源
4.编写BDUtils的代码,先创建QueryRunner对象,在编写SQL语句,如果需要参数就设置参数,执行SQL语句.
c3p0的配置文件:c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<!-- 加载的类名 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<!-- 数据库的url地址 -->
<property name="jdbcUrl">jdbc:mysql://localhost:3306/mydatabase</property>
<!-- 用户名 -->
<property name="user">root</property>
<!-- 密码 -->
<property name="password">123</property>
<property name="maxIdleTime">30</property>
<!-- 最大连接数 -->
<property name="maxPoolSize">100</property>
<!-- 最小连接数 -->
<property name="minPoolSize">10</property>
<!-- 控制数据源中PreparedStatement的对象数量 -->
<property name="maxStatements">200</property>
</default-config>
<!-- This app is massive! -->
<named-config name="mysql">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/mydatabase</property>
<property name="user">root</property>
<property name="password">123</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
</named-config>
</c3p0-config>
c3p0的工具类:
package com.wgy.JDBC.Utils;
import java.sql.Connection;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class C3P0Utils {
// 创建下面的类会自动加载位于src目录下的配置文件(c3p0-config.xml),并且加载名字为MySQL的数据
// ComboPooledDataSource dataSource2 = new ComboPooledDataSource("mysql");
private static ComboPooledDataSource dataSource = new ComboPooledDataSource("mysql");
private static Connection con = null;
public static ComboPooledDataSource getComboPooledDataSource() {
return dataSource;
}
public static Connection getConnection() {
try {
return dataSource.getConnection();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
DBUtils的测试类:
package com.wgy.JDBC.Datasource.Test;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;
import com.wgy.JDBC.Utils.C3P0Utils;
import com.wgy.domain.User;
public class DBUtilsTestQuery {
// 查询所有对象
@Test
public void QueryUserAll() {
try {
// 1.获取核心类QueryRunner
QueryRunner qr = new QueryRunner(C3P0Utils.getComboPooledDataSource());
// 2.编写SQL语句
String sql = "select * from new_user_table";
// 3.执行SQL语句
List<User> list = qr.query(sql, new BeanListHandler<User>(User.class));
for (User user : list) {
System.out.println(user.getUid() + "," + user.getUname() + "," + user.getUage());
}
} catch (SQLException e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
}
//通过id查询对象
@Test
public void QueryUserById(){
try {
//1.创建核心类
QueryRunner qr = new QueryRunner(C3P0Utils.getComboPooledDataSource());
//2.编写SQL语句
String sql = "select * from new_user_table where uid = ?";
//3.设置参数
int id = 2;
//4.执行SQL语句
User user = qr.query(sql, id, new BeanHandler<User>(User.class));
System.out.println(user.getUid() + "," + user.getUname() + "," + user.getUage());
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//查询所有用户的数量
@Test
public void QueryCount(){
try {
QueryRunner qr = new QueryRunner(C3P0Utils.getComboPooledDataSource());
String sql = "select count(*) from new_user_table";
long count = (long) qr.query(sql, new ScalarHandler());
System.out.println(count);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
注:在使用QueryRunner方法调用query方法时,处理器的选择标准如下:
1. MapHandler:单行处理器!把结果集转换成Map<String,Object>,其中列名为键!
2. MapListHandler:多行处理器!把结果集转换成List<Map<String,Object>>;
3. BeanHandler:单行处理器!把结果集转换成Bean,该处理器需要Class参数,即Bean的类型;
4. BeanListHandler:多行处理器!把结果集转换成List<Bean>;
5. ColumnListHandler:多行单列处理器!把结果集转换成List<Object>,使用ColumnListHandler时需要指定某一列的名称或编号,例如:new ColumListHandler(“name”)表示把name列的数据放到List中。
6. ScalarHandler:单行单列处理器!把结果集转换成Object。一般用于聚集查询,例如select count(*) from tab_student。