spring知识七------对JDBC的支持

本文介绍了Spring框架中对JDBC数据库操作的支持,包括JdbcTemplate和NamedParameterJdbcTemplate的使用方法,以及如何进行数据库的增删改查操作。同时对比了这两种模板的主要区别,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

spring框架也是集成了对JDBC数据库的操作,但是要明白的是spring对JDBC的支持只是一个简单的封装,而不是真正意义上的ORM框架,其中最主要的就是Spring对数据库的操作不支持级联操作,即对于存在外键关联的表,查询数据时,不会连带查询。但是spring新增了对数据库源文件的配置,这个可以说是简化了对数据源的连接。一般情况下我们都会在spring容器管理的基础上集成Hibernate框架或者ibatis框架。
spring框架对数据库的封装分为两个模板JdbcTemplate 和NamedParameterJdbcTemplate。其中最主要的区别就是NamedParameterJdbcTemplate可以使用具名参数。
具名参数: SQL 按名称(以冒号开头)而不是按位置进行指定。 具名参数更易于维护, 也提升了可读性。具名参数由框架类在运行时用占位符取代。具名参数只在 NamedParameterJdbcTemplate 中得到了支持 。

JdbcTemplate

首先我们需要在配置文件中添加我们所需要的配置文件。
可以看出我们所需要的类是在【org.springframework.jdbc.core】包中

        <!-- 配置jdbc模板 JdbcTemplate -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" >
        <property name="dataSource" value="#{datasource}"></property>
    </bean>

当我们配置好文件时,我们就可以进行对数据库的增删改查了。在这里一定要注意方法的调用
在查询时,我们要记得新增POJO类,让其返回为一个对象,而且要注意使用sql语句的别名与POJO类变量发生一一映射
不支持级联查询,如果一个类中包含了另外一个类变量,则会返回【null 】值。
RowMapper接口 指定如何去映射结果集的行,常用 的实现类是BeanPropertyRowMapper。
JdbcTemplate 类被设计成为线程安全的, 所以可以再 IOC 容器中声明它的单个实例, 并将这个实例注入到所有的 DAO 实例中。

    @Test  //单条记录更新  update(String sql, Object... args) 
    public void testUpdateSingle(){
        String sql = "Update employ set name=? where id=?";
        jdbcTemplate.update(sql, "fafa",5);
    }

    @Test   
    //批量更新 batchUpdate(String sql, List<Object[]> batchArgs)
    /* 注意最后一个参数batchArgs为Object[]的List 类型:
        修改一条记录需要一个Object的数组,修改多条记录需要多个Object的数组,,批量修改则是存放在List中
    */
    public void testUpdateBatch(){
        String sql = "insert into employ(name,age,sex,departid) values(?,?,?,?)";
        List<Object[]> batchArgs =new ArrayList<Object[]>();
        batchArgs.add(new Object[]{"AA",15,"男",1});
        batchArgs.add(new Object[]{"BB",18,"女",2});
        batchArgs.add(new Object[]{"CC",22,"男",1});

        jdbcTemplate.batchUpdate(sql, batchArgs);
    }


    @Test
    /*
     * 从数据库中获取一条记录就是对应的一个对象
     * RowMapper接口  指定如何去映射结果集的行,常用 的实现类是BeanPropertyRowMapper
     * 在sql语句中使用别名完成列名与类的属性名的映射。last_name  lastName
     * 不支持级联属性的查询,JdbcTemplate 只是简单的封装jdbc,不是ORM 框架
     * 
     * queryForObject(String sql, RowMapper<Employ> rowMapper, Object... args)
     */

    public void testQueryObject(){  
        String sql="select id,last_name lastName,age,sex,departid from employ where id=?";  
        RowMapper<Employ> rowmapper = new BeanPropertyRowMapper(Employ.class);
        Employ emp =  jdbcTemplate.queryForObject(sql, rowmapper,1);
        System.out.println(emp);
    }

    @Test  
    //查询实体类集合,query(String sql, RowMapper<Employ> rowMapper, Object... args) 
    public void testQueryList(){
        String sql = "select id,last_name lastName,age,sex,departid from employ where id>?";
        RowMapper<Employ> rowMapper = new BeanPropertyRowMapper(Employ.class);
        List<Employ> query = jdbcTemplate.query(sql, rowMapper,5);
        System.out.println(query);
    }

JdbcDaoSupport

一般在项目中我们在持久层对数据库进行操作,
Spring JDBC 框架还提供了一个 JdbcDaoSupport 类来简化 DAO 实现. JdbcDaoSupport 类声明了 jdbcTemplate 属性, 它可以从 IOC 容器中注入, 或者自动从数据源中创建。但是不建议这样使用,因为这样的使用,在我们利用注解的时候,需要我们手工导入dataSource或者jdbcTemplate
在xml中我们可以通过配置文件进行注入dataSource和jdbcTemplate。而在注解时,没有办法自动注入,因为在这里JdbcDaoSupport对于Set的方法是Final的,不能够被重写,只能利用曲线救国。在我们自定义的方法中进行调用,然后设置dataSource或者jdbcTemplate。下面是代码演示,建议使用第二种方式。


// 在基于注解的时候,不推荐使用JdbcDaoSupport进行工作,而是在dao层引入JdbcTemplate作为其类成员变量
@Repository
public class DepartDAO extends JdbcDaoSupport {
// 在继承spring的JdbcDaoSupport 时,
//利用注解时要注意引入一个dateSource或者JdbcTemplate 在此类中,否则会进行报错 利用setter方法进行引入

/*  @Autowired
    public void SetterDatasource2(DataSource dataSource){
        setDataSource(dataSource);
    }
*/
    @Autowired
    public void SetterJdbcTeplate2(JdbcTemplate jdbcTemplate){
        setJdbcTemplate(jdbcTemplate);
    }

    public Depart get(int id){
        String sql = "select id,name,people_count peopleCount from depart where id=?";
        RowMapper<Depart> rowMapper = new BeanPropertyRowMapper(Depart.class);  

        return depart;
    }
}

// 推荐使用这个模式
@Repository
public class EmployDAO {

    @Autowired
    private JdbcTemplate jdbcTemplate;      
    public Employ  findEmploy(int id){
        String sql="select id,last_name lastName,age,sex,departid from employ where id=?";
        RowMapper<Employ> rowmapper = new BeanPropertyRowMapper(Employ.class);
        Employ emp =  jdbcTemplate.queryForObject(sql, rowmapper,id);

      return emp;
    }
}

NamedParameterJdbcTemplate

首先我们需要在配置文件中添加我们所需要的配置文件。
可以看出我们所需要的类是在【org.springframework.jdbc.core】包中
NamedParameterJdbcTemplate没有无参的构造器,所以利用一个有参的构造器将DataSource传递进去

<!-- 配置 jdbc模板NamedParameterJdbcTemplate  该对象可以使用具名参数  -->

        <bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
            <constructor-arg ref="datasource"></constructor-arg>
        </bean>

对于NamedParameterJdbcTemplate的使用有两种方式
方式一是简单的起参数名称
方式二是将参数名称与我们的pojo类字段名称一致


    @Test  
    // 使用namedParameterJdbcTemplate模板进行操作数据库,可以使用具名参数,对于数据的封装我们放到map中
    /* 方式一
     *可以为参数取名字,如果有对个参数的话,可以省略对位置的麻烦,直接对应参数名就可以了,便于维护
     *但是就是比较麻烦,需要使用map进行数据封装 
     *
     *update(String sql, Map<String, ?> paramMap)
     */
    public void testnamedParameterJdbcTemplate(){
        String sql ="insert into depart (name,people_count) values(:ln,:count)";

        Map<String, Object> paramMap = new HashMap<String, Object>();
        paramMap.put("ln", "ff");
        paramMap.put("count", 7);
        namedParameterJdbcTemplate.update(sql, paramMap);
    }


    @Test  // 使用namedParameterJdbcTemplate模板进行操作数据库,可以使用具名参数
    /* 方式二
     *可以为参数取名字,如果使参数名字与我们类中的字段名称相对应的话,我们可以进行传递类对象
     *update(String sql, SqlParameterSource paramSource)
     */
    public void testnamedParameterJdbcTemplate02(){
        String sql ="insert into depart (name,people_count) values(:name,:peopleCount)";

        Depart depart = new Depart();
        depart.setName("太极");
        depart.setPeopleCount(6);

        SqlParameterSource paramSource = new BeanPropertySqlParameterSource(depart);
        namedParameterJdbcTemplate.update(sql, paramSource);
    }

源码不再单独上传到博客资源,不容易通过,后期会发出百度云链接或者源码Github地址:
https://github.com/wangfa1994/SpringLearning/tree/spring006

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值