Spring JDBC-Spring 对 JDBC的 DAO支持类详解

 前言

参照我的博客,熟悉基础的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>(){
        @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&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;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&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;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的开发。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值