`
li_sir
  • 浏览: 114796 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JDBC模板

阅读更多
  在数据库操作中,为了代码重用,对重复代码进行封装,即jdbc模板,spring里已经对模板进行了良好的封装,这里介绍其实现原理和实现方式,便于以后在做代码中可以重用这种思想。在这里介绍两种方式。
第一种方式,使用继承。
思路:将可重复使用的代码放在父类中,子类继承得到扩展。
父类,相当于模板,供子类继承使用:
public abstract class AbstractDao {
	public Object find(String sql, Object[] args) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = JdbcUtils.getConnection();
			ps = conn.prepareStatement(sql);
			for (int i = 0; i < args.length; i++)
				ps.setObject(i + 1, args[i]);
			rs = ps.executeQuery();
			Object obj = null;
			if (rs.next()) {
				obj = rowMapper(rs);
			}
			return obj;
		} catch (SQLException e) {
			throw new DaoException(e.getMessage(), e);
		} finally {
			JdbcUtils.free(rs, ps, conn);
		}
	}

	[color=cyan]abstract protected Object rowMapper(ResultSet rs) throws SQLException;[/color]

	public int update(String sql, Object[] args) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = JdbcUtils.getConnection();
			ps = conn.prepareStatement(sql);
			for (int i = 0; i < args.length; i++)
				ps.setObject(i + 1, args[i]);
			return ps.executeUpdate();
		} catch (SQLException e) {
			throw new DaoException(e.getMessage(), e);
		} finally {
			JdbcUtils.free(rs, ps, conn);
		}
	}
}

实现类,继承AbstractDao类,即是模板的使用者:
public class UserDaoImpl extends AbstractDao {

	public User findUser(String loginName, String password) {
		String sql = "select id, name, money, birthday  from user where name=?";
		Object[] args = new Object[] { loginName };
		Object user = super.find(sql, args);
		return (User) user;
	}

	public String findUserName(int id) {
		String sql = "select  name from user where id=?";
		Object[] args = new Object[] { id };
		Object user = super.find(sql, args);
		return ((User) user).getName();
	}

	[color=cyan]protected Object rowMapper1(ResultSet rs) throws SQLException {
		return rs.getString("name");
	}

	protected Object rowMapper(ResultSet rs) throws SQLException {
		User user = new User();
		user.setId(rs.getInt("id"));
		user.setName(rs.getString("name"));
		user.setMoney(rs.getFloat("money"));
		user.setBirthday(rs.getDate("birthday"));
		return user;
	}

	public void delete(User user) {
		String sql = "delete from user where id=?";
		Object[] args = new Object[] { user.getId() };
		super.update(sql, args);
	}[/color]
	public void update(User user) {
		String sql = "update user set name=?, birthday=?, money=? where id=? ";
		Object[] args = new Object[] { user.getName(), user.getBirthday(),
				user.getMoney(), user.getId() };
		super.update(sql, args);
	}
}


取结果集,在模板类中定义一个结果集封装接口,让使用者(继承类)根据自己所想要的结果进行封装。

缺陷:不灵活,对于要取得一个结果集,不同时,模板和使用者要定义不同的封装方法来调用,例如对于一个User对象,查找返回需要两种,1是整个user对象,2是仅需要一个name时,则需要在模板中定义两个抽象方法,对应实现也需要实现这两个方法。
第二种,策略模式。模式书上就说,有一个总比是一个好。
先看代码:
模板类:
public class MyDaoTemplate {
	public Object find(String sql, Object[] args,[color=cyan] RowMapper rowMapper[/color]) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = JdbcUtils.getConnection();
			ps = conn.prepareStatement(sql);
			for (int i = 0; i < args.length; i++)
				ps.setObject(i + 1, args[i]);
			rs = ps.executeQuery();
			Object obj = null;
			if (rs.next()) {
				obj = rowMapper.mapRow(rs);
			}
			return obj;
		} catch (SQLException e) {
			throw new DaoException(e.getMessage(), e);
		} finally {
			JdbcUtils.free(rs, ps, conn);
		}
	}
}

将返回结果的对象封装用一个接口对象传递过来
实现类(使用者):
public class UserDaoImpl2 {
	MyDaoTemplate template = new MyDaoTemplate();

	public User findUser(String loginName, String password) {
		String sql = "select id, name, money, birthday  from user where name=?";
		Object[] args = new Object[] { loginName };
		RowMapper mapper = new UserRowMapper();
		Object user = this.template.find(sql, args, mapper);
		return (User) user;
	}

	public String findUserName(int id) {
		String sql = "select name from user where id=?";
		Object[] args = new Object[] { id };
		Object name = this.template.find(sql, args, new RowMapper() {

			public Object mapRow(ResultSet rs) throws SQLException {
				return rs.getString("name");
			}
		});
		return (String) name;
	}
}

class UserRowMapper implements RowMapper {
	public Object mapRow(ResultSet rs) throws SQLException {
		User user = new User();
		user.setId(rs.getInt("id"));
		user.setName(rs.getString("name"));
		user.setMoney(rs.getFloat("money"));
		user.setBirthday(rs.getDate("birthday"));
		return user;
	}

}


使用者new一个接口,或者使用内部类,去给模板传递一个接口实例,对结果集进行不同的封装,所有的使用只需根据自己的需求实现这个接口,然后传递给模板,即可。

优点:非常灵活,便于对结果集进行各种各样的封装。
注:JdbcUtils是一个获取数据库连接的类,在这里不做具体介绍。
分享到:
评论

相关推荐

    Spring_JDBC模板笔记

    **Spring JDBC模板详解** 在Java开发中,Spring框架提供了丰富的工具和库来处理数据库操作,其中JDBC模板(JdbcTemplate)是Spring对JDBC的一种封装,它极大地简化了数据库访问的复杂性,使得开发者可以更加专注于...

    Spring_jdbc模板相关jar包

    Spring JDBC模板是Spring框架的重要组成部分,它为Java开发者提供了一种简单而强大的方式来处理数据库操作。这个"Spring_jdbc模板相关jar包"包含了Spring框架中用于与关系型数据库交互的核心库,使得开发者无需直接...

    Spring_jdbc模板相关jar包(连接文件版本:5.1.47)

    本资源“Spring_jdbc模板相关jar包(连接文件版本:5.1.47)”包含了Spring JDBC的核心库,以及适用于MySQL数据库的特定连接器——mysql-connector-java-5.1.47-bin.jar。下面我们将深入探讨这些组件及其重要性。 ...

    运用反射做的一个经典JDBC模板

    这就是“运用反射做的一个经典JDBC模板”所要探讨的主题。 反射是Java语言的一个强大特性,它允许程序在运行时动态地获取类的信息并调用其方法。在JDBC中,反射可以用来动态地创建数据库连接、执行SQL语句和处理...

    在Spring中使用JDBC和JDBC模板的讲解

    本文将详细介绍在 Spring 中使用 JDBC 和 JDBC 模板的讲解,包括使用 JDBC 模板的好处、JDBC 模板的种类、使用 JDBC 模板的步骤、JDBC 模板的优点等内容。 一、使用 JDBC 模板的好处 在 Spring 中使用 JDBC 模板...

    javaJDBC项目模板

    "JDBCPro"是基础的JDBC模板,它主要展示了如何使用JDBC进行基本的数据操作。在这一阶段,你会看到以下关键知识点: 1. 数据库连接:通过`Class.forName()`加载数据库驱动,然后使用`DriverManager.getConnection()`...

    Spring JDBC模板类—org.springframework.jdbc.core.JdbcTemplate

    Spring JDBC模板类——`org.springframework.jdbc.core.JdbcTemplate`是Spring框架中的核心组件,它为Java开发者提供了一种方便、安全的方式来执行SQL语句,而无需直接管理数据库连接。`JdbcTemplate`通过抽象出低...

    day39-Spring 18-Spring的JDBC模板:查询的操作

    在Spring框架中,JDBC模板(JdbcTemplate)是Spring对Java数据库连接(JDBC)API的一个强大封装,它简化了数据库操作,使开发者能够更专注于业务逻辑而不是底层的数据库交互细节。今天我们将深入探讨Spring的JDBC...

    day39-Spring 17-Spring的JDBC模板:完成增删改的操作

    在本篇博文中,我们将深入探讨Spring框架中的一个重要组件——JDBC模板(JdbcTemplate),它为简化Java数据库连接(JDBC)操作提供了便利。通过使用JdbcTemplate,开发者可以避免大量重复且易出错的JDBC代码,从而...

    JDBCDemo:自定义 jdbc 模板

    本项目"JDBCDemo:自定义jdbc模板"旨在提供一个自定义的JDBC模板,以简化数据库操作,并引入了数据库连接池和连接代理的概念,以提高应用程序的性能和可维护性。 首先,让我们深入了解一下JDBC模板。JDBC模板是...

    通用模板,JDBC 增删改查封转

    本主题主要探讨的是一个通用的JDBC模板,它简化了JDBC的使用,提高了代码的可复用性和可维护性,尤其适合初学者学习。 首先,我们来看"JDBCTemplate"。这是一个核心的类,它封装了JDBC的基本操作,如打开数据库连接...

    JDBC连接池(通用basedao)可直接用的模板

    本文将深入探讨JDBC连接池的概念、工作原理,并以"通用basedao"模板为例,讲解如何在实际项目中应用。 首先,我们需要理解JDBC连接池是什么。JDBC连接池,全称为Java Database Connectivity Connection Pool,它是...

    Spring的连接数据库以及JDBC模板(实例讲解)

    在本文中,我们将深入探讨如何使用Spring框架与JDBC模板来连接数据库并执行数据库操作。Spring JDBC模板提供了一种简洁的API,可以帮助我们避免手动管理数据库连接和事务,从而简化了数据库操作。 首先,要使用...

    Spring Data JDBC与JDBC的区别

    1. **自动配置**: Spring Boot通过自动配置,可以快速设置数据源和JDBC模板。 2. **Repository接口**: 开发者只需定义Repository接口,Spring会自动提供实现,无需编写繁琐的DAO层代码。 3. **ORM支持**: 尽管不如...

    spring_mvc_crud_jdbc_template:使用JDBC模板的Spring MVC Crud

    使用JDBC模板的Spring MVC CRUD这是一个简单的SPRING MVC项目,其中我使用了Spring MVC,JDBC模板进行数据操作,而在数据库方面,我使用了MYSQL数据库。脚步- 1.创建名称为“ usersdb”的MYSQL数据库2.使用以下命令...

    JAVA连接Mysql模板类之JDBC基础类

    java基础JDBC连接Mysql数据库。

    db-template:受 Spring JDBC 模板启发的 DB 模板

    Spring JDBC模板为开发者提供了一种简洁、高效的数据库访问方式,大大降低了与数据库交互的复杂性。现在,我们有一个名为"db-template"的项目,它受到了Spring JDBC模板的启发,旨在为数据库操作带来类似的便利,...

    ProjectExampleSwing:JDBC 模板项目

    `ProjectExampleSwing:JDBC 模板项目`是一个基于Java Swing的桌面应用程序,它提供了使用Java数据库连接(JDBC)技术与数据库交互的模板。Swing是Java Standard Edition(Java SE)的一部分,用于构建用户界面,而...

    belajar-ws:使用 Spring Boot、mysql 和 jdbc 模板学习 Web 服务

    在项目中,我们可以看到如何定义数据源、配置JDBC模板以及编写数据访问层(DAO)的代码,来执行CRUD(创建、读取、更新和删除)操作。 接着,MySQL是一种流行的开源关系型数据库管理系统,广泛用于Web应用。在...

    JDBC连接Oracle数据库的增删改查操作的模板代码

    自己写的JDBC连接Oracle数据库进行增删改查操作的源代码; 代码有相应注释,有说明思路的text文档,思路清晰,通俗易懂; 可以作为web开发后台的模板代码; 文件还附上了代码中设计的数据表的pdc文件;

Global site tag (gtag.js) - Google Analytics