Spring JDBC开发
@(Spring)[spring jdbc]
Spring的JDBC模板的概述
Spring是一站式框架有EE开发的每一层的解决方案,像持久层Spring提供了JDBC的模板和ORM模块用于整合其他的持久层框架。
什么是JDBC的模板
JDBC的模板是Spring提供的用于简化JDBC开发的一个技术。类似于DBUtils。
PS:在Spring4中已经移除对IBatis的支持,如果需要使用,请使用3版本的orm包
Spring的JDBC模板入门
创建web项目,引入jar包
创建表
create table account(
id int primary key AUTO_INCREMENT,
name varchar(20),
money double
);
编写测试
package com.pc;
import org.junit.Test;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
/**
* JDBC测试
*
* @author Switch
* @data 2016年11月25日
* @version V1.0
*/
public class JDBCTest {
/**
* 测试Spring JDBC模板
*/
@Test
public void testSpringJDBC() {
// 创建连接池
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/test");
dataSource.setUsername("root");
dataSource.setPassword("123456");
// 创建Spring JDBC模板
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(dataSource);
jdbcTemplate.update("insert into account(id, name, money) values(?,?,?)", null, "Switch", 50000d);
}
}
Spring管理连接池和模板
Spring管理内置连接池
<!-- Spring配置内置连接池 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root" />
<property name="password" value="123456"/>
</bean>
Spring管理Spring JDBC模板
<!-- Spring配置Spring JDBC模板 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
Spring管理DBCP连接池
- 引入DBCP连接池jar包
- 在Spring中配置DBCP的连接池
<!-- Spring配置dbcp连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="123456" />
</bean>
Spring管理C3P0连接池
- 引入c3p0连接池的jar包
- 在Spring中配置C3P0连接池
<!-- spring配置c3p0连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test" />
<property name="user" value="root" />
<property name="password" value="123456" />
</bean>
将连接数据库信息提取到属性文件中
- 提供属性文件db.properties
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=123456
在Spring的配置文件中引入外部属性文件
- 通过
<context>
标签引入
<!-- 引入外部属性文件 -->
<context:property-placeholder location="classpath:db.properties"/>
- 通过
<bean>
标签引入
<!-- 引入外部属性文件 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:db.properties"/>
</bean>
- 通过
使用属性文件中的key配置连接池
<!-- spring配置c3p0连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
Spring的JDBC的模板的API(完成CRUD)
插入、更新、删除的方法
int update(String sql,Object… args);
package com.pc;
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* JDBC测试
*
* @author Switch
* @data 2016年11月25日
* @version V1.0
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class JDBCTest {
@Resource(name = "jdbcTemplate")
private JdbcTemplate jdbcTemplate;
@Test
// insert语句
public void insert() {
jdbcTemplate.update("insert into account(id, name, money) values(?,?,?)", null, "Kity", 10000d);
}
@Test
// update语句
public void update() {
jdbcTemplate.update("update account set name = ?, money = ? where id = ?", "Tom", 20000d, 2);
}
@Test
// delete语句
public void delete() {
jdbcTemplate.update("delete from account where id = ?", 2);
}
}
查询的方法
T queryForObject(String sql,Class<T> c,Object… args);
T queryForObject(String sql,RowMapper<T> rowMapper,Object… args);
List<T> query(String sql,RowMapper rowMapper,Object… args);
package com.pc;
import java.util.List;
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* JDBC测试
*
* @author Switch
* @data 2016年11月25日
* @version V1.0
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class JDBCTest {
@Resource(name = "jdbcTemplate")
private JdbcTemplate jdbcTemplate;
@Test
// 查询单行单列
public void queryForObject1() {
String name = jdbcTemplate.queryForObject("select name from account where id = ?", String.class, 1);
System.out.println(name);
}
@Test
// 查询一行,封装到对应的对象
public void queryForObject2() {
Account account = jdbcTemplate.queryForObject("select * from account where id = ?", new AccountRowMapper(), 1);
System.out.println(account);
}
@Test
// 查询多行,封装到对应对象集合中
public void queryForList1() {
List<Account> accounts = jdbcTemplate.query("select * from account", new AccountRowMapper());
System.out.println(accounts);
}
}
package com.pc;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;
/**
* 账号类行映射
*
* @author Switch
* @data 2016年11月25日
* @version V1.0
*/
public class AccountRowMapper implements RowMapper<Account> {
@Override
public Account mapRow(ResultSet rs, int rowNum) throws SQLException {
Account account = new Account();
account.setId(rs.getInt("id"));
account.setName(rs.getString("name"));
account.setMoney(rs.getDouble("money"));
return account;
}
}
案例
GitHub:SpringDataTest