JdbcTemplate 简介

Spring 对数据库的操作在 jdbc 上面做了深层次的封装,使用 JdbcTemplate 方便实现对数据库操作。

使用 spring 的注入功能,可以把 DataSource 注册到 JdbcTemplate 之中。

JdbcTemplate 位于spring-jdbc 中。其全限定命名为 org.springframework.jdbc.core.JdbcTemplate 。要使用 JdbcTemlate 还需一个 spring-tx 这个包包含了一下事务和异常控制。

JdbcTemplate 主要提供以下五类方法:

  • execute 方法:可以用于执行任何 SQL 语句,一般用于执行 DDL 语句;
  • update 方法及 batchUpdate 方法: update 方法用于执行新增、修改、删除等语句; batchUpdate 方法用于执行批处理相关语句;
  • query 方法及 queryForXXX 方法:用于执行查询相关语句;
  • call 方法:用于执行存储过程、函数相关语句。

    在Spring中使用JdbcTemplate

    配置 Spring 配置文件 application.xml ```xml <?xml version=”1.0” encoding=”UTF-8”?>
  1. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
  2. <property name="driverClassName" value="org.postgresql.Driver"/>
  3. <property name="url" value="jdbc:postgresql://localhost:5432/spring-jdbc?currentSchema=spring-jdbc"/>
  4. <property name="username" value="postgres"/>
  5. <property name="password" value="aaaaaa"/>
  6. </bean>
  1. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  2. <property name="dataSource" ref="dataSource"/>
  3. </bean>

  1. 我们通常将数据库的配置信息单独放到一个文件中,这样也为了方便后期维护:<br />在 src 下面新建一个属性配置文件 db.properties :

jdbc.driverClass=com.postgres.Driver jdbc.jdbcUrl=jdbc:postgresql://localhost:5432/spring-jdbc?currentSchema=spring-jdbc jdbc.user=postgrea jdbc.password=aaaaaa

  1. 修改 application.xml
  2. ```xml
  3. <?xml version="1.0" encoding="UTF-8"?>
  4. <beans xmlns="http://www.springframework.org/schema/beans"
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
  6. xmlns:context="http://www.springframework.org/schema/context"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
  9. <!-- 配置DataSource-->
  10. <!-- <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">-->
  11. <!-- <property name="driverClassName" value="org.postgresql.Driver"/>-->
  12. <!-- <property name="url" value="jdbc:postgresql://localhost:5432/spring-jdbc?currentSchema=spring-jdbc"/>-->
  13. <!-- <property name="username" value="postgres"/>-->
  14. <!-- <property name="password" value="aaaaaa"/>-->
  15. <!-- </bean>-->
  16. <!-- 在Spring的配置文件中引入属性文件-->
  17. <!-- <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">-->
  18. <!-- <property name="location" value="classpath:db.properties"/>-->
  19. <!-- </bean>-->
  20. <context:property-placeholder location="db.properties"/>
  21. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
  22. <property name="driverClassName" value="${jdbc.driverClass}" />
  23. <property name="url" value="${jdbc.jdbcUrl}" />
  24. <property name="username" value="${jdbc.user}" />
  25. <property name="password" value="${jdbc.password}" />
  26. </bean>
  27. <!-- 配置 JdbcTemplate-->
  28. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  29. <property name="dataSource" ref="dataSource"/>
  30. </bean>
  31. <!-- 声明bean-->
  32. <bean id="userDao" class="spring.jdbc.demo.UserDaoImpl">
  33. <constructor-arg ref="jdbcTemplate"/>
  34. </bean>
  35. </beans>

JdbcTemplate 操作数据库

update() 添加、更新、删除

1.通过 update 插入数据

  1. 1 //启动IoC容器
  2. 2 ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
  3. 3 //获取IoC容器中JdbcTemplate实例
  4. 4 JdbcTemplate jdbcTemplate=(JdbcTemplate) ctx.getBean("jdbcTemplate");
  5. 5 String sql="insert into user (name,deptid) values (?,?)";
  6. 6 int count= jdbcTemplate.update(sql, new Object[]{"caoyc",3});
  7. 7 System.out.println(count);

这里 update 方法,第二参可以为可变参数。在数据库中可以看到,数据以被正确插入

Spring jdbc - 图1

2.通过 update 修改数据

  1. 1 String sql="update user set name=?,deptid=? where id=?";
  2. 2 jdbcTemplate.update(sql,new Object[]{"zhh",5,51});

3.通过 update 删除数据

  1. 1 String sql="delete from user where id=?";
  2. 2 jdbcTemplate.update(sql,51);

batchUpdate() 批量插入、更新和删除方法

1.批量插入

  1. 1 String sql="insert into user (name,deptid) values (?,?)";
  2. 2
  3. 3 List<Object[]> batchArgs=new ArrayList<Object[]>();
  4. 4 batchArgs.add(new Object[]{"caoyc",6});
  5. 5 batchArgs.add(new Object[]{"zhh",8});
  6. 6 batchArgs.add(new Object[]{"cjx",8});
  7. 7
  8. 8 jdbcTemplate.batchUpdate(sql, batchArgs);

batchUpdate 方法第二参数是一个元素为 Object[] 数组类型的 List 集合

query() 从数据中读取数据到实体对象

先定一个 User 实体类

  1. 1 package com.proc;
  2. 2
  3. 3 public class User {
  4. 4 private Integer id;
  5. 5 private String name;
  6. 6 private Integer deptid;
  7. 7 public Integer getId() {
  8. 8 return id;
  9. 9 }
  10. 10 public void setId(Integer id) {
  11. 11 this.id = id;
  12. 12 }
  13. 13 public String getName() {
  14. 14 return name;
  15. 15 }
  16. 16 public void setName(String name) {
  17. 17 this.name = name;
  18. 18 }
  19. 19 public Integer getDeptid() {
  20. 20 return deptid;
  21. 21 }
  22. 22 public void setDeptid(Integer deptid) {
  23. 23 this.deptid = deptid;
  24. 24 }
  25. 25
  26. 26 public String toString() {
  27. 27 return "User [id=" + id + ", ]";
  28. 28 }
  29. 29 }

1、读取单个对象

  1. 1 String sql="select id,name,deptid from user where id=?";
  2. 2
  3. 3 RowMapper<User> rowMapper=new BeanPropertyRowMapper<User>(User.class);
  4. 4 User user= jdbcTemplate.queryForObject(sql, rowMapper,52);
  5. 5 System.out.println(user);

输出结果:

User [id=52, name=caoyc, deptid=6]

【注意】: 1、使用 BeanProperytRowMapper 要求 sql 数据查询出来的列和实体属性需要一一对应。如果数据中列明和属性名不一致,在 sql 语句中需要用 as 重新取一个别名 2、使用 JdbcTemplate 对象不能获取关联对象

2、读取多个对象

  1. 1 String sql="select id,name,deptid from user";
  2. 2
  3. 3 RowMapper<User> rowMapper=new BeanPropertyRowMapper<User>(User.class);
  4. 4 List<User> users= jdbcTemplate.query(sql, rowMapper);
  5. 5 for (User user : users) {
  6. 6 System.out.println(user);
  7. 7 }

输出结果

… User [id=49, name = 姓名 49, deptid=5] User [id=50, name = 姓名 50, deptid=8]

User [id=52, name=caoyc, deptid=6]

User [id=53, name=zhh, deptid=8]

User [id=54, name=cjx, deptid=8]

3、获取某个记录某列或者 count、avg、sum 等函数返回唯一值

  1. String sql="select count(*) from user";
  2. int count= jdbcTemplate.queryForObject(sql, Integer.class);
  3. System.out.println(count);