zoukankan      html  css  js  c++  java
  • Dao层设计

    实际开发中,JavaWeb开发代码一般分为三层,分层结构是JavaWeb开发中的一种设计思想,这样会让我们开发层次分明,每一层只要完成对应的功能即可,使得项目便于开发和维护

    1 . Web/表现层 : 主要接受前台浏览器用户的参数,给浏览器响应数据等等

    1. Service/业务成/服务层:主要处理业务功能,日志,权限,事物,等等

    2. DAO/持久层 :专门负责和数据库交互,数据处理相关代码

    DAO Data Access Object 数据访问对象

    实际开发中 : 用户请求到-Web--->Service-->DAO

    使用Dao以后代码以及包的设计结构:

    (1)dao层接口命名包

    公司域名倒写+项目名称/模块名称+dao

    如 : cn.sxt.crm.dao

     

     

     

    (2)dao层实现类包名

    公司域名倒写+项目名称/模块名称+dao+impl

    如 : cn.sxt.crm.dao.impl

     

     

     

    (3)dao层操作对应表接口命名

    对应表的名称 + Dao/DAO

    如 : StudentDao/DAO , TeacherDao/DAO

     

     

     

    (4)操作对应表实现类命名

    对应表的名称 + Dao/DAOImpl

    如 : StudentDaoImpl/DAOImpl , TeacherDaoImpl/DAOImpl

     

     

     

    (5)数据表对应的java类domain/pojo包命名

    公司域名倒写+项目名称/模块名称+domain/pojo

    如 : cn.sxt.crm.domain

     

     

     

    (6)项目的工具类包名

    公司域名倒写+项目名称/模块名称+util/utils

    如 : cn.sxt.crm.util/utils

     

     

     

    (7)对应的测试类包名

    公司域名倒写+项目名称/模块名称+test

    如 : cn.sxt.crm.test

     

     

     

    结构如下:

     

    dao的接口代码

    public interface StudentDao {
        int insert(Student stu);
        int delete(Integer id);
        int update(Student stu);
        Student select(Integer id);
        List<Student> selectList();
    }

    数据表对应的java类:

    public class Student {
        private Integer id;
        private String name;
        private Integer age;
            设置器访问器....
    }

    Dao层接口实现类(增,删,改):

        @Override
        public int insert(Student stu) {
            Connection conn=null;
            PreparedStatement ps=null;
            String sql="insert into t_student(name,age) values(?,?)";  //增,删,改的区别就在这句sql语句
            try {
                Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            try {
                conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/demo", "root", "root");
                ps=conn.prepareStatement(sql);
                ps.setString(1, stu.getName());
                ps.setInt(2, stu.getAge());
                ps.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (ps!=null) {
                        ps.close();
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }finally {
                    try {
                        if (conn!=null) {
                            conn.close();
                        }
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
            return 0;
        }

    Dao层接口实现类(多行查询):

    @Override
        public List<Student> selectList() {
            Connection conn=null;
            PreparedStatement ps=null;
            ResultSet rs=null;
            List<Student> stus=new ArrayList<>();  //单行查询不需要准备集合来装查询的结果
        String sql="select *from t_student";
            try {
                Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException e) {            
                e.printStackTrace();
            }
            try {
                conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/demo", "root", "root");
              ps=conn.prepareStatement(sql);
              rs=ps.executeQuery();
              while (rs.next()) {
                int id=rs.getInt("id");
                String name=rs.getString("name");
                int age=rs.getInt("age");
                Student stu=new Student(id,name,age);
                stus.add(stu);
            }
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                try {
                    if (rs!=null) {
                        rs.close();
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }finally {
                    try {
                        if (ps!=null) {
                            ps.close();    
                        }
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }finally {
                        try {
                            if (conn!=null) {
                                conn.close();
                            }
                        } catch (SQLException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
            
            
            return stus;
        }

    测试类:

     private  StudentDao dao=new StudentDaoImpl();
         @Test 增
         public void insert() throws Exception {
              Student stu=new Student(null,"luxiafeng",20);
             dao.insert(stu);
         }
          @Test 删
        public void delete() throws Exception {
            dao.delete(10);
        }
          @Test 改
        public void update() throws Exception {
            Student stu=new Student(12,"李四",90);
            dao.update(stu);
        }
          @Test 多行查询
        public void query() throws Exception {    
            List<Student> arr=dao.selectList();
            System.out.println(arr);
        }

    好处:将所有操作写在一起,对我这种菜鸟来说是一目了然的,比较好理解

    缺点:这种针对单表的增删改查操作把很多数据都写‘死’了(代码可维护性低),而且里面很多重复的代码(注册,连接,异常处理都是一样的),鸡肋代码操作繁琐

  • 相关阅读:
    通过java客户端连接hbase 注意事项
    深入HBase架构解析(一)
    Zookeeper全解析——Paxos作为灵魂
    redis常用数据结构解析
    job源码分析
    《RHEL6.3 FTP服务器虚拟用户的配置(含图)》——如此简单
    《SELinux安全上下文的管理(含图)》RedHat6.3——步骤详细、条理清晰
    什么是MBR?(含图解)
    何为软连接、何为硬链接(含图解)
    RHEL6.3 ftp服务器参数的戏说——不看白不看,看了不白看
  • 原文地址:https://www.cnblogs.com/zhangxiong-tianxiadiyi/p/10896413.html
Copyright © 2011-2022 走看看