使用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","testA@A.com",1});
    batchArgs.add(new Object[]{"testB","testB@B.com",2});
    batchArgs.add(new Object[]{"testC","testC@C.com",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", "Mike@mike.com");
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("Jack@jack.com");
employee.setDeptId(2);

SqlParameterSource sqlParameterSource = new BeanPropertySqlParameterSource(employee);
namedParameterJdbcTemplate.update(sql, sqlParameterSource);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值