
DAO模式、单例模式
发布日期:2021-05-10 03:44:25
浏览次数:28
分类:精选文章
本文共 7677 字,大约阅读时间需要 25 分钟。
什么是DAO
Data Access Object(数据存取对象),位于业务逻辑和持久化数据之间。DAO的作用是实现对持久化数据的访问,作为转换器将数据在实体类和数据库记录之间进行转换。
DAO模式
1、DAO接口
public interface BaseDAO { void getConn(String driver, String url, String user, String pwd); void query(String sql, String... params); boolean update(String sql, String... params); void close(); }
2、DAO实现类
public class BaseDAOImpl implements BaseDAO { private Connection conn; private PreparedStatement pst; private static ResultSet rs; public ResultSet getRs() { return rs; } @Override public void getConn(String driver, String url, String user, String pwd) { try { Class.forName(driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } try { conn = DriverManager.getConnection(url, user, pwd); } catch (SQLException e) { e.printStackTrace(); } } @Override public void query(String sql, String... params) { try { pst = conn.prepareStatement(sql); for (int i = 0; null != params && i < params.length; i++) { pst.setObject(i + 1, params[i]); } rs = pst.executeQuery(); } catch (SQLException e) { e.printStackTrace(); } } @Override public boolean update(String sql, String... params) { int num = 0; try { pst = conn.prepareStatement(sql); for (int i = 0; null != params && i < params.length; i++) { pst.setObject(i + 1, params[i]); } num = pst.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } return num > 0 ? true : false; } @Override public void close() { try { if (null != rs) { rs.close(); } if (null != pst) { pst.close(); } if (null != conn) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } }
3、实体类student
public class Student { private int stu_id; private String stu_name; private int grade_id; private String gender; private String address; private String phone; private String IDCard; @Override public String toString() { return "Student{" + "stu_id=" + stu_id + ", stu_name='" + stu_name + '\'' + ", grade_id=" + grade_id + ", gender='" + gender + '\'' + ", address='" + address + '\'' + ", phone='" + phone + '\'' + ", IDCard='" + IDCard + '\'' + '}'; } public int getStu_id() { return stu_id; } public void setStu_id(int stu_id) { this.stu_id = stu_id; } public String getStu_name() { return stu_name; } public void setStu_name(String stu_name) { this.stu_name = stu_name; } public int getGrade_id() { return grade_id; } public void setGrade_id(int grade_id) { this.grade_id = grade_id; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getIDCard() { return IDCard; } public void setIDCard(String IDCard) { this.IDCard = IDCard; } }
4、业务逻辑代码
public class StudentDao extends BaseDAOImpl { private final String DRIVER = "com.mysql.jdbc.Driver"; private final String URL = "jdbc:mysql://192.168.232.234:3306/test"; public Student getStudentById(String id) { String sql = "select * from student where stu_id=?"; getConn(DRIVER, URL, "root", "ok"); query(sql, id); ResultSet rs = getRs(); Student s = new Student(); try { if (rs.next()) { s.setStu_id(rs.getInt("stu_id")); s.setStu_name(rs.getString("stu_name")); s.setGrade_id(rs.getInt("grade_id")); s.setGender(rs.getString("gender")); s.setAddress(rs.getString("address")); s.setPhone(rs.getString("phone")); s.setIDCard(rs.getString("IDCard")); } } catch (SQLException e) { e.printStackTrace(); } finally { close(); } return s; } public void insertStudent() { String sql = "insert into student(stu_id, stu_name, grade_id) values(15, ?, ?)"; getConn(DRIVER, URL, "root", "ok"); Boolean flag = update(sql, "777", "1"); System.out.println(flag ? "插入成功" : "插入失败"); close(); } public static void main(String[] args) { StudentDao dao = new StudentDao(); Student student = dao.getStudentById("2"); System.out.println(student); StudentDao dao = new StudentDao(); dao.insertStudent(); Student student = dao.getStudentById("15"); System.out.println(student); } }
单例模式
为什么需要单例模式
BaseDAO: 操作数据库的基类。每个线程对系统操作都需new一个BaseDAO实例。初始化时的I/O操作消耗系统资源,影响系统性能。对于每个线程,可共享一个实例。
单例模式概念
系统运行期间,有且仅有一个实例。一个类只有一个实例——最基本的要求。只提供私有构造器。它必须自行创建这个实例。定义了静态的该类私有对象。它必须自行向整个系统提供这个实例。提供一个静态的公有方法,返回创建或者获取本身的静态私有对象。
单例模式-懒汉式
在类加载时不创建实例,采用延迟加载的方式,在运行调用时创建实例。特点:线程不安全,延迟加载(lazy loading)。
public class TestSingle { private static TestSingle t = null; public synchronized static TestSingle newInstance() { if (t == null) { t = new TestSingle(); } return t; } private TestSingle() {} public static void main(String[] args) { TestSingle ts = newInstance(); System.out.println(ts); TestSingle ts2 = newInstance(); System.out.println(ts2); }}
单例模式-饿汉式
在类加载的时候,就完成初始化。特点:线程安全,不具备延迟加载特性。
public class TestSingle2 { private static TestSingle2 ts = null; private TestSingle2() {} static { ts = new TestSingle2(); } public static TestSingle2 getInstance() { return ts; } public static void main(String[] args) { TestSingle2 ts1 = getInstance(); System.out.println(ts1); TestSingle2 ts2 = getInstance(); System.out.println(ts2); }}
配置文件存储数据库信息
数据库发生改变时,要重新修改代码,重新编译和部署。将数据库信息写在配置文件当中,让程序通过读取配置文件来获得这些信息。配置文件-属性文件 .properties 后缀 键值对。
读取数据库属性文件,获取数据库连接信息。新建db.properties 文件。
public class Prop { static Properties p = new Properties(); static { try { p.load(new FileInputStream("resource/db.properties")); } catch (IOException e) { e.printStackTrace(); } } public static String getValues(String key) { return p.getProperty(key); } public static void main(String[] args) { System.out.println(Prop.getValues("driver")); }}
如果不停地创建实例去加载文件,会占用资源,可以使用单例模式。
public class Prop { private static Prop prop; private static Properties p = new Properties(); private Prop() { try { p.load(new FileInputStream("resource/db.properties")); } catch (IOException e) { e.printStackTrace(); } } static { prop = new Prop(); } public static Prop getInstance() { return prop; } public static String getValues(String key) { return p.getProperty(key); } public static void main(String[] args) { System.out.println(Prop.getInstance()); System.out.println(Prop.getInstance()); System.out.println(Prop.getInstance().getValues("url")); System.out.println(Prop.getInstance().getValues("driver")); }}
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年04月29日 09时50分12秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
查找最小值栈的O(1)
2019-03-15
淘宝天猫双十一养猫组队怎么踢人
2019-03-15
Java面试题整理,闭关在家37天“吃透”这份345页PDF,纯干货
2019-03-15
概念唱片Plastic Beach封面高清壁纸
2019-03-15
旅游后期效果Ography Lightroom预设
2019-03-15
圆角几何艺术动态壁纸
2019-03-15
SpamSieve for mac(邮件过滤器)
2019-03-15
炫酷的圣诞球徽标AE模板
2019-03-15
uFocus for Mac(mac文本编辑器)
2019-03-15
2017CS231n笔记5.CNN
2019-03-15
Linux系统安装Nodejs
2019-03-15
vue项目报错集合
2019-03-15
图片链接
2019-03-15
LINUX-WIFI无线接入的一些东西
2019-03-15
word文档手写字母总会大写问题
2019-03-15
Redis中的key
2019-03-15
Andriod进阶之路 - DataBinding的简单使用
2019-03-15
juc-09-控制并发流程工具类
2019-03-15
第一节 docker安装
2019-03-15
Linux系统时间与硬件时间及时间同步
2019-03-15