天天看点

使用Spring的JdbcTemplate、NamedParameterJdbcTemplate

一、JdbcTemplate概述##

  1. 为了使JDBC更加易于使用,Spring在JDBC API上定义了一个抽象层,以此建立一个JDBC存取框架。
  2. JdbcTemplate是Spring JDBC框架的核心,其设计目的是为不同类型的JDBC操作提供模板方法,每个模板方法都能够控制整个过程,并允许覆盖过程中的特定任务。通过这种方式,可以在尽可能保留灵活性的情况下,将数据库存取的工作量降到最低。

二、JdbcTemplate的使用

  1. 使用JdbcTemplate更新数据库

    ① 单个更新:使用

    int jdbcTemplate.update(String sql, Object... args)

    方法。

    ② 批量更新:使用

    int[] jdbcTemplate.batchUpdate(String sql, List<Object[]> batchArgs)

    方法。

    ③ 举个例子:

    //单个更新
    String sql = "update employee set name = ?  where id = ?";
    jdbcTemplate.update(sql, "33", 3);
               
    //批量更新
    String sql = "insert into employee(last_name, email, dept_id) values(?,?,?)";
    List<Object[]> batchArgs = new ArrayList<Object[]>();
    batchArgs.add(new Object[]{"testA","[email protected]",1});
    batchArgs.add(new Object[]{"testB","[email protected]",2});
    batchArgs.add(new Object[]{"testC","[email protected]",3});
    //执行批量insert操作
    jdbcTemplate.batchUpdate(sql, batchArgs);
               
  2. 使用JdbcTemplate查询数据库

    ① 查询单行:使用

    T JdbcTemplate.queryForObject(String sql, RowMapper<Employee> rowMapper, Object... args)

    方法

    ② 查询多行:使用

    List<T> JdbcTemplate.query(String sql, RowMapper<Employee> rowMapper, Object... args)

    方法

    ③ 查询单列:使用

    T JdbcTemplate.queryForObject(String sql, Class<Long> requiredType)

    方法
    //查询单行
    String sql = "select id, last_name lastName, email from employee where id = ?";
    RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<Employee>(Employee.class);
    Employee employee = jdbcTemplate.queryForObject(sql, rowMapper, 1);
    System.out.println(employee);
               
    //查询多行
    String sql = "select id, last_name lastName, email from employee where id > ?";
    RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<Employee>(Employee.class);
    List<Employee> employees = jdbcTemplate.query(sql, rowMapper, 4);
    System.out.println(employees);
               
    //查询单列
    String sql = "select count(id) from employee";
    long count = jdbcTemplate.queryForObject(sql, Long.class);
    System.out.println(count);
               
  3. 简化JDBC模板查询

    为了避免每次使用都创建一个新的JdbcTemplate实例,可以在Spring IOC容器中声明一个JdbcTemplate的单个实例的Bean(需要注入数据源),并注入到DAO层中JdbcTemplate的对象中。

    <!-- 配置Spring的JdbcTemplate -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    	<property name="dataSource" ref="dataSource"></property>
    </bean>
               
  4. JdbcDaoSupport简介

    Spring还提供了一个JdbcDaoSupport类来简化DAO操作。该类声明了jdbcTemplate属性,它可以从IOC容器中注入,或者自动从数据源中创建 。

三、NamedParameterJdbcTemplate的使用

  1. 经典的JDBC用法中,SQL参数是用占位符 ? 表示,并受到顺序的限制,当参数个数比较多时,占位符的顺序就容易出错,而且一旦参数顺序发生变化,就要改变参数绑定。
  2. 在Spring JDBC框架中,可以使用具名参数(named parameter)解决这一问题。
  3. 具名参数:SQL按名称(需要以冒号开头)指定。易于维护,提升了可读性。具名参数有框架类在运行时用占位符取代。
  4. NamedParameterJdbcTemplate 中可以使用具名参数。

    ① 在SPringle IOC容器中声明一个NamedParameterJdbcTemplate单实例的Bean。

    ② 在SQL语句中使用具名参数时,可以声明一个Map,将SQL的参数名作为key,参数值作为value

    优点:直接对参数名,不用管顺序,便于维护。

    缺点:较为麻烦。

    ③ 也可以使用 SqlParameterSource 的实现类 BeanPropertySqlParameterSource作为参数。

    ④ 举个例子:

/**
 * 使用具名参数: 声明一个Map作为参数
 */
String sql = "insert into employee(last_name, email, dept_id) 
values(:ln, :email, :deptId)";
Map<String,Object> paramMap = new HashMap<String, Object>();
paramMap.put("ln", "Mike");
paramMap.put("email", "[email protected]");
paramMap.put("deptId", "3");
namedParameterJdbcTemplate.update(sql, paramMap);
           
/**
 * 使用具名参数: 使用 SqlParameterSource作为参数
 */
String sql = "insert into employee(last_name, email, dept_id) 
values(:lastName, :email, :deptId)";
Employee employee = new Employee();
employee.setLastName("Jack");
employee.setEmail("[email protected]");
employee.setDeptId(2);

SqlParameterSource sqlParameterSource = new BeanPropertySqlParameterSource(employee);
namedParameterJdbcTemplate.update(sql, sqlParameterSource);