Dao層設計

實際開發中,JavaWeb開發代碼通常分爲三層,分層結構是JavaWeb開發中的一種設計思想,這樣會讓咱們開發井井有條,每一層只要完成對應的功能便可,使得項目便於開發和維護java

1 . Web/表現層 : 主要接受前臺瀏覽器用戶的參數,給瀏覽器響應數據等等mysql

  1. Service/業務成/服務層:主要處理業務功能,日誌,權限,事物,等等sql

  2. DAO/持久層 :專門負責和數據庫交互,數據處理相關代碼數據庫

DAO Data Access Object 數據訪問對象瀏覽器

實際開發中 : 用戶請求到-Web--->Service-->DAOdom

使用Dao之後代碼以及包的設計結構:ide

(1)dao層接口命名包工具

公司域名倒寫+項目名稱/模塊名稱+dao測試

如 : cn.sxt.crm.daospa

 

 

 

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

好處:將全部操做寫在一塊兒,對我這種菜鳥來講是一目瞭然的,比較好理解

缺點:這種針對單表的增刪改查操做把不少數據都寫‘死’了(代碼可維護性低),並且裏面不少重複的代碼(註冊,鏈接,異常處理都是同樣的),雞肋代碼操做繁瑣

相關文章
相關標籤/搜索