在数据库操作中,为了代码重用,对重复代码进行封装,即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模板详解** 在Java开发中,Spring框架提供了丰富的工具和库来处理数据库操作,其中JDBC模板(JdbcTemplate)是Spring对JDBC的一种封装,它极大地简化了数据库访问的复杂性,使得开发者可以更加专注于...
Spring JDBC模板是Spring框架的重要组成部分,它为Java开发者提供了一种简单而强大的方式来处理数据库操作。这个"Spring_jdbc模板相关jar包"包含了Spring框架中用于与关系型数据库交互的核心库,使得开发者无需直接...
本资源“Spring_jdbc模板相关jar包(连接文件版本:5.1.47)”包含了Spring JDBC的核心库,以及适用于MySQL数据库的特定连接器——mysql-connector-java-5.1.47-bin.jar。下面我们将深入探讨这些组件及其重要性。 ...
本文将详细介绍在 Spring 中使用 JDBC 和 JDBC 模板的讲解,包括使用 JDBC 模板的好处、JDBC 模板的种类、使用 JDBC 模板的步骤、JDBC 模板的优点等内容。 一、使用 JDBC 模板的好处 在 Spring 中使用 JDBC 模板...
"JDBCPro"是基础的JDBC模板,它主要展示了如何使用JDBC进行基本的数据操作。在这一阶段,你会看到以下关键知识点: 1. 数据库连接:通过`Class.forName()`加载数据库驱动,然后使用`DriverManager.getConnection()`...
这就是“运用反射做的一个经典JDBC模板”所要探讨的主题。 反射是Java语言的一个强大特性,它允许程序在运行时动态地获取类的信息并调用其方法。在JDBC中,反射可以用来动态地创建数据库连接、执行SQL语句和处理...
Spring JDBC模板类——`org.springframework.jdbc.core.JdbcTemplate`是Spring框架中的核心组件,它为Java开发者提供了一种方便、安全的方式来执行SQL语句,而无需直接管理数据库连接。`JdbcTemplate`通过抽象出低...
在Spring框架中,JDBC模板(JdbcTemplate)是Spring对Java数据库连接(JDBC)API的一个强大封装,它简化了数据库操作,使开发者能够更专注于业务逻辑而不是底层的数据库交互细节。今天我们将深入探讨Spring的JDBC...
在本篇博文中,我们将深入探讨Spring框架中的一个重要组件——JDBC模板(JdbcTemplate),它为简化Java数据库连接(JDBC)操作提供了便利。通过使用JdbcTemplate,开发者可以避免大量重复且易出错的JDBC代码,从而...
最近编译的DbTemplate是Java的JDBC模板,它结构紧凑,使用灵活,易于支持对象上的Spring和CRUD操作。概述:目前DQL和分页暂时支持MySQL、HSQL和Oracle;
本项目"JDBCDemo:自定义jdbc模板"旨在提供一个自定义的JDBC模板,以简化数据库操作,并引入了数据库连接池和连接代理的概念,以提高应用程序的性能和可维护性。 首先,让我们深入了解一下JDBC模板。JDBC模板是...
本主题主要探讨的是一个通用的JDBC模板,它简化了JDBC的使用,提高了代码的可复用性和可维护性,尤其适合初学者学习。 首先,我们来看"JDBCTemplate"。这是一个核心的类,它封装了JDBC的基本操作,如打开数据库连接...
本文将深入探讨JDBC连接池的概念、工作原理,并以"通用basedao"模板为例,讲解如何在实际项目中应用。 首先,我们需要理解JDBC连接池是什么。JDBC连接池,全称为Java Database Connectivity Connection Pool,它是...
在本文中,我们将深入探讨如何使用Spring框架与JDBC模板来连接数据库并执行数据库操作。Spring JDBC模板提供了一种简洁的API,可以帮助我们避免手动管理数据库连接和事务,从而简化了数据库操作。 首先,要使用...
1. **自动配置**: Spring Boot通过自动配置,可以快速设置数据源和JDBC模板。 2. **Repository接口**: 开发者只需定义Repository接口,Spring会自动提供实现,无需编写繁琐的DAO层代码。 3. **ORM支持**: 尽管不如...
使用JDBC模板的Spring MVC CRUD这是一个简单的SPRING MVC项目,其中我使用了Spring MVC,JDBC模板进行数据操作,而在数据库方面,我使用了MYSQL数据库。脚步- 1.创建名称为“ usersdb”的MYSQL数据库2.使用以下命令...
java基础JDBC连接Mysql数据库。
Spring JDBC模板为开发者提供了一种简洁、高效的数据库访问方式,大大降低了与数据库交互的复杂性。现在,我们有一个名为"db-template"的项目,它受到了Spring JDBC模板的启发,旨在为数据库操作带来类似的便利,...
`ProjectExampleSwing:JDBC 模板项目`是一个基于Java Swing的桌面应用程序,它提供了使用Java数据库连接(JDBC)技术与数据库交互的模板。Swing是Java Standard Edition(Java SE)的一部分,用于构建用户界面,而...
在项目中,我们可以看到如何定义数据源、配置JDBC模板以及编写数据访问层(DAO)的代码,来执行CRUD(创建、读取、更新和删除)操作。 接着,MySQL是一种流行的开源关系型数据库管理系统,广泛用于Web应用。在...