如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC开发,我们使用apache commons组件一个成员:DButils开发工具包进行开发。需要使用的技术:连接池(获得连接),sql语句。
DBUtils三大核心功能:
- QueryRunner中提供对SQL语句操作的API。
- ResultSetHandler接口,用于定义select操作后,怎么封装结果集。
- dbUtils类,它就是一个工具类,定义了关闭资源与事务处理方法。
QueryRunner核心类:
- new QueryRunner(DataSource ds) 提供数据源(连接池),dbutils底层自动维护连接connection。
- update(String sql,Object.....params),执行更新数据
- query(String sql ,ResultSetHandler<T> rsh,Object.....params) ,执行查询。
ResultSetHandler结果集处理类:
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时需要指定某一列的名称或编号,例如:new ColumListHandler(“name”)表示把name列的数据放到List中。
- ScalarHandler:单行单列处理器!把结果集转换成Object。一般用于聚集查询,例如select count(*) from tab_student。
DButils工具类:
- closeQuietly(Connection conn)关闭连接,如果有异常try后不抛。
- commitAndCloseQuietly(Connection conn) 提交并关闭连接。
- rollbackAndCloseQuietly(Connection conn)回滚并关闭连接。
代码:
这里使用C3P0连接池,
导包:commons-dbutils-1.4包 , mysql-connector-java-5.0.4-bin 驱动包,c3p0-0.9.1.2连接池包
准备c3p0-config.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config><!-- 加载默认的配置 --><default-config><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql:///web08</property><property name="user">root</property><property name="password">root</property><property name="initialPoolSize">5</property><property name="maxPoolSize">20</property></default-config><!-- 加载有名称的配置 --><named-config name="itheima"><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql:///web08</property><property name="user">root</property><property name="password">root</property></named-config></c3p0-config>
准备 C3P0Utils 工具类
package cn.itheima.jdbc.utils;import java.sql.Connection;
import java.sql.SQLException;import javax.sql.DataSource;import com.mchange.v2.c3p0.ComboPooledDataSource;public class C3P0Utils {//加载无参的配置//private static ComboPooledDataSource dataSource = new ComboPooledDataSource("itheima");//加载的是有名的配置private static ComboPooledDataSource dataSource = new ComboPooledDataSource("itheima");public static DataSource getDataSource() {return dataSource;}public static Connection getConnection() {try {return dataSource.getConnection();} catch (SQLException e) {throw new RuntimeException(e);}}
}
测试类:
package cn.itheima.jdbc.test;import java.sql.SQLException;import org.apache.commons.dbutils.QueryRunner;
import org.junit.Test;import cn.itheima.jdbc.utils.C3P0Utils;/*** 测试DBUtils工具类的增删改操作* * @author Never Say Never* @date 2016年7月31日* @version V1.0*/
public class TestDBUtils1 {/*** 添加所有用户方法*/@Testpublic void testAddUser() {try {// 1.创建核心类QueryRunnerQueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());// 2.编写SQL语句String sql = "insert into tbl_user values(null,?,?)";// 3.为站位符设置值Object[] params = { "余淮", "耿耿" };// 4.执行添加操作int rows = qr.update(sql, params);if (rows > 0) {System.out.println("添加成功!");} else {System.out.println("添加失败!");}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** 根据id修改用户方法* */@Testpublic void testUpdateUserById() {try {// 1.创建核心类QueryRunnerQueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());// 2.编写SQL语句String sql = "update tbl_user set upassword=? where uid=?";// 3.为站位符设置值Object[] params = { "xxx", 21 };// 4.执行添加操作int rows = qr.update(sql, params);if (rows > 0) {System.out.println("修改成功!");} else {System.out.println("修改失败!");}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** 根据id删除用户方法*/@Testpublic void testDeleteUserById() {try {// 1.创建核心类QueryRunnerQueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());// 2.编写SQL语句String sql = "delete from tbl_user where uid=?";// 3.为站位符设置值Object[] params = {19};// 4.执行添加操作int rows = qr.update(sql, params);if (rows > 0) {System.out.println("删除成功!");} else {System.out.println("删除失败!");}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//---------------------------查询--------------------------------------------/** 查询所有用户方法*/@Testpublic void testQueryAll() {try {// 1.获取核心类queryRunnerQueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());// 2.编写sql语句String sql = "select * from tbl_user";// 3.执行查询操作List<User> users = qr.query(sql, new BeanListHandler<User>(User.class));// 4.对结果集集合进行遍历for (User user : users) {System.out.println(user.getUname() + " : " + user.getUpassword());}} catch (SQLException e) {throw new RuntimeException(e);}}/** 根据id查询用户方法*/@Testpublic void testQueryUserById() {try {// 1.获取核心类queryRunnerQueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());// 2.编写sql语句String sql = "select * from tbl_user where uid=?";//3.为占位符设置值Object[] params = {21};// 4.执行查询操作User user = qr.query(sql, new BeanHandler<User>(User.class), params);System.out.println(user.getUname() + " : " + user.getUpassword());} catch (SQLException e) {throw new RuntimeException(e);}}/** 根据所有用户的总个数*/@Testpublic void testQueryCount() {try {// 1.获取核心类queryRunnerQueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());// 2.编写sql语句String sql = "select count(*) from tbl_user";// 4.执行查询操作Long count = (Long) qr.query(sql, new ScalarHandler());System.out.println(count);} catch (SQLException e) {throw new RuntimeException(e);}}/** 查询所有用户方法*/@Testpublic void testQueryAll1() {try {// 1.获取核心类queryRunnerQueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());// 2.编写sql语句String sql = "select * from tbl_user";// 3.执行查询操作List<Map<String, Object>> list = qr.query(sql, new MapListHandler());// 4.对结果集集合进行遍历for (Map<String, Object> map : list) {System.out.println(map);}} catch (SQLException e) {throw new RuntimeException(e);}}/** 查询所有用户方法*/@Testpublic void testQueryAll2() {try {// 1.获取核心类queryRunnerQueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());// 2.编写sql语句String sql = "select * from tbl_user";// 3.执行查询操作List<Object> list = qr.query(sql, new ColumnListHandler("uname"));// 4.对结果集集合进行遍历for (Object object : list) {System.out.println(object);}} catch (SQLException e) {throw new RuntimeException(e);}}}