zoukankan      html  css  js  c++  java
  • dao层结构的设计方案

    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 <T> int save(Connection conn,String sql,Class<T> 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 <T> 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<Object> ids) throws Exception {
     53         Iterator<Object> 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> T selectOne(Connection conn,String sql,Class<T> 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 <T> List<T> selectList(Connection conn,String sql,Class<T> clz,Object...params) throws Exception {
     97         List<T> list = new ArrayList<T>();
     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<T> {
     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 Exception
    14      */
    15     public int update(T vo) throws Exception;
    16     /**
    17      *     根据编号删除数据
    18      * @param empno 要删除的数据的编号
    19      * @return 删除的行数
    20      * @throws Exception
    21      */
    22     public int deleteBuId(Object id) throws Exception;
    23     /**
    24      *     实现批量删除数据
    25      * @param empnos 保存了要删除的数据的编号的集合
    26      * @return 删除的行数
    27      * @throws Exception
    28      */
    29     public int deleteBatch(List<Object> ids) throws Exception;
    30     /**
    31      *     根据编号查询数据
    32      * @param id 要查询的数据编号
    33      * @return 如有数据对象返回数据对象 否则返回 null
    34      * @throws Exception
    35      */
    36     public T selectById(Object id) throws Exception;
    37     /**
    38      *     根据姓名模糊分页查询
    39      * @param kw 模糊查询的关键字
    40      * @param cp 当前页
    41      * @param ls 每页显示的数据量
    42      * @return 返回保存了 Emp 对象的集合
    43      * @throws Exception
    44      */
    45     public List<T> selectSplitAll(String kw,Integer cp,Integer ls) throws Exception;
    46     /**
    47      *     统计数据量
    48      * @param kw 模糊查询的关键字
    49      * @return 返回查询到的数据量
    50      * @throws Exception
    51      */
    52     public int selectCount(String kw) throws Exception;
    53 }

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

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

    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     @Override
    12     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     @Override
    18     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     @Override
    24     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     @Override
    30     public int deleteBatch(List<Object> ids) throws Exception {
    31         StringBuffer sql = new StringBuffer("DELETE FROM emp WHERE empno IN(");
    32         return super.removeBatch(conn, sql, ids);
    33     }
    34 
    35     @Override
    36     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     @Override
    42     public List<Emp> 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     @Override
    49     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<Object> list = new ArrayList<Object>();
    //        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<Emp> 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%"));
        }
    }
  • 相关阅读:
    andriod的数据传递方法
    Activity生命周期详解
    android 和主线程有关的小问题
    java解析Excel(xls、xlsx两种格式)
    菜鸟感想一
    springboot 填坑一 springboot java.sql.SQLException: Access denied for user ''@'localhost' (using password: NO)
    git 第一次提交至仓库
    andriod studio报错 Emulator: emulator: ERROR: x86 emulation currently requires hardware acceleration! Emulator: Process finished with exit code 1
    通过以太坊发行代币(token)
    nginx+tomcat 配置负载均衡集群 (转载)
  • 原文地址:https://www.cnblogs.com/yslf/p/10732079.html
Copyright © 2011-2022 走看看