一、前言
- 对于数据访问层,无论是 SQL(关系型数据库) 还是 NOSQL(非关系型数据库),Spring Boot 底层都是采用 Spring Data 的方式进行统一处理。
- Spring Boot 底层都是采用 Spring Data 的方式进行统一处理各种数据库,而 Spring Data 也是 Spring 中与 Spring Boot、Spring Cloud 等知名项目 。
- Sping Data 官网:https://spring.io/projects/spring-data
- 数据库相关的启动器 :可以参考官方文档:https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/reference/htmlsingle/#using-boot-starter
二、创建对应开发模块
1、引入我们本次要使用的模块
2、当我们项目创建完成时会自动引入我们选中的启动器
<dependencies>
<!--Web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--JDBC-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- MySQL驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
3、创建 yaml 配置文件进行对我们的数据库进行连接
spring:
datasource:
username: root
password: 123456
#如果出现时区报错提示在?后面加上这个:serverTimezone=UTC&
url: jdbc:mysql://localhost:3306/test01?useUnicode=true&characterEncoding=utf-8
driver-class-name: com.mysql.cj.jdbc.Driver
4、测试是否配置成功
@SpringBootTest
class Springboot05JdbcApplicationTests {
@Autowired
DataSource dataSource;
@Test
void contextLoads() throws SQLException {
//查看默认数据源:com.zaxxer.hikari.HikariDataSource(目前速度最快的)
System.out.println(dataSource.getClass());
//获取数据库连接
Connection connection = dataSource.getConnection();
System.out.println("数据库连接信息:" + connection);
//关闭连接
connection.close();
}
}
4.1、底层分析
- 从上面代码执行中我们可以看到它默认给我们配置的数据源为:class com.zaxxer.hikari.HikariDataSource 。 然而,我们并没有手动配置。那这是什么原理呢?我们可以一同来看看,全局搜索一下 DataSourceAutoConfiguration 文件,关于数据源的所有自动配置都在这个文件中。
- 这里导入的类都在 DataSourceConfiguration 配置类下,可以看出 Spring Boot 2.4.3 默认使用 HikariDataSource 数据源,且 2.0.X 之后都是默认使用这个数据源的。而以前版本,如 Spring Boot 1.5 默认使用 org.apache.tomcat.jdbc.pool.DataSource
- HikariDataSource 号称 Java WEB 当前速度最快的数据源,相比于传统的 C3P0 、DBCP、Tomcat jdbc 等连接池更加优秀。
三、JDBCTemplate
- 有了数据源(com.zaxxer.hikari.HikariDataSource),然后可以拿到数据库连接(java.sql.Connection),有了连接,就可以使用原生的 JDBC 语句来操作数据库。
- 即使不使用第三方第数据库操作框架,如 MyBatis 等,Spring 本身也对原生的 JDBC 做了轻量级的封装,即 JdbcTemplate。
- 数据库操作的所有 CRUD 方法都在 JdbcTemplate 中。
- Spring Boot 不仅提供了默认的数据源,同时默认已经配置好了 JdbcTemplate 放在了容器中,我们只需自己注入即可使用。
- JdbcTemplate 的自动配置是依赖 org.springframework.boot.autoconfigure.jdbc 包下的 JdbcTemplateConfiguration 类。
JdbcTemplate主要方法:
- execute 方法: 可以用于执行任何 SQL 语句,一般用于执行 DDL (数据库定义语言)语句。
- update 方法及 batchUpdate 方法: update 方法用于执行新增、修改、删除等语句。batchUpdate 方法用于执行批处理相关语句。
- query 方法及 queryForXXX方法: 用于执行查询相关语句。
- call方法: 用于执行存储过程、函数相关语句。
方法测试
@RestController
@RequestMapping("/jdbc")
public class JdbcController {
@Autowired
JdbcTemplate jdbcTemplate;
/**
* 查询部门表中所有数据
* @return: java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
*/
@GetMapping("/list")
public List<Map<String,Object>> deptList(){
String sql = "select * from job";
List<Map<String, Object>> deptlist = jdbcTemplate.queryForList(sql);
return deptlist;
}
/**
* 添加部门
* @return: java.lang.String
*/
@PostMapping("/save")
public String addDept(){
String sql = "insert into dept(id,dname,loc)"+"values(50,'研发部','杭州')";
jdbcTemplate.update(sql);
return "添加部门成功!";
}
/**
* 根据 id 删除部门
* @Param: [id]
* @return: java.lang.String
*/
@GetMapping("/clear/{id}")
public String deleteDept(@PathVariable("id") int id){
String sql = "delete from dept where id = ?";
jdbcTemplate.update(sql,id);
return "删除部门成功!";
}
@GetMapping("/update/{id}")
public String updateDept(@PathVariable("id") int id){
String sql = "update dept set dname = ?,loc = ? where id ="+id;
Object[] objects = new Object[2];
objects[0] = "运营部";
objects[1] = "宁波";
jdbcTemplate.update(sql,objects);
return "修改部门表数据成功!";
}
}