问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

dao的实现类(对数据库增删改查)使用单例模式好吗

发布网友 发布时间:2022-04-08 09:45

我来回答

2个回答

懂视网 时间:2022-04-08 14:06

技术分享
 1 package com.util.db;
 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 import java.util.ResourceBundle;
 9 
10 /**
11  * 数据库操作工具类
12  * @author lamp
13  *
14 */
15 public class DBUtils {
16 
17 //数据库连接地址
18 public static String URL;
19 //用户名
20 public static String USERNAME;
21 //密码
22 public static String PASSWORD;
23 //mysql的驱动类
24 public static String DRIVER;
25 
26 private static ResourceBundle rb = ResourceBundle.getBundle("com.util.db.db-config");
27 
28 private DBUtils(){}
29 
30 //使用静态块加载驱动程序
31 static{
32  URL = rb.getString("jdbc.url");
33  USERNAME = rb.getString("jdbc.username");
34  PASSWORD = rb.getString("jdbc.password");
35  DRIVER = rb.getString("jdbc.driver");
36  try {
37   Class.forName(DRIVER);
38  } catch (ClassNotFoundException e) {
39   e.printStackTrace();
40  }
41  }
42 //定义一个获取数据库连接的方法
43 public static Connection getConnection(){
44  Connection conn = null;
45  try {
46  conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
47  } catch (SQLException e) {
48   e.printStackTrace();
49  System.out.println("获取连接失败");
50  }
51  return conn;
52  }
53 
54 /**
55  * 关闭数据库连接
56  * @param rs
57  * @param stat
58  * @param conn
59 */
60 public static void close(ResultSet rs,Statement stat,Connection conn){
61  try {
62   if(rs!=null)rs.close();
63   if(stat!=null)stat.close();
64   if(conn!=null)conn.close();
65  } catch (SQLException e) {
66   e.printStackTrace();
67   }
68  }
69 
70 }
技术分享

注意:26行中,注意获取属性文件的包名是否正确。稍后会定义这个属性文件。

28行:既然是工具类,一般不要实例化,此时可以采用单例设计模式,或者将构造方法私有化。

26行:很明显可以看到,我们是将连接数据库的URL、用户名,密码等信息编写在一个属性文件(jdbc.properties)中,稍后再来定义这个属性文件。

31行:为避免重复代码,使用静态代码块:只会在类加载的时候执行一次。

42行:定义一个获取数据库连接的方法

60行:关闭数据库连接

(2)接下来新建一个属性文件,new-->file,命名为:db-config.properties,代码如下:

jdbc.url=jdbc:mysql://localhost:3306/jdbcdb
jdbc.username=root
jdbc.password=smyh
jdbc.driver=com.mysql.jdbc.Driver

以后如果需要修改配置信息,只需要在这里改就行了。注意在上面的DBUtils类中是怎么来调用这个配置信息的。

紧接着新建文件,定义好Person类:(package com.vae.domain)

技术分享
 1 package com.vae.domain;
 2 
 3 public class Person {
 4 private int id;
 5 private String name;
 6 private int age;
 7 private String description;
 8 public int getId() {
 9  return id;
10  }
11 public void setId(int id) {
12  this.id = id;
13  }
14 public String getName() {
15  return name;
16  }
17 public void setName(String name) {
18  this.name = name;
19  }
20 public int getAge() {
21  return age;
22  }
23 public void setAge(int age) {
24  this.age = age;
25  }
26 public String getDescription() {
27  return description;
28  }
29 public void setDescription(String description) {
30  this.description = description;
31  }
32 public Person(int id, String name, int age, String description) {
33  super();
34  this.id = id;
35  this.name = name;
36  this.age = age;
37  this.description = description;
38  }
39 public Person(String name, int age, String description) {
40  super();
41  this.name = name;
42  this.age = age;
43  this.description = description;
44  }
45 public Person() {
46  super();
47  // TODO Auto-generated constructor stub
48  }
49  @Override
50 public String toString() {
51  return "Person [id=" + id + ", name=" + name + ", age=" + age
52   + ", description=" + description + "]";
53  }
54 
55 
56 }
技术分享

这个Person类就是领域模型,表示是对它进行增删改查。

(3)定义PersonDao接口:专门对Person类进行操作(例如增删改查)的接口(package com.vae.dao)

技术分享
package com.vae.dao;

import java.sql.SQLException;
import java.util.List;

import com.vae.domain.Person;

public interface PersonDao {
 //添加方法
 public void add(Person p)throws SQLException;
 
 //更新方法
 public void update(Person p)throws SQLException;
 
 //删除方法
 public void delete(int id)throws SQLException;
 
 //查找方法
 public Person findById(int id)throws SQLException;
 
 //查找所有
 public List<Person> findAll()throws SQLException;
 
} 
技术分享

(4)定义PeronDaoImpl实现类 ,实现上面的PeronDao接口(package com.vae.dao.impl)

技术分享
 1 package com.vae.dao.impl;
 2 
 3 import java.sql.Connection;
 4 import java.sql.PreparedStatement;
 5 import java.sql.ResultSet;
 6 import java.sql.SQLException;
 7 import java.util.ArrayList;
 8 import java.util.List;
 9 
 10 import com.util.db.DBUtils;
 11 import com.vae.dao.PersonDao;
 12 import com.vae.domain.Person;
 13 
 14 /**
 15  * PersonDao的具体实现类
 16  * @author lamp
 17  *
 18 */
 19 public class PersonDaoImpl implements PersonDao{
 20 
 21 /**
 22  * 实现添加方法
 23 */
 24  @Override
 25 public void add(Person p) throws SQLException {
 26  Connection conn = null;
 27  PreparedStatement ps = null;
 28  String sql = "insert into person(name,age,description)values(?,?,?)";
 29  try{
 30  conn = DBUtils.getConnection();
 31  ps = conn.prepareStatement(sql);
 32  ps.setString(1, p.getName());
 33  ps.setInt(2, p.getAge());
 34  ps.setString(3, p.getDescription());
 35   ps.executeUpdate();
 36  }catch(SQLException e){
 37   e.printStackTrace();
 38  throw new SQLException("添加数据失败");
 39  }finally{
 40  DBUtils.close(null, ps, conn);
 41  }
 42  }
 43 
 44 /**
 45  * 更新方法
 46 */
 47  @Override
 48 public void update(Person p) throws SQLException {
 49  Connection conn = null;
 50  PreparedStatement ps = null;
 51  String sql = "update person set name=?,age=?,description=? where id=?";
 52  try{
 53  conn = DBUtils.getConnection();
 54  ps = conn.prepareStatement(sql);
 55  ps.setString(1, p.getName());
 56  ps.setInt(2, p.getAge());
 57  ps.setString(3, p.getDescription());
 58  ps.setInt(4, p.getId());
 59   ps.executeUpdate();
 60  }catch(SQLException e){
 61   e.printStackTrace();
 62  throw new SQLException("更新数据失败");
 63  }finally{
 64  DBUtils.close(null, ps, conn);
 65  } 
 66  }
 67 
 68 /**
 69  * 删除方法
 70 */
 71  @Override
 72 public void delete(int id) throws SQLException {
 73  Connection conn = null;
 74  PreparedStatement ps = null;
 75  String sql = "delete from person where id=?";
 76  try{
 77  conn = DBUtils.getConnection();
 78  ps = conn.prepareStatement(sql);
 79  ps.setInt(1,id);
 80  ps.executeUpdate();
 81  }catch(SQLException e){
 82  e.printStackTrace();
 83  throw new SQLException(" 删除数据失败");
 84  }finally{
 85  DBUtils.close(null, ps, conn);
 86  } 
 87 }
 88 
 89 /**
 90 * 根据ID查询一个对象
 91 */
 92 @Override
 93 public Person findById(int id) throws SQLException {
 94  Connection conn = null;
 95  PreparedStatement ps = null;
 96  ResultSet rs = null;
 97  Person p = null;
 98  String sql = "select name,age,description from person where id=?";
 99  try{
100  conn = DBUtils.getConnection();
101  ps = conn.prepareStatement(sql);
102  ps.setInt(1, id);
103  rs = ps.executeQuery();
104  if(rs.next()){
105   p = new Person();
106   p.setId(id);
107   p.setName(rs.getString(1));
108   p.setAge(rs.getInt(2));
109   p.setDescription(rs.getString(3));
110  }
111  }catch(SQLException e){
112  e.printStackTrace();
113  throw new SQLException("根据ID查询数据失败");
114  }finally{
115  DBUtils.close(rs, ps, conn);
116  }
117  return p;
118 }
119 
120 /**
121 * 查询所有数据
122 */
123 @Override
124 public List<Person> findAll() throws SQLException {
125  Connection conn = null;
126  PreparedStatement ps = null;
127  ResultSet rs = null;
128  Person p = null;
129  List<Person> persons = new ArrayList<Person>();
130  String sql = "select id,name,age,description from person";
131  try{
132  conn = DBUtils.getConnection();
133  ps = conn.prepareStatement(sql);
134  rs = ps.executeQuery();
135  while(rs.next()){
136   p = new Person();
137   p.setId(rs.getInt(1));
138   p.setName(rs.getString(2));
139   p.setAge(rs.getInt(3));
140   p.setDescription(rs.getString(4));
141   persons.add(p);
142  }
143  }catch(SQLException e){
144  e.printStackTrace();
145  throw new SQLException("查询所有数据失败");
146  }finally{
147  DBUtils.close(rs, ps, conn);
148  }
149  return persons;
150 }
151 
152 }

DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

标签:

热心网友 时间:2022-04-08 11:14

我觉的应该视情况而定,作为DAO本身使用单例模式是可以的,而且有成功案例,比如Spring的DAO就可以在一定范围内作为单例。
但是要注意的是,每次调用单例时,使用的Connection是应该不同的,原因是要保证事务的正确性,注意到这点就可以了。

我觉得没有问题,因为单例模式适合建模无状态的服务类,DAO本身是属于无状态的,所以适合使用单例模式。而每次得到Connection时都是使用DriverManager.getConnection()来得到的话就是使用新的Connection,所以两个事物之间没有使用相同的Connection,事务的安全性是能够保证的,所以应该没问题。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
新装修怎样去除异味又快又有效,洋葱和土肥皂都试过了,都没用。 新装修的店面通风多久 新店装修通风需要多久? 新装修的店面多久多久没有异味 “新店装修后臭味能持续多长时间”_百 ... 我09年的国三柴油货车,到19年7月以后还能审吗? iebook 怎样让背景音乐从第一页开始放而不是封面开始 iebook超级精灵的背景音乐和页面插入音乐,可以分别控制吗? 用iebook做电子杂志的时候怎么从头到尾设同一首音乐 iebook支持导入多首音乐吗?可不可以对每页进行音乐设置? IEBOOK 往回翻页时上一页的背景音乐怎么样才能从头开始播放而不是接... 如何用iebook连续几页不间断播放同一首音乐? oppo a59手机升级之后为什么原先微信新增的表情不见了,可以怎么恢复? 为什么OPPO手机微信表情号下面没有显示中文? oppo reno手机更新后微信新的小表情怎么都不见了? oppo怎么微信里emoji表情好多不能显示,发过去别人能看到,我自己看不到 简述胡杨林的作用 国庆去胡杨林摄影旅游团多不多,有哪些比较好的摄影旅游团? 哪里拍摄胡杨树好 夏天的沙洼胡杨讲什么 形容和田胡杨林秋天的诗句唯美 金塔胡杨林的介绍 中国最美十二秋景. 描写胡杨林的诗词有哪些? 关于歌颂胡杨精神的文字 胡杨林是什么 轻轨、动车和高铁速度哪个最快? 怎么匿名举报不通过派出所 请将火车、地铁、动车、高铁、磁悬浮速度从大到小排行? 地铁时速多少,高铁时速多少? 地铁的速度大概等于哪种火车高铁?动车? 不卡、也不占游戏内存的语音软件有没有? 大华硬盘录像机如何使用 求助:大华21系列硬盘录像机联网如何设置 大华DH-NVR2104HS-P-S1 4路网络硬盘录像机POE机设置 大华硬盘录像机如何开机 大华硬盘录像机这么联网 怎么获取录像机IP地址 请给我详细的安装方法 不详细的请不回答 大华硬盘录像机如何添加硬盘 大华21系列硬盘录像机格式化硬盘后开关显示无硬盘怎样设置,望给帮助!谢谢了!!! 大华21系列硬盘录像机硬盘管理里面没有硬盘 梦见前任婆婆坐在床头嘲讽我? 婆婆属于那种很强势的人,左右邻居都被她打过,没想到她去年为了一点小事会打我,我现在老梦见被婆婆骂的 笔记本的硬盘读不到盘了,但在转,怎么办,能修好吗? 笔记本 硬盘 坏了 磁头不归位 请教如何修复 硬盘读不到盘~电脑认不出盘就是磁头坏了? 硬盘磁头卡住该怎么解决 笔记本硬盘读不出,还有救吗? 希捷1T硬盘电脑读不出来盘,说是硬盘磁头可能坏了 我的笔记本硬盘突然就不能进系统了,BIOS下检测识别不到硬盘。我要怎么样才能找回数据呢? 笔记本摔了一下,硬盘有问题了,Bios能检测到硬盘 硬盘模式改为IDE进入PE后检测不到硬盘怎么办? 翡翠专业知识讲解视屏 翡翠的鉴别方法网上实在太多了,我想知道有没有视频的?