当前位置: 移动技术网 > IT编程>开发语言>Java > Dao设计模式简单实现

Dao设计模式简单实现

2019年11月27日  | 移动技术网IT编程  | 我要评论

一、什么是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包进行代码的测试。创建好后的目录结构如下:

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

  根据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 }

  执行结果如下:

  最终的目录结构如下:

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网