前言
参照我的博客,熟悉基础的Spring JDBC的操作
了解基础的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>(){
@Override
public 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;
@Override
public List<User> getAllUsers() {
return null;
}
@Override
public List<User> getUsersByCond(User user) {
return null;
}
@Override
public User getUserById(int id) {
return null;
}
@Override
public 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);
}
@Override
public int deleteUser(int id) {
return 0;
}
@Override
public int updateUser(int id) {
return 0;
}
}
JdbcDaoSupport
public class UserDaoSupport extends JdbcDaoSupport implements UserDao {
@Override
public List<User> getAllUsers() {
return null;
}
@Override
public List<User> getUsersByCond(User user) {
return null;
}
@Override
public User getUserById(int id) {
return null;
}
@Override
public 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);
}
@Override
public int deleteUser(int id) {
return 0;
}
@Override
public 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/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://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 {
@Override
public List<User> getAllUsers() {
return null;
}
@Override
public List<User> getUsersByCond(User user) {
return null;
}
@Override
public User getUserById(int id) {
return null;
}
@Override
public 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);
}
@Override
public int deleteUser(int id) {
return 0;
}
@Override
public 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/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://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的开发。