欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Dao设计模式简单实现

程序员文章站 2024-02-05 19:57:28
一、什么是Dao设计模式 Dao设计模式封装了操作具体数据库的细节,对业务层提供操作数据库的接口,因此降低了业务层代码与具体数据库之间的耦合,有利于人员分工,增加了程序的可移植性。 Dao设计模式中主要包含这5个模块: 1、VO类:VO(Value Object)即值对象,每一个值对象对应一张数据库 ......

一、什么是dao设计模式

  dao设计模式封装了操作具体数据库的细节,对业务层提供操作数据库的接口,因此降低了业务层代码与具体数据库之间的耦合,有利于人员分工,增加了程序的可移植性。

  dao设计模式中主要包含这5个模块:

    1、vo类:vo(value object)即值对象,每一个值对象对应一张数据库表,便于我们传递数据。

    2、dao接口:dao接口定义了操作数据库的方法,业务层通过调用这些方法来操作数据库。

    3、dao实现类:操作数据库的方法的具体实现,封装了操作数据库的细节。

    4、dao工厂类:用于代替new操作,进一步降低业务层与数据层之间的耦合。

    5、数据库连接类:封装了连接数据库、关闭数据库等常用的操作,减少重复编码。

  下面我们应用dao设计模式来实现一个简单的转账操作,加深对其的理解。

二、dao设计模式实现

  首先,我们创建vo、dao、factory、util包来分别存放dao设计模式5个模块的代码。因为我们使用的是jdbc连接mysql数据库,所以还需要创建一个lib包存放并引用jdbc驱动。除此之外,我们还需要创建一个test包进行代码的测试。创建好后的目录结构如下:

Dao设计模式简单实现

  接着设计一张user表,表中包含了用户基本信息和余额,并插入一些数据。

Dao设计模式简单实现

  根据user表在vo包中创建vo类user.java。

 1 package vo;
 2 
 3 public class user {
 4 
 5     private int id;
 6     
 7     private string username;
 8     
 9     private int sum;
10 
11     public int getid() {
12         return id;
13     }
14 
15     public void setid(int id) {
16         this.id = id;
17     }
18 
19     public string getusername() {
20         return username;
21     }
22 
23     public void setusername(string username) {
24         this.username = username;
25     }
26 
27     public int getsum() {
28         return sum;
29     }
30 
31     public void setsum(int sum) {
32         this.sum = sum;
33     }
34 
35     @override
36     public string tostring() {
37         return "user [id=" + id + ", username=" + username + ", sum=" + sum + "]";
38     }
39     
40 }

  在util包中创建数据库连接类jdbc.java。

 1 package util;
 2 
 3 import java.sql.connection;
 4 import java.sql.drivermanager;
 5 import java.sql.resultset;
 6 import java.sql.sqlexception;
 7 import java.sql.statement;
 8 
 9 public class jdbc {
10     //获取数据库链接
11     public static connection getconnection() {
12         connection con = null;
13         try {
14             string url = "jdbc:mysql://localhost:3306/user?servertimezone=asia/shanghai";
15             class.forname("com.mysql.cj.jdbc.driver");
16             con = drivermanager.getconnection(url, "root", "root");
17         } catch (exception e) {
18             e.printstacktrace();
19         }
20         return con;
21     }
22     //关闭资源
23     public static void close(connection con, statement st, resultset rs) {
24         try {
25             if (rs != null) {
26                 rs.close();
27             }
28             if (st != null) {
29                 st.close();
30             }
31             if (con != null) {
32                 con.close();
33             }
34         } catch (sqlexception e) {
35             e.printstacktrace();
36         }
37     }
38 }

  经过分析,该转账系统需要两类数据库操作,分别是“查询用户信息”和“更新用户余额”。因此我们在dao包中创建iuserdao.java接口并定义这两种方法。

 1 package dao;
 2 
 3 import java.sql.connection;
 4 import java.sql.sqlexception;
 5 
 6 import vo.user;
 7 
 8 public interface iuserdao {
 9     //根据用户名查找用户信息
10     public user selectuserbyname(connection con, user user);
11     //根据用户名更新用户余额
12     public int updatesumbyname(connection con, user user) throws sqlexception;
13 }

  接着在dao包中创建该接口的实现类userdaoimpl.java,实现这两种方法。

 1 package dao;
 2 
 3 import java.sql.connection;
 4 import java.sql.preparedstatement;
 5 import java.sql.resultset;
 6 import java.sql.sqlexception;
 7 
 8 import util.jdbc;
 9 import vo.user;
10 
11 public class userdaoimpl implements iuserdao {
12 
13     @override
14     public user selectuserbyname(connection con, user user) {
15         string sql = "select * from user where username = ?";
16         preparedstatement pstatement = null;
17         resultset rs = null;
18         try {
19             pstatement = con.preparestatement(sql);
20             pstatement.setstring(1, user.getusername());
21             rs = pstatement.executequery();
22             if (rs.next()) {
23                 user.setid(rs.getint("id"));
24                 user.setusername(rs.getstring("username"));
25                 user.setsum(rs.getint("sum"));
26                 return user;
27             }
28         } catch (sqlexception e) {
29             e.printstacktrace();
30         }finally {
31             jdbc.close(null, pstatement, rs);
32         }
33         return null;
34     }
35 
36     @override
37     public int updatesumbyname(connection con, user user) throws sqlexception {
38         string sql = "update user set sum = ? where username = ?";
39         preparedstatement pstatement = null;
40         try {
41             pstatement = con.preparestatement(sql);
42             pstatement.setint(1, user.getsum());
43             pstatement.setstring(2, user.getusername());
44             return pstatement.executeupdate();
45         } catch (sqlexception e) {
46             e.printstacktrace();
47             //抛出异常,便于进行事务处理
48             throw e;
49         }finally {
50             jdbc.close(null, pstatement, null);
51         }
52     }
53 }

  最后,我们还需要在factory包中创建dao工厂类daofactory.java。

 1 package factory;
 2 
 3 import dao.iuserdao;
 4 import dao.userdaoimpl;
 5 
 6 public class daofactory {
 7     public static iuserdao getuserdao() {
 8         return new userdaoimpl();
 9     }
10 }

  到这里,转账系统的dao层就设计好了。我们在test包中创建main.java进行测试。

 1 package test;
 2 
 3 import java.sql.connection;
 4 import java.sql.sqlexception;
 5 
 6 import dao.iuserdao;
 7 import factory.daofactory;
 8 import util.jdbc;
 9 import vo.user;
10 
11 public class main {
12 
13     public static void main(string[] args) {
14         connection con = jdbc.getconnection();
15         iuserdao userdao = daofactory.getuserdao();
16         //被转账的用户
17         user user_in = new user();
18         user_in.setusername("ysy");
19         user_in = userdao.selectuserbyname(con, user_in);
20         system.out.println(user_in);
21         //转账的用户
22         user user_out = new user();
23         user_out.setusername("管理员");
24         user_out = userdao.selectuserbyname(con, user_out);
25         system.out.println(user_out);
26         //转账30元
27         user_in.setsum(user_in.getsum() + 30);
28         user_out.setsum(user_out.getsum() - 30);
29         //事务处理
30         try {
31             con.setautocommit(false);
32             userdao.updatesumbyname(con, user_in);
33             userdao.updatesumbyname(con, user_out);
34             con.commit();
35         } catch (exception e) {
36             e.printstacktrace();
37             try {
38                 con.rollback();
39             } catch (sqlexception e1) {
40                 e1.printstacktrace();
41             }
42         }
43         //查询转账结果
44         user_in = userdao.selectuserbyname(con, user_in);
45         system.out.println(user_in);
46         user_out = userdao.selectuserbyname(con, user_out);
47         system.out.println(user_out);
48         jdbc.close(con, null, null);
49     }
50 }

  执行结果如下:

Dao设计模式简单实现

  最终的目录结构如下:

Dao设计模式简单实现