`
anysky131
  • 浏览: 176239 次
  • 性别: 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中。

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

相关推荐

    MySql数据库连接封装类

    总之,`MySql数据库连接封装类`是Java编程中常用的一种设计模式,它将数据库操作的复杂性隐藏起来,使代码更加简洁、易用,是提高开发效率的有效手段。在学习和使用过程中,理解其工作原理并熟练运用,对于提升编程...

    Java数据库连接+操作(模板方法模式应用)

    在本篇博客笔记中,我们将探讨如何利用Java进行数据库连接,并将模板方法模式应用于数据库操作,以实现更高效和可维护的代码。 首先,要进行数据库连接,我们需要引入JDBC驱动。对于不同类型的数据库(如MySQL、...

    由数据库连接所联想到的5种设计模式

    由此引出了五种设计模式,这些模式不仅适用于数据库连接管理,而且在软件设计中具有广泛的应用。下面我们将深入探讨这五种设计模式及其在实际开发中的应用。 1. 单例模式(Singleton) 单例模式确保一个类只有一个...

    通用数据库连接类(配置文件)

    本文将详细介绍如何使用提供的“通用数据库连接类(配置文件)”来实现灵活的数据库访问。这个工具类集成了多种常见数据库(如SQLServer、Oracle、MySQL)的支持,使得开发者无需修改源代码,只需调整配置文件即可...

    JDBC 数据库连接和操作的封装

    ### JDBC 数据库连接和操作的封装 #### 一、引言 在软件开发过程中,数据库操作是必不可少的一部分。为了提高代码的复用性和降低维护成本,通常会将数据库连接及基本的增删查改(CRUD)操作进行封装。本文将详细...

    Visual Sudio2019利用ODBC连接SQL server数据库

    最后,对于大型项目,通常会采用设计模式和面向对象编程来组织代码,例如使用工厂模式创建数据库连接,使用单例模式确保全局唯一的数据源,使用DAO(数据访问对象)模式封装数据库操作,使代码更易于维护和扩展。...

    Access 数据库操作封装类库

    在数据库操作中,封装可以将数据库连接、查询、插入、更新和删除等操作集中在一个类中,对外提供简洁的接口,隐藏内部复杂实现,从而降低代码的耦合度。 对于"Access数据库操作封装类库",我们可以设计一个名为`...

    工厂模式dao模式操作数据库小例子

    在Java编程领域,设计模式是解决常见问题的模板,提供了可重用的解决方案。工厂模式和DAO(Data Access Object)模式是两种常见的设计模式,它们在处理数据库操作时发挥着关键作用。本示例旨在帮助初学者理解如何...

    简单三层模板_代码生成_C#_数据库模板_

    此模板可能包含数据库连接配置、数据访问对象(DAOs)以及对数据库操作的封装。 4. **代码生成器**: 代码生成器是一个工具,能够根据数据库结构自动生成相应的BLL和DAL代码,极大地提高了开发效率。在本模板中,...

    数据库链接模板

    在IT行业中,数据库链接模板是实现Java应用程序与数据库...在实际开发中,可能还需要考虑性能优化,如使用连接池管理数据库连接,以及使用DAO(数据访问对象)模式来封装数据库操作,提高代码的可复用性和可维护性。

    使用JSP基于数据库完成用户登陆(代码+笔记)_java_

    在这个登录系统中,我们通常会使用DAO模式来封装数据库操作。DAO是软件设计模式之一,用于分离业务逻辑层和数据访问层,使得代码更易于维护和测试。创建一个UserDAO接口,包含方法如`login(String username, String...

    MVC 三层模式 有数据库

    在名为"MVC_Frame2.0"的压缩包文件中,很可能包含了实现MVC三层模式的框架或示例项目,可能包括了Controller类、Model类、View模板以及与SQL Server 2005数据库交互的相关配置和代码。通过学习和理解这个项目,...

    spring里面常见的集中数据库连接方式

    通过使用模板方法模式,JdbcTemplate可以避免大量的样板代码,并确保资源的正确关闭。配置一个JdbcTemplate Bean如下: ```java @Bean public JdbcTemplate jdbcTemplate(DataSource dataSource) { return new ...

    工厂模式实现数据库的增删改查

    在软件开发中,设计模式是一种解决常见问题的模板或最佳实践。工厂模式是其中最常用的一种,它提供了一种创建对象的最佳方式,特别是在需要根据不同的条件或者策略来创建不同类型对象时。在这个场景中,我们将讨论...

    Spring 学习 JdbcTemplate,模板模式,回调

    Spring JdbcTemplate简化了数据库操作,通过模板模式抽象出通用的流程,而回调机制则提供了定制化数据处理的能力。理解并熟练运用这些概念,能够帮助开发者更高效地进行数据库相关的编程,提高代码质量和可维护性。...

    使VC连接数据库变的更简单

    例如,工厂模式可以用来创建数据库连接,适配器模式可以用来将不同数据库接口统一为一致的API,而单例模式可以确保整个应用程序中只有一个数据库连接实例。 6. 异步操作:在现代应用程序中,为了提高用户体验,通常...

    【转】Spring中模板模式和回调模式的讲解

    在Spring框架中,模板模式和回调模式经常结合使用。例如,在`RestTemplate`中,你可以看到模板方法`exchange()`,它定义了HTTP请求的基本流程,同时允许你通过回调接口(如`ResponseEntityCallback`)定制响应处理。...

    三层+动态页面生成静态页面 +连接数据库 实例可允许

    在ASP.NET中,可以使用ADO.NET、Entity Framework或其他ORM工具来建立和管理数据库连接。数据库连接字符串通常在配置文件中定义,以便在不同环境中轻松切换。 在“WebSite1”这个压缩包文件中,可能包含了实现上述...

    模板设计模式_构建公共通用的Dao

    - **数据库连接管理**:通过连接池获取和释放数据库连接,这部分代码可以封装在一个模板方法中,确保每个数据库操作都遵循相同的生命周期。 - **SQL执行**:提供一个抽象方法,让子类定义具体的SQL查询或更新语句。...

    Java之数据库工具封装

    - `JdbcUtil`和`BaseDao`体现了设计模式中的工厂模式和模板方法模式,前者为数据库连接创建一个统一的获取和关闭入口,后者提供了一套执行SQL的通用模板,降低了代码重复。 通过以上封装,开发者在实际操作数据库...

Global site tag (gtag.js) - Google Analytics