實際開發中,JavaWeb開發代碼通常分爲三層,分層結構是JavaWeb開發中的一種設計思想,這樣會讓咱們開發井井有條,每一層只要完成對應的功能便可,使得項目便於開發和維護java
1 . Web層/表現層 : 主要接受前臺瀏覽器用戶的參數,給瀏覽器響應數據等等mysql
Service層/業務成/服務層:主要處理業務功能,日誌,權限,事物,等等sql
DAO層/持久層 :專門負責和數據庫交互,數據處理相關代碼數據庫
DAO : Data Access Object 數據訪問對象瀏覽器
實際開發中 : 用戶請求到-Web層--->Service層-->DAO層dom
使用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); }
好處:將全部操做寫在一塊兒,對我這種菜鳥來講是一目瞭然的,比較好理解
缺點:這種針對單表的增刪改查操做把不少數據都寫‘死’了(代碼可維護性低),並且裏面不少重複的代碼(註冊,鏈接,異常處理都是同樣的),雞肋代碼操做繁瑣