简单的说DBUtils就是一个工具,一个操控数据库的组件,学过JDBC的应该都知道在对数据操控的时候代码量好大,还得注意各种双引号,一不小心就错了。DBUtils就是对JDBC的一个简单封装,目的就是简化代码量。
一般DBUtils的使用只涉及了一个QueryRunner类和它的两个方法和】,ResultSetHandler接口和它的两个实现类。
- QueryRunner
- query():提供执行查询的操作
- update():提供执行插入、更新、删除的操作
- ResultSetHandler
- BeanHandler
- BeanListHandler
先介绍下项目结构:
数据库名称:_11_20_test_java
表名:test
使用连接池:阿里巴巴的druid连接池
下面是表创建好后的内容:
数据库和连接池的创建就直接跳过了
先创建好一个类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()); } } }
现在就可以在一个主类里面测试下效果了
未完待续。。。。。