它是 spring 提供的一个对象,对原始的 JDBC 的 API 操作进行简单的封装。它更像是一个工具,和 DButils 很像,只是 Spring 不叫 util,叫 Template(模板)。
除此之外,Spring 还提供了很多的模板,例如操作关系型数据库的 HibernateTemplate,操作 NoSql 数据库的 RedisTemplate,操作消息队列的 JmsTemplate等等
下面采用的是 Maven 创建的工程
其中 spring-jdbc 是 jdbcTemplate 基本支持,spring-tx 用于控制事务,spring-context 是 spring 的基本,mysql 是驱动,c3p0 是连接池,junit 使用了测试方便,这样无需写 main 函数。
有一张 acc 表,里面有两个字段,分别为 account( varchar ) 和 age( varchar ),实体类 account 如下
public class Account { private String account; private String age; @Override public String toString() { return "Account{" + "account='" + account + '\'' + ", age='" + age + '\'' + '}'; } public void setAccount(String account) { this.account = account; } public void setAge(String age) { this.age = age; } public String getAccount() { return account; } public String getAge() { return age; } }配置数据源
因为是用在数据库上的,所以需要在 spring 的配置文件配置数据源,这里使用的 c3p0 连接池技术。
<!--配置数据源对象--> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.drivar}"></property> <property name="jdbcUrl" value="${jdbc.url}"></property> <property name="user" value="${jdbc.user}"></property> <property name="password" value="${jdbc.password}"></property> </bean>配置 JdbcTemplate 对象
这里配置对象,并且交给 Spring 容器管理。
<!--配置 jdbc 模板对象--> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"></property> </bean>查询多个对象
// 把 junit 的测试加给 spring,这样在每次运行测试之前,他都可以帮我们生成 spring 容器。 @RunWith(SpringJUnit4ClassRunner.class) //指定上下文配置文件 @ContextConfiguration("classpath:applicationContext.xml") public class MainTestCRUD { @Autowired private JdbcTemplate jdbcTemplate; @Test public void test4() throws PropertyVetoException { List<Account> query = jdbcTemplate.query("select * from acc", new BeanPropertyRowMapper<>(Account.class)); for (Account temp: query ) { System.out.println(query); } } }查询单个对象
// 把 junit 的测试加给 spring,这样在每次运行测试之前,他都可以帮我们生成 spring 容器。 @RunWith(SpringJUnit4ClassRunner.class) //指定上下文配置文件 @ContextConfiguration("classpath:applicationContext.xml") public class MainTestCRUD { @Autowired private JdbcTemplate jdbcTemplate; @Test public void test4() throws PropertyVetoException { Account query = jdbcTemplate.queryForObject("select * from acc where account=? ", new BeanPropertyRowMapper<>(Account.class),"tom"); System.out.println(query); } }查询聚合函数的结果
// 把 junit 的测试加给 spring,这样在每次运行测试之前,他都可以帮我们生成 spring 容器。 @RunWith(SpringJUnit4ClassRunner.class) //指定上下文配置文件 @ContextConfiguration("classpath:applicationContext.xml") public class MainTestCRUD { @Autowired private JdbcTemplate jdbcTemplate; @Test public void test4() throws PropertyVetoException { int i = jdbcTemplate.queryForObject("select count(*) from acc",Integer.class); System.out.println(i); } }在 JdbcTemplate 中,都是对 sql 使用占位符 ?来占位,并且在 update 或者 query 参数传参时候,都有顺序要求,如果占位符很多,顺序记不清怎么办?
Spring 还提供了一个 JdbcTemplate 的子类 NamedParameterJdbcTemplate 来解决这个问题。那么如何用?
把 JdbcTemplate 的 bean 配置改成如下
<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate"> <constructor-arg ref="dataSource"></constructor-arg> </bean>对数据库的操作,如插入改成如下,其他的操作类似
修改 Sql 语句
String sql = "insert into acc values(:account,:age)";添加 Map 关系
Map<String,Object> map = new HashMap<>(); map.put("account", "haha"); map.put("age", "18");执行
namedParameterJdbcTemplate.update(sql, map);整个代码如下
// 把 junit 的测试加给 spring,这样在每次运行测试之前,他都可以帮我们生成 spring 容器。 @RunWith(SpringJUnit4ClassRunner.class) //指定上下文配置文件 @ContextConfiguration("classpath:applicationContext.xml") public class MainTestCRUD { @Autowired private NamedParameterJdbcTemplate namedParameterJdbcTemplate; @Test public void test4() throws PropertyVetoException { String sql = "insert into acc values(:account,:age)"; Map<String,Object> map = new HashMap<>(); map.put("account", "haha"); map.put("age", "18"); namedParameterJdbcTemplate.update(sql, map); } }