JDBC之DbUtils

Dao代码重构
  • 代码重构原则:

    • 同一类中:

      ​ 提取为公共方法,不同的地方用参数传递进去

    • 不同类只

      ​ 提取为公共类

DbUtils
  • 有什么用?

    上面写Dao代码重构,就是把 DomainDaoImpl 类中的增删改 和 查、查询所有的操作出来,放入自己手写工具类中。现在,不用手写了,直接用别人写好的。

  • 如何用?

    • 在lib文件夹中导入

    • 直接上代码

      • DaoUtil工具类
      public class DaoUtil {
          private static DataSource ds = null;
          static {
              try {
                  // 读取配置文件
                  Properties p = new Properties();
                  p.load(new FileInputStream("source/db.properties"));
                	// 获取ds 对象
                  ds = DruidDataSourceFactory.createDataSource(p);
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
          // 获取 db 对象
          public static DataSource getDs(){
              return ds;
          }
      }
      
      • CategoryImpl 实现类:简单的增删改查操作
      package com.zhj.jdbc.dao.impl;
      
      import com.zhj.jdbc.dao.CategoryDao;
      import com.zhj.jdbc.dao.daoutil.DaoUtil;
      import com.zhj.jdbc.domain.Category;
      import org.apache.commons.dbutils.QueryRunner;
      import org.apache.commons.dbutils.handlers.ArrayHandler;
      import org.apache.commons.dbutils.handlers.BeanHandler;
      import org.apache.commons.dbutils.handlers.BeanListHandler;
      import org.apache.commons.dbutils.handlers.MapListHandler;
      
      import java.sql.SQLException;
      import java.util.List;
      import java.util.Map;
      
      public class CategoryImpl implements CategoryDao {
          // 增
          @Override
          public void add(Category category) {
              String sql = "insert into category (cid,cname)values(?,?)";
              try {
                  QueryRunner qr = new QueryRunner(DaoUtil.getDs());
                  qr.update(sql,category.getCid(),category.getCname());
              } catch (SQLException throwables) {
                  throwables.printStackTrace();
              }
          }
          // 删
          @Override
          public void delete(int id) {
              String sql = "delete from category where id = ?";
              try {
                  QueryRunner qr = new QueryRunner(DaoUtil.getDs());
                  qr.update(sql,id);
              } catch (SQLException throwables) {
                  throwables.printStackTrace();
              }
          }
          // 改
          @Override
          public void set(int id, Category category) {
              String sql = "update category set cid = ?,cname = ? where id = ?";
              try {
                  QueryRunner qr = new QueryRunner(DaoUtil.getDs());
                  qr.update(sql,category.getCid(),category.getCname(),id);
              } catch (SQLException throwables) {
                  throwables.printStackTrace();
              }
          }
          // 查
          @Override
          public Category get(int id) {
              String sql = "select * from category where id = ?";
              QueryRunner qr = new QueryRunner(DaoUtil.getDs());
      
              try {
                  return (Category) qr.query(sql,new BeanHandler<>(Category.class),id);
              } catch (SQLException throwables) {
                  throwables.printStackTrace();
              }
              return null;
      
          }
          // 查所有
          @Override
          public List getAll() {
              String sql = "select * from category ";
              QueryRunner qr = new QueryRunner(DaoUtil.getDs());
      
              try {
      
                  return (List<Category>) qr.query(sql,new BeanListHandler<>(Category.class));
              } catch (Exception e) {
                  e.printStackTrace();
              }
              return null;
          }
      }
      
      • 测试
      package com.zhj.jdbc.test;
      
      import com.zhj.jdbc.dao.CategoryDao;
      import com.zhj.jdbc.dao.impl.CategoryImpl;
      import com.zhj.jdbc.dao.impl.StudentDaoImpl;
      import com.zhj.jdbc.domain.Category;
      import com.zhj.jdbc.domain.Student;
      import org.junit.Test;
      
      public class CategoryTest {
          @Test
          public void addTest() {
              CategoryImpl ci = new CategoryImpl();
              Category c = new Category("3","西方如来佛");
              ci.add(c);
      
          }
          @Test
          public void deleteTest() {
              CategoryImpl ci = new CategoryImpl();
              ci.delete(2);
      
          }
          @Test
          public void setTest() {
              CategoryImpl ci = new CategoryImpl();
              Category c = new Category("李四","1");
              ci.set(1,c);
          }
          @Test
          public void getTest() {
              CategoryDao cd = new CategoryImpl();
              System.out.println(cd.get(1));
      
          }
          @Test
          public void getAllTest() {
              CategoryDao cd = new CategoryImpl();
      
              System.out.println(cd.getAll());
      
          }
      }
      
  • DbUtils官方文档:https://commons.apache.org/proper/commons-dbutils/apidocs/index.html

  • 三个核心类

    • DbUtils:连接数据库对象–jdbc辅助方法的集合类,线程安全

      ​ 构造方法: DbUtils()

      ​ 作用: 控制连接,控制驱动

    • QueryRunner:SQl语句操作对象,可以设置查询结果的的封装策略,线程安全

      ​ 构造方法: QueryRunner() 和 QueryRunner(DatabaseSource ds)

      传与不传数据源对象的区别?

      ​ 1.传递数据源对象:

      ​ 之后执行的sql语句无需再传递数据源对象,这时候每个sql语句单独使用一个数据源对象(可以理解为无法控制的事务)

      ​ 2.不传连接数据源对象

      ​ 之后执行的sql语句执行都要传递数据源对象,这样可以保证每条sql语句共用一个数据源对象(与当前线程绑定的连接对象,统一执行事务)

    • ResultSetHandle:封装数据的策略对象------将封装结果集中的数据,转换到另一个对象

      策略:封装数据到对象的方式(示例:将数据库保存在User、保存到数组、保存到集合)

你可能感兴趣的:(java)