简单的说DBUtils就是一个工具,一个操控数据库的组件,学过JDBC的应该都知道在对数据操控的时候代码量好大,还得注意各种双引号,一不小心就错了。DBUtils就是对JDBC的一个简单封装,目的就是简化代码量。
一般DBUtils的使用只涉及了一个QueryRunner类和它的两个方法,ResultSetHandler接口和它的两个实现类。
-
QueryRunner
- query():提供执行查询的操作
- update():提供执行插入、更新、删除的操作
-
ResultSetHandler
-
BeanHandler
-
BeanListHandler
-
先介绍下项目结构:
数据库名称:_11_20_test_java
表名:test
使用连接池:阿里巴巴的druid连接池
下面是表创建好后的内容:
数据库和连接池的创建就直接跳过了
第一步是导入DBUtil工具的jar包“commons-dbutils-1.7.jar”,这个可以直接在apache官网下载
然后创建好一个类JdbcUtil用于获取数据库的连接
import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; public class JdbcUtil { // 创建数据源对象 private static DataSource dataSource; static { // 新建一个配置文件对象 Properties properties = new Properties(); // 通过类加载器找到文件路径,读配置文件 InputStream inputStream = JdbcUtil.class.getResourceAsStream("druid/druid.properties"); // 加载属性文件 try { properties.load(inputStream); // 创建连接池对象 dataSource = DruidDataSourceFactory.createDataSource(properties); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } /* * 从连接池中获取连接 * */ public static Connection getConnect(){ Connection con = null; try { con = dataSource.getConnection(); } catch (SQLException e) { e.printStackTrace(); } return con; } public static DataSource getDataSource() { return dataSource; } public static void setDataSource(DataSource dataSource) { JdbcUtil.dataSource = dataSource; } /* * 关闭资源 * */ public static void close(Connection connection, Statement statement, ResultSet resultSet){ if(connection!=null){ try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } if(statement!=null){ try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if(resultSet!=null){ try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
因为ResultSetHandler接口是用于处理结果集的,等下通过QueryRunner查询数据时要用到,所以先记录ResultSetHandler的用法。
ResultSetHandler接口的使用
第一步:先创建一个类BaseDao,在这个类里面实现一个普通的通用的查询方法(等下也可以和RueryRunner类的查询方法对比下,看看哪个更简便)
import org.apache.commons.dbutils.ResultSetHandler; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /* * * 在该类中编写普通通用的增删改查方法 * */ public class BaseDao { // 编写一个通用的查询方法 public static Object query(String sql, ResultSetHandler<?> rsh, Object... params) throws SQLException { Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { // 获得连接 connection = JdbcUtil.getConnect(); // 预编译 preparedStatement = connection.prepareStatement(sql); // 设置参数 for (int i = 0; params != null && i < params.length; i++) { preparedStatement.setObject(i + 1, params[i]); } // 执行查询 resultSet = preparedStatement.executeQuery(); // 让调用者去实现对结果集的处理 Object obj = rsh.handle(resultSet); return obj; } catch (Exception e) { e.printStackTrace(); } finally { // 释放资源 JdbcUtil.close(connection, preparedStatement, resultSet); } return resultSet; } }
第二步:创建一个实体类User,里面的对象对应的是数据表中的属性
public class User { int id; String name; String password; 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 String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
第三步:ok现在就能创建两个自定义类用于演示BeanHandler和BeanListHandler两个类对结果集的处理
ResultSetTest类
import org.apache.commons.dbutils.ResultSetHandler; import org.apache.commons.dbutils.handlers.BeanHandler; import javax.jws.soap.SOAPBinding; import java.sql.SQLException; /* * * 用于演示BeanHandle类对结果集的处理 * */ public class ResultSetTest { public static void testBeanHandler() throws SQLException{ BaseDao baseDao = new BaseDao(); String sql = "select * from test where id=?"; User user = (User) baseDao.query(sql,new BeanHandler<Object>(User.class),3); System.out.println("id为1的User对象的名字是"+user.getName()); } }
ResultsetTest类
import org.apache.commons.dbutils.handlers.BeanListHandler; import java.sql.SQLException; import java.util.ArrayList; /* * * 演示BeanListHandler类对结果集的处理 * */ public class ResultSetListTest { public static void testBeanListHandler() throws SQLException{ BaseDao baseDao = new BaseDao(); String sql = "select * from test"; ArrayList<User> arrayList = (ArrayList<User>) baseDao.query(sql,new BeanListHandler<Object>(User.class)); for(int i=0;i<arrayList.size();i++){ System.out.println("第"+(i+1)+"条的数据的名字为:"+arrayList.get(i).getName()); } } }
现在就可以在一个主类里面测试下效果了
ResultSetHandler接口的使用没有问题的话就可以通过使用QuerryRunner类来实现增删改查了
第一步:创建一个DBUtilsDao类,实现增删改查四个方法
import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.pool.DruidDataSourceFactory; import com.sun.org.apache.xpath.internal.operations.Bool; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanListHandler; import javax.sql.DataSource; import java.sql.SQLException; import java.util.List; /* * 在这个类中实现增删改查四个方法 * * */ public class DBUtilsDao { //实现查询方法,返回List集合 public List findAll() throws SQLException { // 创建QueryRunner对象 QueryRunner queryRunner = new QueryRunner(JdbcUtil.getDataSource()); // 定义sql语句 String sql = "select * from test"; List list = (List) queryRunner.query(sql,new BeanListHandler(User.class)); return list; } //实现添加方法 public boolean insert(User user) throws SQLException { QueryRunner queryRunner = new QueryRunner(JdbcUtil.getDataSource()); String sql = "insert into test(name,password) values(?,?)"; // 用一个数组临时存放要添加进数据库中的数据 Object obj[] = {user.getName(),user.getPassword()}; int num = queryRunner.update(sql,obj); // 如果添加成功返回true,添加失败返回false; if(num>0){ return true; } return false; } //实现修改方法 public boolean update(User user) throws SQLException { QueryRunner queryRunner = new QueryRunner(JdbcUtil.getDataSource()); String sql = "update test set name=?,password=? where id=?"; Object obj[] = {user.getName(),user.getPassword(),user.getId()}; int num = queryRunner.update(sql,obj); if(num>0){ return true; } return false; } //实现删除的方法 public boolean delete(int id) throws SQLException { QueryRunner queryRunner = new QueryRunner(JdbcUtil.getDataSource()); String sql = "delete from test where id=?"; int num = queryRunner.update(sql,id); if(num>0){ return true; } return false; } }
第二步:测试DBUtilsDao类中的四个方法
import javax.swing.text.html.HTMLDocument; import java.awt.*; import java.sql.Array; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Iterator; public class Maiin { public static void main(String[] args) { // 插入内容---------------- System.out.println("插入内容----------------"); DBUtilsDao dbUtilsDao = new DBUtilsDao(); User user = new User(); user.setName("yyy"); user.setPassword("99999"); try { boolean flag = dbUtilsDao.insert(user); if(flag) System.out.println("插入内容成功"); } catch (SQLException e) { e.printStackTrace(); } // 修改内容 System.out.println("修改内容----------------"); DBUtilsDao dbUtilsDao1 = new DBUtilsDao(); User user1 = new User(); user1.setName("qqq"); user1.setPassword("1111"); user1.setId(1); try { boolean flag = dbUtilsDao1.update(user1); if (flag) System.out.println("修改内容成功"); } catch (SQLException e) { e.printStackTrace(); } // 删除内容 System.out.println("删除内容----------------"); DBUtilsDao dbUtilsDao2 = new DBUtilsDao(); try { boolean flag = dbUtilsDao2.delete(2); if (flag) System.out.println("删除内容成功"); } catch (SQLException e) { e.printStackTrace(); } // 查询内容 System.out.println("查询内容----------------"); DBUtilsDao dbUtilsDao3 = new DBUtilsDao(); try { ArrayList list = (ArrayList) dbUtilsDao3.findAll(); Iterator iterator = list.iterator(); while (iterator.hasNext()){ User u = (User) iterator.next(); System.out.println("id:"+u.getId()+",姓名:"+u.getName()+"密码:"+u.getPassword()); } } catch (SQLException e) { e.printStackTrace(); } } }
测试效果