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

使用模板模式封装数据库连接

阅读更多
模板模式
模板模式与策略模式都是对于算法进行相关处理的设计模式,属于形为形模式。模板模式是使用继承来复写或者修改算法,具有定制性。策略模式是对算法进行抽调,或者说是对算法进行分类封装处理,使算法具有灵活性。
模板模式是定义一个算法骨架,然后让子类对实现算法的细节。使算法细节不改变主算法的结构。
它的结构为:
1、
AbstractClass:通常使用抽象类,定义一系列抽象方法,具体子类可以重定义它,以实现各算法的具体步骤。
2、
ConcteteClass:实现抽象方法,以完成算法中与特定子类相关的步骤。

使用模板模式封装数据库连接类:
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 JdbcAbstractTemplate extends DabaseInfo {

	/**
	 * 这就是模板模式中的模板,用于处理数据库连接的相关操作
	 */

	/**
	 * 注册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();
			}
	}

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

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

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

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

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			closeStatement(pstmt);
			closeConnection(conn);
		}
		return rs;
	}

}


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、使用User对象进行再一次封装操作
package com.hejianjiao.database;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

public class UserTemplate extends JdbcAbstractTemplate {

	/**
	 * 对于User表的另外封装操作类
	 */

	/**
	 * 保存User对象数据
	 */
	public void saveUser(User user) {
		String sql = "insert into user (username,password) values('"
				+ user.getName() + "','" + user.getPassword() + "')";
		super.save(sql);
	}

	/**
	 * 获取User对象信息
	 */
	public User getUserById(String id) {
		Vector<User> vector = null;
		String sql = "select * from user where id='" + id + "'";
		ResultSet rs = super.get(sql);
		User user = null;
		if (rs != null) {
			try {
				while (rs.next()) {
					user = new User();
					user.setId(rs.getString(1));
					user.setName(rs.getString(2));
					user.setPassword(rs.getString(3));
					vector.add(user);

					if (vector != null) {
						for (int i = 0; i < vector.size(); i++) {
							user = (User) vector.elementAt(i);
						}
					}
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return user;
	}

	/**
	 * 获取所有User信息列表
	 */
	public Vector getAllUser() {
		String sql = "select * from user";
		Vector vector = null;
		User user = null;
		ResultSet rs = super.get(sql);
		if (rs != null) {
			try {
				user = new User();
				user.setId(rs.getString(1));
				user.setName(rs.getString(2));
				user.setPassword(rs.getString(3));
			} catch (SQLException e) {
				e.printStackTrace();
			}
			vector.add(user);
		}
		return vector;
	}
}



4、User对象
package com.hejianjiao.database;

public class User {

	private String id;
	private String name;
	private String password;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

}



上面这个例子,JdbcAbstractTemplate类,用一个可以重用的形式,处理了数据库初使化、关闭等操作,然后在具体到一个对象时,就可以使用模板模式来重用模板类中的方法,以达到快捷开发的效果。
在上面这个例子来看,模板模式展示了一种经典的重用形式.
分享到:
评论
3 楼 mabusyao 2009-02-10  
多谢楼主的回答,对于你第一个问题的解释,我还是不太能理解

举get这个方法的例子:
#     /**
#      * 模板方法----获取数据
#      */ 
#     public ResultSet get(String sql) { 
#         PreparedStatement pstmt = null; 
#         Connection conn = null; 
#         ResultSet rs = null; 
#  
#         try { 
#             registerDriver(); 
#             conn = getConnection(); 
#             pstmt = conn.prepareStatement(sql); 
#             rs = pstmt.executeQuery(); 
#  
#         } catch (SQLException e) { 
#             e.printStackTrace(); 
#         } finally { 
#             closeStatement(pstmt); 
#             closeConnection(conn); 
#         } 
#         return rs; 
#     }

在finally里面,你不是已经把statement和connection给close掉了么? 而在此之后,你reture了一个rs。

那么我在UserTemplate中调用的“ResultSet rs = super.get(sql);  ”这句话得到的rs,岂不是已经无效了?

今天看到你的头像,突然发现你居然是我的同事... 我在公司发的邮件中貌似看到过你。你是IBM的同仁么?
2 楼 anysky131 2009-02-02  
首先感谢兄台的指教!
呵呵,兄台可能看错了,我的ResultSet,Connection的关闭操作都单独封装在了一个单独的方法中去了.所以你的第一个问题,不是问题.

对于第二个问题,我想说两点:
1、这个文章的名字是,使用模板模式对数据库操作进行封装。就是封装了数据库的增、删、查、改。重点不是想说明数据库操作的封装。只是想说明模板模式的使用。对于数据库的封装,可以有很多种方法的。
2、对于数据库连接,关闭,已经封装了出来,可以单独进行操作了。而对于你说,一个事务处理,可以放在一个connection中去,是的,我这里也是可以的,只是看你怎样使用这里的方法了,这里只是写了一个小小的例子罢了。

对于最后一句,文章是原创的,数据库封装,网上可以有很多资料的,而且都是高手们写的,我这种菜人,就不出来说了吧。呵呵

多多交流。。。。。
1 楼 mabusyao 2009-01-20  
提两个问题:

1. 你的public ResultSet get(String sql) 函数返回一个ResultSet, 但是在函数内部已经把connection给close掉了,那在外部得到的ResultSet还有什么用处呢?要知道ResultSet只是数据的的一个索引而已,如果connection都已经关掉了,再去操作ResultSet会报错的。

2. 你的每次数据库操作都会进行数据库连接以及关闭,为什么不把这块内容抽出来,在一个更大的事务处理过程中进行? 要知道,一个事务处理可能包含多次数据库读写,完全可以在同一个connection中。

想请问下你的文章是原创的么? 我最近在写一个数据库的封装,不知道你有没有什么好的东东可以推荐的?

相关推荐

    Java_JDBC由浅入深

    比较实用,基础 目录 第一节 整理目的 3 第二节 jdbc的概念 3 2.1概念 3 2.2 Jdbc与应用程序的关系 3 2.3 数据库的连接步骤 4 2.4 Quick Start 4 ...15.5 模板模式的应用 100 第十六节 近期推出 101

    Delphi模式编程第一分卷

    1.3.3 借助模式封装多个变化 1.3.4 模式帮助我们解决问题 第2章 Delphi的模式编程机制 2.1 对象模型机制 2.1.1 对象模型 2.1.2 对象建模和模式编程 2.1.3 对象关系与复用 2.2 动态绑定机制 2.2.1 方法绑定 ...

    Delphi模式编程第二分卷

    1.3.3 借助模式封装多个变化 1.3.4 模式帮助我们解决问题 第2章 Delphi的模式编程机制 2.1 对象模型机制 2.1.1 对象模型 2.1.2 对象建模和模式编程 2.1.3 对象关系与复用 2.2 动态绑定机制 2.2.1 ...

    php的mvc模式开发框架

    这是一个根据MVC模式开发的一个小型框架。 说明: framework文件是框架文件,可将其重命名成你的项目名 ...Config目录下的config文件配置了数据库的连接...在config文档中修改数据库连接配置 包括:localhost、password

    图书进存销系统(练手项目九)

    * 学习了使用JDBC进行数据库操作,使用Java的反射技术封装数据,使用单态模式去获得数据库连接, 图片的压缩处理等知识点 * 在界面中主要使用JTable的处理,表现层、业务层与数据访问层的分层结构, 大大减低...

    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 控制登录用户...

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

    设计模式之 Template(模板方法) 实际上向你介绍了为什么要使用 Java 抽象类,该模式原理简单,使用很普遍. 设计模式之 Strategy(策略) 不同算法各自封装,用户端可随意挑选需要的算法. 设计模式之 Chain of ...

    delphi三层架构框架

    采用数据库连接池技术,支持多数据库应用及多种数据库的应用,可以很好的处理断网、数据库重新启动等异常情况,一旦外界环境恢复后,连接池将重新连接数据库,不需要重启服务程序。 使用HTTP协议与客户端进行...

    图书销售,MFC,ADO 文献综述

    这样封装的结果对程序员来说,是一套开发模板(或者说模式)。针对不同的应用和目的,程序员采用不同的模板。例如,SDI应用程序的模板,MDI应用程序的模板,规则DLL应用程序的模板,扩展DLL应用程序的模板,OLE/...

    asp.net知识库

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

    Java GUI编程.docx

    面向对象,模拟人类日常思维模式解决计算机中的问题。将处理过程和数据进行封装和屏蔽,从而达到复用的效果。 java中万事万物皆为对象,类和对象是java编程的核心。类可以看成是属性和行为的抽象、封装。必须先有...

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

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

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    在数据库处理方面,不需要在数据层借助存储过程及数据库服务器端函数封装过多的业务逻辑,因此数据库系统采用相对精巧的MySQL[6]。 该在线博客系统服务器端如果需要布置到其他主机上,则该主机必备条件如下: 1. ...

    ASP.NET3.5从入门到精通

    10.5.2 使用OLE DB .NET Data Provider 连接txt 10.5.3 使用System.IO 命名空间 10.6 访问SQLite 10.6.1 SQLite 简介 10.6.2 SQLite 连接方法 10.7 小结 第四篇 ASP.NET网络编程 第 11 章用户控件和自定义控件 11.1 ...

    ASP.NET 3.5 开发大全11-15

    10.5.2 使用OLE DB .NET Data Provider 连接txt 10.5.3 使用System.IO命名空间 10.6 访问SQLite 10.6.1 SQLite简介 10.6.2 SQLite连接方法 10.7 小结 第四篇 ASP.NET网络编程 第11章 用户控件和自定义控件 11.1 用户...

    ASP.NET 3.5 开发大全

    10.5.2 使用OLE DB .NET Data Provider 连接txt 10.5.3 使用System.IO命名空间 10.6 访问SQLite 10.6.1 SQLite简介 10.6.2 SQLite连接方法 10.7 小结 第四篇 ASP.NET网络编程 第11章 用户控件和自定义控件 11.1 用户...

    ASP.NET 3.5 开发大全1-5

    10.5.2 使用OLE DB .NET Data Provider 连接txt 10.5.3 使用System.IO命名空间 10.6 访问SQLite 10.6.1 SQLite简介 10.6.2 SQLite连接方法 10.7 小结 第四篇 ASP.NET网络编程 第11章 用户控件和自定义控件 11.1 用户...

    ASP.NET 3.5 开发大全word课件

    10.5.2 使用OLE DB .NET Data Provider 连接txt 10.5.3 使用System.IO命名空间 10.6 访问SQLite 10.6.1 SQLite简介 10.6.2 SQLite连接方法 10.7 小结 第四篇 ASP.NET网络编程 第11章 用户控件和自定义控件 11.1 用户...

Global site tag (gtag.js) - Google Analytics