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、保存到数组、保存到集合)
-