写在前面:
接着记录自己的Spring学习之旅,若看不懂则建议先看前几篇博文,详细代码可在我的Gitee仓库ssm-learning克隆下载学习使用!
1.10 JDBC Template
1.10.1 概述
JDBC Template是spring框架中提供的一个对象,是对原始复杂jdbc api的封装。一般提供对应多种数据库的操作模板类,主要有以下几种:
数据库类型 | 模板类 |
---|---|
关系型数据库 | Jdbc Template 和Hibernate Template |
noSql数据库 | Redis Template |
消息队列 | Jms Template |
1.10.2 开发步骤
- 导入Spring-jdbc和Spring-tx坐标;
- 创建数据库和实体
- 创建Jdbc Template对象
- 执行数据库操作
1.10.3 代码操作
1.10.3.1 项目准备
根据[#### 1.2.2.1 用Maven构建Spring项目]建立项目并补全所缺目录。
1.10.3.2 导入坐标
在pom文件中导入需要用到的坐标并更新,代码如下:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
</dependencies>
1.10.3.3 创建数据库表
打开Navicat 12,连接数据库,建立名为account的表,表结构如图
1.10.3.4 建立实体对应类
在main中java目录下建立名为Account的实体类,如图
代码如下:
public class Account {
private String name;
private double money;
public String getName() {
return name;
}
public double getMoney() {
return money;
}
public void setName(String name) {
this.name = name;
}
public void setMoney(double money) {
this.money = money;
}
@Override
public String toString() {
return "Account{" +
"name='" + name + '\'' +
", money=" + money +
'}';
}
}
1.10.3.5 简单测试
在test目录下新建测试类,添加测试代码,如下:
public class JdbcTemplateTest {
@Test
// 测试JdbcTemplate
public void JdbcTest() throws Exception
{
// 创建数据源对象
ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
comboPooledDataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
comboPooledDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=gbk&useSSL=false&serverTimezone=GMT%2B8");
comboPooledDataSource.setUser("root");
comboPooledDataSource.setPassword("root");
JdbcTemplate jdbcTemplate = new JdbcTemplate();
// 设置数据源对象
jdbcTemplate.setDataSource(comboPooledDataSource);
// 执行插入操作
int row = jdbcTemplate.update("insert into account values(?,?)", "张三", "5000");
System.out.println(row);
}
}
运行即可,可发现数据库已插入一条数据!
1.10.3.6 代码优化
1.10.3.6.1 XML注入
- 创建applicationContext.xml文件。进行bean配置,代码如下:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test?useUnicode=true& characterEncoding=gbk&useSSL=false&serverTimezone=GMT%2B8"/>
<property name="user" value="root"/>
<property name="password" value="root"/>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
- 测试。新建测试函数,使用ApplicationContext进行获取对象测试,代码如下:
// 测试使用Spring容器产生数据源---xml方式
@Test
public void JdbcTest2() throws Exception
{
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
JdbcTemplate jdbcTemplate = (JdbcTemplate) applicationContext.getBean("jdbcTemplate");
int row = jdbcTemplate.update("insert into account values(?,?)", "李四", "6000");
System.out.println(row);
}
- 结果依旧是插入成功!
1.10.3.6.2 Spring 集成Junit+抽取jdbc进行查询删除更新操作
- 根据[##### 1.5.5.1.4 简化jdbc参数创建数据源]创建jdbc.properties。
- 根据[#1 5 5 2 3 外部jdbc文件配置数据源]对applicationContext文件进行配置。
- 新建测试类CRUDJdbcTemplateTest,使用Spring集成Junit测试,代码如下:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class CRUDJdbcTemplateTest {
@Autowired
private JdbcTemplate jdbcTemplate;
@Test
//查询有多少条记录
public void testNumber()
{
Long count = jdbcTemplate.queryForObject("select count(*) from account", long.class);
System.out.println("数据库有"+ count + "条记录!");
}
@Test
//查询所有记录
public void testSelect() {
List<Account> accountList = jdbcTemplate.query("select * from account", new BeanPropertyRowMapper<Account>(Account.class));
System.out.println("查询所有信息:");
System.out.println(accountList);
}
@Test
//修改和删除
public void testCURD()
{
jdbcTemplate.update("update account set money = ? where name = ?","8000","张三");
jdbcTemplate.update("delete from account where name = ?","李四");
}
@Test
//查询单条记录
public void testSelectOne() {
Account account = jdbcTemplate.queryForObject("select * from account where name =?", new BeanPropertyRowMapper<Account>(Account.class), "张三");
System.out.println("查询张三的信息:");
System.out.println(account);
}
}
- 数据库数据操作之前如图
- 查询结果如图
数据库表变为如图