一 . JdbcTemplate之准备工作
JdbcTemplate是spring JDBC框架为我们提供的一个类 帮助我们进行CURD的
所以要想使用spring JDBC框架 我们只要获取JdbcTemplate对象就可以
JdbcTemplate是一个操作数据库的对象
tx:操作事务
1 .简介
2. 准备工作
新建模块spring-transaction com.atguigu.spring
①加入依赖
<packaging>jar</packaging> <dependencies> <!-- 基于Maven依赖传递性,导入spring-context依赖即可导入当前所需所有jar包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.1</version> </dependency> <!-- Spring 持久化层支持jar包 --> <!-- Spring 在执行持久化层操作、与持久化层技术进行整合过程中,需要使用orm、jdbc、tx三个jar包 --> <!-- 导入 orm 包就可以通过 Maven 的依赖传递性把其他两个也导入 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>5.3.1</version> </dependency> <!-- Spring 测试相关 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.3.1</version> </dependency> <!-- junit测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- MySQL驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.16</version> </dependency> <!-- 数据源 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.31</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.3.1</version> </dependency> </dependencies>
②创建spring-jdbc.xml
③ 创建jdbc.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC
jdbc.username=root
jdbc.password=123456
④ 配置Spring的配置文件spring-jdbc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--引入jdbc.properties--> <!-- 导入外部属性文件 -->
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
<!-- 配置数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!-- 配置 JdbcTemplate -->
<bean class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 装配数据源 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>
3 . 测试
变成这样
添加测试数据
我们的目的是通过JdbcTemplate实现CURD
二 . spring整合Junit4和JdbcTemplate实现添加功能
创建测试类
com.atguigu.spring.test.JdbcTemplateTest
我们之前添加如下所示spring整合Junit的依赖
<!-- Spring 测试相关 spring整合Junit的依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.3.1</version> </dependency>
问题:spring是如何来整合Junit
他可以让我们的测试类 在spring的测试环境中 来执行 这个时候 我们就不用每一次都去获取IOC容器了 我们之前写的时候每一次都要获取IOC容器 然后在获取IOC容器中的每一个Bean 然后在来使用这个Bean
而我们现在让Junit的测试类在spring的测试环境中执行的时候 不用在获取IOC容器 我们可以直接通过依赖注入的方式 来获取IOC容器的某个bean 然后直接使用就可以 那应该如何去做呢?
我们应该在测试类上加上以下二个注解
(1)@RunWith(SpringJUnit4ClassRunner.class):指定当前测试类在Spring的测试环境中执行,此时就可以通过注入的方式直接获取IOC容器中bean
(2) @ContextConfiguration("classpath:spring-jdbc.xml"):设置Spring测试环境的配置文件
classpath:是类路径
拓展:
@ContextConfiguration
这个注解通常与@RunWith(SpringJUnit4ClassRunner.class)
联合使用用来测试因为我们知道spring环境必须要用配置文件的支持的 通过
@RunWith(SpringJUnit4ClassRunner.class)注解后
指定当前测试类在Spring的测试环境,就可以获取IOC容器中的bean 那IOC容器又是如何获取的呢?
IOC容器的获取必须要用配置文件 所以运用@ContextConfiguration注解来获取配置文件,从而获取IOC容器
复习依赖注入方式:
set方法注入
构造器注入
自动装配注入 @Autowired
测试:
//指定当前测试类在Spring的测试环境中执行,此时就可以通过注入的方式直接获取IOC容器中bean
@RunWith(SpringJUnit4ClassRunner.class)
//设置Spring测试环境的配置文件 引入配置文件
@ContextConfiguration("classpath:spring-jdbc.xml")
public class JdbcTemplateTest {
@Autowired
private JdbcTemplate jdbcTemplate;
@Test
public void testInsert(){
String sql = "insert into t_user values(null,?,?,?,?,?)";
jdbcTemplate.update(sql, "root", "123", 23, "女", "123@qq.com");
}
}
三 . JdbcTemplate实现查询功能
查询一条数据为实体类对象
① 创建实体类
package com.atguigu.spring.pojo;
public class User {
private Integer id;
private String username;
private String password;
private Integer age;
private String gender;
private String email;
public User() {
}
public User(Integer id, String username, String password, Integer age, String gender, String email) {
this.id = id;
this.username = username;
this.password = password;
this.age = age;
this.gender = gender;
this.email = email;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
", email='" + email + '\'' +
'}';
}
}
测试里面写sql 了解 以后用得比较多的 还是mybatis
//查询一条数据为实体类对象
@Test
public void testGetUserById(){
String sql = "select * from t_user where id = ?";
User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(User.class), 1);
System.out.println(user);
}
}
查询多条数据为一个list集合
// 查询多条数据为一个list集合
@Test
public void testGetAllUser(){
String sql = "select * from t_user";
List<User> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
list.forEach(System.out::println);
}
查询单行单列的值
//查询单行单列的值
@Test
public void testGetCount(){
String sql = "select count(*) from t_user";
Integer count = jdbcTemplate.queryForObject(sql, Integer.class);
System.out.println(count);
}
全部代码:
package com.atguigu.spring.test;
import com.atguigu.spring.pojo.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.List;
//指定当前测试类在Spring的测试环境中执行,此时就可以通过注入的方式直接获取IOC容器中bean
@RunWith(SpringJUnit4ClassRunner.class)
//设置Spring测试环境的配置文件 引入配置文件 通过获取配置文件来获取IOC
@ContextConfiguration("classpath:spring-jdbc.xml")
public class JdbcTemplateTest {
@Autowired
private JdbcTemplate jdbcTemplate;
//spring整合Junit4和JdbcTemplate实现添加功能
@Test
public void testInsert(){
String sql = "insert into t_user values(null,?,?,?,?,?)";
jdbcTemplate.update(sql, "root", "123", 23, "女", "123@qq.com");
}
//查询一条数据为实体类对象
@Test
public void testGetUserById(){
String sql = "select * from t_user where id = ?";
User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(User.class), 1);
System.out.println(user);
}
// 查询多条数据为一个list集合
@Test
public void testGetAllUser(){
String sql = "select * from t_user";
List<User> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
list.forEach(System.out::println);
}
//查询单行单列的值
@Test
public void testGetCount(){
String sql = "select count(*) from t_user";
Integer count = jdbcTemplate.queryForObject(sql, Integer.class);
System.out.println(count);
}
}