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);
    }

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

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

原文地址:https://www.cnblogs.com/zhangxiong-tianxiadiyi/p/10896413.html