Dao层设计
实际开发中,JavaWeb开发代码一般分为三层,分层结构是JavaWeb开发中的一种设计思想,这样会让我们开发层次分明,每一层只要完成对应的功能即可,使得项目便于开发和维护
1 . Web层/表现层 : 主要接受前台浏览器用户的参数,给浏览器响应数据等等
-
Service层/业务成/服务层:主要处理业务功能,日志,权限,事物,等等
-
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); }
好处:将所有操作写在一起,对我这种菜鸟来说是一目了然的,比较好理解
缺点:这种针对单表的增删改查操作把很多数据都写‘死’了(代码可维护性低),而且里面很多重复的代码(注册,连接,异常处理都是一样的),鸡肋代码操作繁琐