博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
dao层结构的设计方案
阅读量:6999 次
发布时间:2019-06-27

本文共 9003 字,大约阅读时间需要 30 分钟。

dao 层结构的设计方案

包和类的分配结构

1.新建一个项目

2.导入相关的开发包 (比如驱动包等)
3.定义出包的结构
4.将连接数据库的连接工具放到 util 包中
5.创建 Emp(简单 JAVA类, VO类, 实体类,JavaBean) 对象 (该对象放到 vo 包中)
6.开发 dao 层的接口 IEmpDAO (操作标准, 放入dao 包中)
dao 层需要自己的接口为了解耦合 (同样的 service 也有自己的接口).
7. 开发出父工具类(此类父工具类中的方法都是泛型方法,因为要让不同的子类使用工具类中的方法)

1 public class BaseDAOUtil {  2     private PreparedStatement pst;  3     private ResultSet rst;  4   5     public 
int save(Connection conn,String sql,Class
clz,T vo) throws Exception { 6 pst = conn.prepareStatement(sql); 7 //为 sql 设置占位符 (insert into 表(字段1,字段2,字段3,) VALUES(?,?,?)) 8 String[] columns = sql.split("\\(")[1].split("\\)")[0].split(","); 9 for (int i = 0; i < columns.length; i++) { 10 Field f = vo.getClass().getDeclaredField(columns[i]); 11 //打开访问权限 12 f.setAccessible(true); 13 //取得字段对应的属性值 14 Object fvalue = f.get(vo); 15 pst.setObject(i+1, fvalue); 16 } 17 return pst.executeUpdate(); 18 } 19 public
int edit(Connection conn,String sql,T vo) throws Exception { 20 pst = conn.prepareStatement(sql); 21 //UPDATE emp SET sal=?,job=?,comm=? WHERE empno=? AND ; 22 String[] strs = sql.split("SET")[1].split("WHERE")[0].split(","); 23 int i = 0; 24 for (i = 0; i < strs.length; i++) { 25 //获取要修改的字段名称 26 String column = strs[i].split("=")[0]; 27 //通过反射获取 column 对应在 vo 中的属性对象 28 Field f = vo.getClass().getDeclaredField(column.trim()); 29 f.setAccessible(true); 30 //取得该字段在vo 对象中的值 31 Object fvalue = f.get(vo); 32 //为占位符设置具体的内容 33 pst.setObject(i+1, fvalue); 34 } 35 String conditions = sql.split("WHERE")[1].split("=")[0]; 36 Field f = vo.getClass().getDeclaredField(conditions.trim()); 37 f.setAccessible(true); 38 //取得该字段在vo 对象中的值 39 Object fvalue = f.get(vo); 40 pst.setObject(i+1, fvalue); 41 return pst.executeUpdate(); 42 } 43 44 45 public int removeBuId(Connection conn,String sql,Object id) throws Exception { 46 pst = conn.prepareStatement(sql); 47 pst.setObject(1, id); 48 return pst.executeUpdate(); 49 } 50 51 52 public int removeBatch(Connection conn,StringBuffer sql,List
ids) throws Exception { 53 Iterator iter = ids.iterator(); 54 55 while (iter.hasNext()) { 56 sql.append(iter.next() + ",") ; 57 } 58 sql.delete(sql.length()-1, sql.length()); 59 sql.append(")"); 60 61 pst = conn.prepareStatement(sql.toString()); 62 63 return pst.executeUpdate(); 64 } 65 66 /* 67 * 根据编号查询数据 68 */ 69 public
T selectOne(Connection conn,String sql,Class
clz,Object id) throws Exception { 70 pst = conn.prepareStatement(sql); 71 pst.setObject(1, id); 72 //执行 sql 语句 73 rst = pst.executeQuery(); 74 75 T t = null; 76 if (rst.next()) { 77 t=clz.newInstance(); 78 //取得所有属性 79 Field[] fs = clz.getDeclaredFields(); 80 for (Field f : fs) { 81 //打开访问权限 82 f.setAccessible(true); 83 //取得属性名 84 String fname = f.getName(); 85 //使用该属性名称从结果集中取得数据 86 Object fvalue = rst.getObject(fname); 87 //将取得的值保存给 t 对象的属性 88 f.set(t, fvalue); 89 } 90 return t; 91 } 92 return null; 93 } 94 95 96 public
List
selectList(Connection conn,String sql,Class
clz,Object...params) throws Exception { 97 List
list = new ArrayList
(); 98 pst = conn.prepareStatement(sql); 99 100 for (int i = 0; i < params.length; i++) {101 pst.setObject(i+1, params[i]);102 }103 //执行 sql 语句104 rst = pst.executeQuery();105 T t = null;106 while (rst.next()) {107 t = clz.newInstance();108 //取得所有属性109 Field[] fs = clz.getDeclaredFields();110 for (Field f : fs) {111 //打开访问权限112 f.setAccessible(true);113 //取得属性名114 String fname = f.getName();115 //使用该属性名称从结果集中取得数据116 Object fvalue = rst.getObject(fname);117 //将取得的值保存给 t 对象的属性118 f.set(t, fvalue);119 }120 list.add(t);121 }122 return list;123 }124 125 public int selectCount(Connection conn,String sql,Object...params) throws Exception {126 pst = conn.prepareStatement(sql);127 for (int i = 0; i < params.length; i++) {128 pst.setObject(i+1, params[i]);129 }130 //执行 sql 语句131 rst = pst.executeQuery();132 rst.next();133 return rst.getInt(1);134 }135 }

8.定义父接口

1 public interface IBaseDAO
{ 2 /** 3 * 增加数据 4 * @param vo 保存了药插入数据的对象 5 * @return 增加的行数 6 * @throws Exception 7 */ 8 public int insert(T vo) throws Exception; 9 /**10 * 修改数据11 * @param vo 保存了要修改的数据的对象12 * @return 修改的行数13 * @throws Exception14 */15 public int update(T vo) throws Exception;16 /**17 * 根据编号删除数据18 * @param empno 要删除的数据的编号19 * @return 删除的行数20 * @throws Exception21 */22 public int deleteBuId(Object id) throws Exception;23 /**24 * 实现批量删除数据25 * @param empnos 保存了要删除的数据的编号的集合26 * @return 删除的行数27 * @throws Exception28 */29 public int deleteBatch(List
ids) throws Exception;30 /**31 * 根据编号查询数据32 * @param id 要查询的数据编号33 * @return 如有数据对象返回数据对象 否则返回 null34 * @throws Exception35 */36 public T selectById(Object id) throws Exception;37 /**38 * 根据姓名模糊分页查询39 * @param kw 模糊查询的关键字40 * @param cp 当前页41 * @param ls 每页显示的数据量42 * @return 返回保存了 Emp 对象的集合43 * @throws Exception44 */45 public List
selectSplitAll(String kw,Integer cp,Integer ls) throws Exception;46 /**47 * 统计数据量48 * @param kw 模糊查询的关键字49 * @return 返回查询到的数据量50 * @throws Exception51 */52 public int selectCount(String kw) throws Exception;53 }

9.让子接口实现父接口的时候给出具体泛型

public interface IDeptDAO extends IBaseDAO
{ //定义子接口特有的方法}public interface IEmpDAO extends IBaseDAO
{ //定义子接口特有的方法}

10让子类继承父工具类的同时实现自己的子接口

1 public class EmpDAOImpl extends BaseDAOUtil implements IEmpDAO { 2     private Connection conn; 3     public EmpDAOImpl() { 4         super(); 5     } 6     public EmpDAOImpl(Connection conn) { 7         super(); 8         this.conn = conn; 9     }10 11     @Override12     public int insert(Emp vo) throws Exception {13         String sql = "INSERT INTO emp(empno,ename,job,sal,hiredate,mgr,comm,deptno)" + " VALUES(?,?,?,?,?,?,?,?)";14         return super.save(conn, sql, Emp.class, vo);15     }16 17     @Override18     public int update(Emp vo) throws Exception {19         String sql = "UPDATE emp SET ename=?,job=?,sal=?,hiredate=?,mgr=?,comm=?,deptno=? WHERE empno=?";20         return super.edit(conn, sql, vo);21     }22 23     @Override24     public int deleteBuId(Object id) throws Exception {25         String sql = "DELETE FROM emp WHERE empno=?";26         return super.removeBuId(conn, sql, id);27     }28 29     @Override30     public int deleteBatch(List ids) throws Exception {31         StringBuffer sql = new StringBuffer("DELETE FROM emp WHERE empno IN(");32         return super.removeBatch(conn, sql, ids);33     }34 35     @Override36     public Emp selectById(Object id) throws Exception {37         String sql = "SELECT empno,ename,job,sal,hiredate,mgr,comm,deptno" + " FROM emp" + "  WHERE empno=?";38         return super.selectOne(conn, sql, Emp.class, id);39     }40 41     @Override42     public List
selectSplitAll(String kw, Integer cp, Integer ls) throws Exception {43 String sql = "SELECT empno,ename,job,sal,hiredate,mgr,comm,deptno" + " FROM emp"44 + " WHERE ename LIKE ? LIMIT ?,?";45 return super.selectList(conn, sql, Emp.class, kw,(cp-1)*ls,ls);46 }47 48 @Override49 public int selectCount(String kw) throws Exception {50 String sql = "SELECT COUNT(*)" + " FROM emp" + " WHERE ename LIKE ?";51 return super.selectCount(conn, sql, kw);52 }53 }

测试:

public class Test {    public static void main(String[] args) throws Exception {        Connection conn = DBUitl.getConnection();                IEmpDAO dao1 = new EmpDAOImpl(conn);//        IDeptDAO dao2 = new DeptDAOImpl(conn);        //        System.out.println(dao1.insert(new Emp(1115,"zhang33","音乐",9000.00,new Date(),7788,2000.00,10)));//        System.out.println(dao1.deleteBuId(1115));//        List list = new ArrayList();//        list.add(1009);//        list.add(1115);//        System.out.println(dao1.deleteBatch(list));//        System.out.println(dao1.selectById(7788));//        System.out.println(dao1.selectCount("A%"));//        List
list = dao1.selectSplitAll("%A%", 2, 5);// for (Emp emp : list) {// System.out.println(emp);// } // System.out.println(dao2.selectById(20));// System.out.println(dao2.selectCount("A%")); }}

 

转载于:https://www.cnblogs.com/yslf/p/10732079.html

你可能感兴趣的文章