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

来源:互联网 发布:c语言中的float 编辑:程序博客网 时间:2024/06/06 11:01

概述

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作为其类成员变量@Repositorypublic 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;    }}// 推荐使用这个模式@Repositorypublic 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

0 0
原创粉丝点击