`
anysky131
  • 浏览: 172506 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

使用策略模式封装数据库连接

阅读更多
策略模式的目的是定义一定的算法结构,然后让其子类去按照自己的需要结合给定的算法骨架去实现特定的算法。对于本模式的算法,可以独立于客户存在,对于算法可以与客户端完成没有任何的联系!
本例封装了数据库连接,使数据库连接被完全封装了!
1、策略模式中的抽象算法接口
package com.hejianjiao.database;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

public interface JdbcStrategy {

	/**
	 * 策略抽象接口,定义了jdbc的一般通用算法
	 */

	Connection init();

	void release(Statement statement, Connection conn);

	void save(String sql);

	ResultSet get(String sql);

}



2、将数据信息放在一个类中
package com.hejianjiao.database;

public class DatabaseInfo {

	protected final String url = "jdbc:mysql://localhost:3306/test";
	protected final String username = "root";
	protected final String password = "";
	protected final String driverClass = "org.gjt.mm.mysql.Driver";

}



3、对于算法的一种实现,封装数据库连接与操作
package com.hejianjiao.database;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JdbcStrategyTemplate extends DatabaseInfo implements JdbcStrategy {

	/**
	 * 对于策略的一个算法实现,它可以对算法进行自己的操作,在完成算法规定的基础上,可以处理自己的方法
	 */

	public Connection init() {
		registerDriver();
		return getConnection();
	}

	public void release(Statement statement, Connection conn) {
		closeStatement(statement);
		closeConnection(conn);
	}

	/**
	 * 操作数据
	 */
	public void save(String sql) {
		PreparedStatement pstmt = null;
		Connection conn = null;

		try {
			init();
			pstmt = conn.prepareStatement(sql);
			pstmt.executeUpdate();
		} catch (SQLException e) {
			System.out.println("数据操作失败!");
			e.printStackTrace();
		} finally {
			release(pstmt, conn);
		}
	}

	/**
	 * 获取数据
	 */
	public ResultSet get(String sql) {
		PreparedStatement pstmt = null;
		Connection conn = null;
		ResultSet rs = null;

		try {
			init();
			pstmt = conn.prepareStatement(sql);
			rs = pstmt.executeQuery();

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			release(pstmt, conn);
		}
		return rs;
	}

	/**
	 * 注册JDBC驱动
	 */
	public void registerDriver() {
		try {
			Class.forName(driverClass);
		} catch (ClassNotFoundException e) {
			System.out.println("注册驱动失败!");
			e.printStackTrace();
		}
	}

	/**
	 * 取得连接
	 */
	public Connection getConnection() {
		try {
			return DriverManager.getConnection(url, username, password);
		} catch (SQLException e) {
			System.out.println("数据库连接失败!");
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 关闭连接
	 */
	public void closeConnection(Connection conn) {
		if (conn != null)
			try {
				conn.close();
			} catch (SQLException e) {
				System.out.println("数据库关闭失败!");
				e.printStackTrace();
			}
	}

	/**
	 * 关闭语句
	 */
	public void closeStatement(Statement statement) {
		if (statement != null)
			try {
				statement.close();
			} catch (SQLException e) {
				System.out.println("语句关闭失败!");
				e.printStackTrace();
			}
	}

}



策略模式减小了通用算法和具体控制细节的耦合,它比模板模式要复杂一些,但使用接口的形式,使得它的灵活度更高了。在需要完全替换算法的情况下,更加适用。因为它可以在不改变客户代码的基础上,对底层再一次进行封装。而它的一个缺点是客户端需要知道提供的策略有哪几种。
分享到:
评论

相关推荐

    数据库连接池jar包(含说明)

    对数据库连接池的封装 可以修改连接方式 包含排队等待功能 采用工厂模式、策略莫斯和反射等技术

    .net core6.0 webapi 后端项目框架源码,配置sqlserver数据库连接字符串,开箱即用

    接入国产数据库ORM组件 —— SqlSugar,封装数据库操作; 基于log4net的全局异常处理; 自定义全局消息返回格式; 可配合 Docker 实现容器化; 可配合 Jenkins 实现CI / CD; 可配合 Nginx 实现负载均衡;

    Java_JDBC由浅入深

    14.1 为什么要使用数据库连接池 74 14.2 数据库连接池雏形 74 14.2 数据库连接池优化 77 14.2.1 对线程池加锁 77 14.2.2 连接不够用时抛出异常 77 14.3 数据库连接池之代理模式 78 14.3.1 静态代理 78 14.3.2 动态...

    Delphi模式编程第一分卷

    7.3.1 一个共享数据库连接的单例模式范例 7.3.2 范例小结 第8章 原型模式(Prototype) 8.1 模式解说 8.2 结构和用法 8.2.1 模式结构 8.2.2 代码模板 8.3 范例与实践 8.3.1 Delphi对象的克隆 8.3.2 用原型...

    Delphi模式编程第二分卷

    7.3.1 一个共享数据库连接的单例模式范例 7.3.2 范例小结 第8章 原型模式(Prototype) 8.1 模式解说 8.2 结构和用法 8.2.1 模式结构 8.2.2 代码模板 8.3 范例与实践 8.3.1 Delphi对象的克隆 ...

    二十三种设计模式【PDF版】

    设计模式之 Strategy(策略) 不同算法各自封装,用户端可随意挑选需要的算法. 设计模式之 Chain of Responsibility(责任链) 各司其职的类串成一串,好象击鼓传花,当然如果自己能完成,就不要推委给下一个. 设计模式...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例054 包含数据库连接文件 85 实例055 包含网站头文件 86 实例056 包含网站尾文件 87 实例057 包含网站的主文件 88 2.4 条件语句 89 实例058 员工生日提醒 89 实例059 考试成绩评定标准 90 实例060 控制登录用户...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例054 包含数据库连接文件 85 实例055 包含网站头文件 86 实例056 包含网站尾文件 87 实例057 包含网站的主文件 88 2.4 条件语句 89 实例058 员工生日提醒 89 实例059 考试成绩评定标准 90 实例060 控制登录用户...

    asp.net知识库

    在ASP.NET中使用WINDOWS验证方式连接SQL SERVER数据库 改进ADO.Net数据库访问方式 ASP.NET 2.0 绑定高级技巧 简单实用的DataSet更新数据库的类+总结 [ADO.NET]由数据库触发器引发的问题 为ASP.NET封装的SQL数据库...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    策略模式 模板方法模式 访问者模式 设计案例 UML 架构 系统架构能力 基本理论 扩展性设计 可用性设计 可靠性设计 一致性设计 负载均衡设计 过载保护设计 协议设计 二进制协议 文本协议 接入层架构...

    php网络开发完全手册

    5.7.1 策略模式(Strategy Pattern) 81 5.7.2 单例模式(Singleton Pattern) 81 5.7.3 工厂模式(Factory Pattern) 83 5.8 接口与抽象类 86 5.8.1 接口的定义 86 5.8.2 单一接口的实现 87 5.8.3 多重接口的实现 ...

    magicware Linux 正式版

    客户端程序的开发可以开发包提供的基于C 的api进行,在此基础上进行的封装后可以使用几乎所有常见windows开发工具进行客户端程序开发。同时,软件包中还提供了以java方式进行客户端开发的开发包。

    亮剑.NET深入体验与实战精要2

    15.5.2 及时地关闭数据库连接 563 15.5.3 跟踪监视SQL Server当前链接池状态 564 15.5.4 善用数据库的存储过程 567 15.5.5 SqlDataRead和Dataset的选择 567 15.5.6 ExecuteNonQuery和 ExecuteScalar的选择 568 15.5....

    亮剑.NET深入体验与实战精要3

    15.5.2 及时地关闭数据库连接 563 15.5.3 跟踪监视SQL Server当前链接池状态 564 15.5.4 善用数据库的存储过程 567 15.5.5 SqlDataRead和Dataset的选择 567 15.5.6 ExecuteNonQuery和 ExecuteScalar的选择 568 15.5....

    Java并发编程(学习笔记).xmind

    (2)实现资源池,例如数据库连接池 (3)使用信号量将任何一种容器变成有界阻塞容器 栅栏 能够阻塞一组线程直到某个事件发生 栅栏和闭锁的区别 所有线程必须同时到达栅栏位置,...

    CISCO交换机配置AAA、802.1X以及VACL

    基于以上所述,IEEE定义了一种封装模式,允许EAP通过LAN传输,EAP over LAN(EAPoL)于是应运而生。各种验证服务都可以通过这种协议运行,包括用户名/口令、Kerberos、数字证书、一次性口令和生物检测术等服务。EAP...

    开涛高可用高并发-亿级流量核心技术

    12.1 数据库连接池 227 12.1.1 DBCP连接池配置 228 12.1.2 DBCP配置建议 233 12.1.3 数据库驱动超时实现 234 12.1.4 连接池使用的一些建议 235 12.2 HttpClient连接池 236 12.2.1 HttpClient 4.5.2配置 236 12.2.2 ...

Global site tag (gtag.js) - Google Analytics