前言
参照我的博客,熟悉基础的Spring JDBC的操作
Spring JdbcTemplate与NamedJdbcTemplate模板的实战案例与优化解析-CSDN博客
了解基础的Spring JDBC后我们可以知道,即使是封装了原生JDBC的JdbcTemplate类在书写时也存在冗余代码,对此Spring提供了一些支持类,来进一步简化JDBC的相关操作。
- 存在问题
- JDBC的全部DAO类,需要一个JdbcTemplate属性和一个设置方法
- 把JdbcTemplate Bean装配到每个DAO的JdbcTemplate属性
- 多个DAO,产生很多重复代码
- 解决方案
- 全部DAO 对象创建一个通用父类 在其中设置 JdbcTemplate 属性,
- 全部 DAO 继承这个类,使用父类的JdbcTemplate进行数据访问,
- Spring恰好提供了这样一些基类。
案例解析
使用JdbcDaoSupport
- Spring 的 JdbcDaoSupport 就是用于编写基于JDBC 的DAO 类的基类
- 自己的DAO类继承它即可
接下来我将通过案例来演示JdbcDaoSupport的使用
创建实体类继承JdbcDaoSupport类
UserDao
package dao;import entity.User;import java.util.List;public interface UserDao {//查询所有用户List<User> getAllUsers();List<User> getUsersByCond(User user);User getUserById(int id);int addUser(User user);int deleteUser(int id);int updateUser(int id);
}
UserDaoJdbcTemplate
@Component("userDaoTemp")
public class UserDaoJdbcTemplate implements UserDao {public static final RowMapper rowMapper=new ParameterizedRowMapper<User>(){@Overridepublic User mapRow(ResultSet rs, int i) throws SQLException {User user =new User();user.setUser_id(rs.getInt("user_id"));user.setUser_name(rs.getString("user_name"));user.setPassword(rs.getString("password"));return user;}};@Resource(name = "jdbcTemplate")private JdbcTemplate jdbcTemplate;@Overridepublic List<User> getAllUsers() {return null;}@Overridepublic List<User> getUsersByCond(User user) {return null;}@Overridepublic User getUserById(int id) {return null;}@Overridepublic int addUser(User user) {Object[] params={user.getUser_name(),user.getPassword()};String sql="insert into t_user(user_name,password) values(?,?)";return jdbcTemplate.update(sql,params);}@Overridepublic int deleteUser(int id) {return 0;}@Overridepublic int updateUser(int id) {return 0;}
}
JdbcDaoSupport
public class UserDaoSupport extends JdbcDaoSupport implements UserDao {@Overridepublic List<User> getAllUsers() {return null;}@Overridepublic List<User> getUsersByCond(User user) {return null;}@Overridepublic User getUserById(int id) {return null;}@Overridepublic int addUser(User user) {Object[] params={user.getUser_name(),user.getPassword()};String sql="insert into t_user(user_name,password) values (?,?)";return getJdbcTemplate().update(sql,params);}@Overridepublic int deleteUser(int id) {return 0;}@Overridepublic int updateUser(int id) {return 0;}
}
对比UserDaoJdbcTemplate和JdbcDaoSupport,可以发现JdbcDaoSupport将JdbcTemplate进行了二次封装,不需要我们手动注入就可以直接使用,进而简化了开发。
本质上,就是将jdbcTemplate等相关的需要重复使用的内容,集成到父类中,然后我们继承这个父类,就可以直接使用父类中的内容,从而避免了代码冗余。
配置spring.xml配置文件
spring.xml
注意:这里的项目是基于我在前言中提供的项目中进行的。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.0.xsd"><context:component-scan base-package="dao"/><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/csx_demo?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull"/><property name="username" value="root"/><property name="password" value="root"/><property name="initialSize" value="100"/><property name="maxActive" value="200"/><!--<property name="maxIdle" value="10"/>--><property name="minIdle" value="5"/><property name="maxWait" value="3000"/></bean><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/></bean><bean id="userSupport" class="dao.impl.UserDaoSupport"><property name="jdbcTemplate" ref="jdbcTemplate"/></bean></beans>
- 将jdbcTemplate声明为可以被Spring管理的bean
- 将继承了JdbcDaoSupport的类声明为bean,并且为其的属性(父类中的jdbcTemplate)赋值
进阶技巧
使用NamedParameterJdbcDaoSupport
- 使用命名参数形式
- 让Dao类继承NamedParameterJdbcDaoSupport类
目的和使用NamedParameterJdbcTemplate类是一样的,都是为了进一步方便代码开发,用map中键名代替sql中的?占位符,方便阅读。
UserDaoNamedSupport
public class UserDaoNamedSupport extends NamedParameterJdbcDaoSupport implements UserDao {@Overridepublic List<User> getAllUsers() {return null;}@Overridepublic List<User> getUsersByCond(User user) {return null;}@Overridepublic User getUserById(int id) {return null;}@Overridepublic int addUser(User user) {String sql="insert into t_user(user_name,password)values (:username,:password)";Map map=new HashMap();map.put("username","fff");map.put("password","ccc");return getNamedParameterJdbcTemplate().update(sql,map);}@Overridepublic int deleteUser(int id) {return 0;}@Overridepublic int updateUser(int id) {return 0;}
}
spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.0.xsd"><context:component-scan base-package="dao"/><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/csx_demo?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull"/><property name="username" value="root"/><property name="password" value="root"/><property name="initialSize" value="100"/><property name="maxActive" value="200"/><!--<property name="maxIdle" value="10"/>--><property name="minIdle" value="5"/><property name="maxWait" value="3000"/></bean><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/></bean><bean id="userSupport" class="dao.impl.UserDaoSupport"><property name="jdbcTemplate" ref="jdbcTemplate"/></bean><bean id="namedUserSupport" class="dao.impl.UserDaoNamedSupport"><property name="jdbcTemplate" ref="jdbcTemplate"/></bean>
</beans>
总结
简化Spring JDBC 开发的相关支持类,进一步简化Spring JDBC的开发。