单例模式意图是
一个类只含有一个实例,并且只提供一个访问它的全局访问点。
我们在连接数据库时,需要创建数据库连接,而数据库的Connection是非常珍贵的资源,必须要重用,这时,我们可以用单例模式来创建Connection。
以下例子以mysql数据库连接举例。
首先,为了更方便的修改读取数据库的配置信息,我们将连接数据库时使用的驱动,数据库的用户名及密码、url地址存放于一个properties文件中(名称为db.properties)。

db.url=jdbc:mysql://localhost:3306/aa?useSSL=false&serverTimezone=UTC
db.user=root
db.password=123456
db.driver=com.mysql.cj.jdbc.Driver

建一个单例类Dbinfo 用于读取db.properties配置文件的信息,内容如下:

package com.icss.util;import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Properties;public class Dbinfo {private static Dbinfo dbinfo;//唯一的对象private  String url;private  String username;private  String password;private  String driver;public String getUrl() {return url;}public String getUsername() {return username;}    public String getPassword() {return password;}public String getDriver() {return driver;}//构造函数私有化private Dbinfo() {String fname = Dbinfo.class.getResource("/").getPath() + "/db.properties";InputStream in = null;try {in =  new FileInputStream(new File(fname));Properties pro = new Properties();//Properties类表示一组持久的属性。 Properties可以保存到流中或从流中加载。 属性列表中的每个键及其对应的值都是一个字符串。 pro.load(in);//从输入字节流读取属性列表(键和元素对)。//读取db.properties文件中的内容复制给当前唯一对象的属性this.url = pro.getProperty("db.url");this.password = pro.getProperty("db.password");           this.username = pro.getProperty("db.user");this.driver = pro.getProperty("db.driver");} catch (Exception e) {e.printStackTrace();}finally {if(in != null) {try {in.close();  //关闭} catch (Exception e2) {}           }}      }//唯一的一个对象static {dbinfo = new Dbinfo();}public static Dbinfo instance() {return dbinfo;}
}

在dao层连接数据库时直接调用Dbinfo 类的instance()函数,并获取连接

package com.icss.dao;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;import com.icss.util.Dbinfo2;public class BaseDao {protected Connection conn;public Connection getConn() {return conn;}public void setConn(Connection conn) {this.conn = conn;}public void openConnection() throws ClassNotFoundException,SQLException {  //conn必须可以多次重用if(this.conn == null || this.conn.isClosed() ) {//加载mysql的数据库驱动   包名+类名Class.forName(Dbinfo.getDriver());      conn = DriverManager.getConnection(Dbinfo.getUrl(), Dbinfo.getUsername(), Dbinfo.getPassword());   }       }public void closeConnection() {if(conn != null) {try {conn.close();} catch (Exception e) {e.printStackTrace();        }           }}
package com.icss.dao;import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;import com.icss.dto.UserStu;
import com.icss.entity.User;
import com.icss.util.Log;public class UserDao extends BaseDao{public User login3(String uname,String pwd) throws Exception {Log.logger.info("userdao:" + uname + "," + pwd);User user  = null;this.openConnection();String sql = "select * from tuser where uname=? and pwd=?";PreparedStatement ps = this.conn.prepareStatement(sql);ps.setString(1, uname);ps.setString(2, pwd);ResultSet rs = ps.executeQuery();while(rs.next()) {int role = rs.getInt("role"); user = new User();user.setUname(uname);user.setPwd(pwd);user.setRole(role);break;}rs.close();ps.close();      return user;}
}

这样就实现了数据库连接的单例模式,以下为余下代码示例:
逻辑层(biz)

package com.icss.biz;import com.icss.dao.UserDao;
import com.icss.dto.UserStu;
import com.icss.entity.User;public class UserBiz {public User login3(String uname,String pwd) throws Exception{User user = null;UserDao dao = new UserDao();try {user = dao.login3(uname, pwd);  } catch (Exception e) {//异常处理后,二次抛出异常throw e;}finally {//关闭数据库链接dao.closeConnection();}return user;}

实体类(entity):

package com.icss.entity;public class User {private String uname;private String pwd;private int role;public String getUname() {return uname;}public void setUname(String uname) {this.uname = uname;}public String getPwd() {return pwd;}public void setPwd(String pwd) {this.pwd = pwd;}public int getRole() {return role;}public void setRole(int role) {this.role = role;}
}

测试(ui):

package com.icss.ui;import com.icss.biz.UserBiz;
import com.icss.dto.UserStu;
import com.icss.entity.IRole;
import com.icss.util.Log;public class TestLogin {/*** UI层必须捕获并处理异常* @param uname* @param pwd*/public static void login(String uname,String pwd) {UserBiz biz = new UserBiz();try {UserStu user = biz.login3(uname, pwd);if(user == null) {System.out.println(uname + ",登陆失败,用户名或密码错误");}else {System.out.println(uname + ",登陆成功,他是" + user.getName() );if(user.getRole() == IRole.ADMIN) {System.out.println(uname + "是管理员");}else if(user.getRole() == IRole.COMMON_USER) {System.out.println(uname + "是普通用户");}else if(user.getRole() == IRole.VIP_USER) {System.out.println(uname + "是VIP");}else {System.out.println(uname + " 身份信息不明");}}} catch (Exception e) {//异常记录日志,提示用户友好信息Log.logger.error(e.getMessage(),e);System.out.println("网络链接繁忙,请稍后再试");         }   }public static void main(String[] args) {TestLogin.login("16970744526", "123456");}}

这样,单例模式,就成功的应用于数据库连接了。

单例模式应用之---数据库连接相关推荐

  1. 使用单例模式建立一个数据库连接简单示例

    <?php /**describe:单例模式 数据库类 单例模式的必要条件 (1)私有的构造方法-为了防止在类外使用new关键字实例化对象 (2)私有的成员属性-为了防止在类外引入这个存放对象的 ...

  2. GOF23设计模式(创建型模式)单例模式

    目录: 一:单例模式的核心作用.常见应用场景 二:五种单例模式及其实现 三:关于反射和反序列化破解单例模式的漏洞,以及相应的解决方案 四:测试五种单例模式的效率 一:核心作用及常见应用场景: 核心作用 ...

  3. 数据库连接池技术,c3p0

    百度 谷歌  http://commons.apache.org/   可以找到DBCP   ,  这里选择使用C3P0,百度一下.https://www.mchange.com/projects/c ...

  4. 设计模式-----单例模式优缺点及使用场景

    1.什么是单例模式? 单例模式就是保证系统中一个类只有一个实例.也就是说只能自己new自己并且实例唯一并对外提供. 2.模式的作用及应用场景? 作用:解决一个全局使用的类,频繁创建和销毁.拥有对象的唯 ...

  5. 【Java设计模式】GOF32 - 单例模式

    思维和思考的方式才是最重要的,语言只是一种工具. GOF23 Group of Four--国外的四个软件大牛总结出来的模式. 创建型模式:帮助我们创建对象 单例模式 单例模式的常见使用场景: 单例模 ...

  6. 4.设计模式---单例模式(上)

    单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必须自己自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 根据上面单利的特点,编写一个单利模式其实很简单: 饿汉: 1 ...

  7. 设计模式之——单例模式(Singleton)的常见应用场景(转):

    单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此 ...

  8. .NET设计模式(1):1.1 单例模式(Singleton Pattern)

    概述 单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并为客户程序提供一个获取该实例的全局访问点. 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单 ...

  9. 单例模式应用场景_面试:请你谈谈单例模式的优缺点,注意事项,使用场景

    单例模式介绍: 单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个全局对象,这样有利于我们协 ...

最新文章

  1. ORACLE nvarchar2和varchar2的区别
  2. Cocos2d-x的坐标系统
  3. 云炬WEB开发教程2-2 node.js和npm介绍和安装
  4. Delphi中TVarRec做为参数的用法
  5. 单词搜索—leetcode79
  6. .Net架构篇:实用中小型公司支付中心设计
  7. 【微信服务号开发】01.接入指南
  8. python练手程序_写的python练习程序
  9. Linux下安装配置PHP环境(上)---Apache2
  10. html中如果设置颜色为半透明状态,CSS半透明属性介绍及代码实例
  11. 【eoeAndroid社区索引】android数据存储之SQLite教程实例汇总
  12. 100个Java经典例子(1-10)
  13. QQ号被盗有什么方法能找回
  14. 助记词(Mnemonics)生成种子,以及Public Key, Private key
  15. 结合Elementplus源码讲解BEM的使用
  16. 【Java学习笔记】工厂模式
  17. 阿里走向下一个竞技场
  18. 成都工业大数据研究院
  19. mysql数据库合并游戏合服_关于游戏合服的资料
  20. python 安装时 install for allusers 无法选择

热门文章

  1. 20-Linux系统进程与计划任务相关命令详解整合
  2. allergro音乐术语什么意思_音乐术语Allegro的中文含义是()。A.慢板B.快板C.中板D.急板...
  3. redis分布式锁之redisson可重入锁
  4. 完美解决Windows7安装VC6后无法创建新项目的问题
  5. CakePHP 权限管理1 - 代码创建可授权的action
  6. sublime4禁止检查更新
  7. 让你彻底弄懂【python循环语句】
  8. 嵌入式学习之TCP和UDP基础理解
  9. input只允许输入数字 禁止输入e + - 以及取消input加减箭头样式
  10. 安卓势头正猛 智能手机打响中国市场战