【WEEK12】 【DAY1】整合JDBC【中文版】
2024.5.13 Monday
目录
- 11.整合JDBC
- 11.1.SpringData简介
- 11.2.新建springboot-04-data项目
- 11.3.新建application.yaml
- 11.4.连接数据库
- 11.5.修改Springboot04DataApplicationTests.java
- 11.5.1.查看DataSourceProperties.java和DataSourceAutoConfiguration.java
- 11.6.JDBCTemplate
- 11.7.测试
- 11.7.1.新建JDBCController.java
- 11.7.2.运行springboot-04-data
- 11.7.3.修改JDBCController.java(增、删、改)
- 11.7.3.1.Add
- 11.7.3.2.Update
- 11.7.3.3.Delete
- 11.8.查看源码
- 11.8.1.DataSourceAutoConfiguration.java
- 11.8.2.ConditionalOnProperty.java
11.整合JDBC
11.1.SpringData简介
- 对于数据访问层,无论是 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
11.2.新建springboot-04-data项目
添加maven支持(在Project Structure->Modules点击加号添加对应项目),按照惯例修改settings中的maven,jdk和Java版本,Project Structure中的jdk和Java版本。修改pom中的springframework版本到2.7.13,重新加载Maven,删除多余文件。
配图版请见:新建springboot项目后需要配置的内容
11.3.新建application.yaml
根据个人已有数据库编辑代码:
spring:datasource:username: rootpassword: 123456url: jdbc:mysql://localhost:3306/p37jdbc?useUnicode=true&characterEncoding=utf-8driver-class-name: com.mysql.jdbc.Driver
11.4.连接数据库
选一个有参数的数据库表
11.5.修改Springboot04DataApplicationTests.java
package com.P31;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;@SpringBootTest
class Springboot04DataApplicationTests {@AutowiredDataSource dataSource;@Testvoid contextLoads() throws SQLException {//查看默认的数据源(运行后可以在最后一行看到)是:com.zaxxer.hikari.HikariDataSourceSystem.out.println(dataSource.getClass());//获取数据库连接Connection connection = dataSource.getConnection();System.out.println(connection);//看到xxxxTemplate->这是SpringBoot已经配置好的模板bean,拿来即用//关闭connection.close();}}
以下这段红字提示的版本过时可以忽略,默认数据源是相比其他数据源运行更快的那一个:
在新版本里刷新可能出现以下错误:
此时需要修改application.yaml中的时区设置:
spring:datasource:username: rootpassword: 123456#假如时区报错,就增加一个时区的配置,和其他配置用&连接,如:serverTimezone=UTCurl: jdbc:mysql://localhost:3306/p37jdbc?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8driver-class-name: com.mysql.cj.jdbc.Driver
11.5.1.查看DataSourceProperties.java和DataSourceAutoConfiguration.java
这是数据库可以自动配置的原理
11.6.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方法:用于执行存储过程、函数相关语句。
11.7.测试
新建controller文件夹
11.7.1.新建JDBCController.java
查询指定表中的所有数据
package com.P31.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;
import java.util.Map;@RestController
public class JDBCController {@AutowiredJdbcTemplate jdbcTemplate; //可以点开JdbcTemplate查看//查询数据库的所有信息//没有实体类,怎么获取数据库中的信息?->使用Map@GetMapping("/userList")public List<Map<String,Object>> userList(){String sql = "SELECT * FROM users";List<Map<String,Object>> list_maps = jdbcTemplate.queryForList(sql);return list_maps;}
}
11.7.2.运行springboot-04-data
记得选择
清空浏览器缓存,然后访问:http://localhost:8080/userList
和数据库中相同
11.7.3.修改JDBCController.java(增、删、改)
package com.P31.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;import java.util.List;
import java.util.Map;@RestController
public class JDBCController {@AutowiredJdbcTemplate jdbcTemplate; //可以点开JdbcTemplate查看//查询数据库的所有信息//没有实体类,怎么获取数据库中的信息?->使用Map@GetMapping("/userList")public List<Map<String,Object>> userList(){String sql = "SELECT * FROM users";List<Map<String,Object>> list_maps = jdbcTemplate.queryForList(sql);return list_maps;}//增加@GetMapping("/addUser")public String addUser(){String sql = "INSERT INTO p37jdbc.users(id,NAME,PASSWORD,email,birthday) VALUES(6,'ZHAOSI','312321','111@outlook','2024-05-05')";jdbcTemplate.update(sql);return "completed add";}//更新@GetMapping("/updateUser/{id}")public String updateUser(@PathVariable("id") int id){String sql = "UPDATE p37jdbc.users SET NAME=?,PASSWORD=? WHERE id="+id;//封装Object[] objects = new Object[2];objects[0] = "ZHENGSAN";objects[1] = "12121212";jdbcTemplate.update(sql,objects);return "completed update";}//删除@GetMapping("/deleteUser/{id}")public String deleteUser(@PathVariable("id") int id){String sql = "DELETE FROM p37jdbc.users WHERE id=?";jdbcTemplate.update(sql,id);return "completed delete";}
}
11.7.3.1.Add
http://localhost:8080/addUser
11.7.3.2.Update
http://localhost:8080/updateUser/5
11.7.3.3.Delete
http://localhost:8080/deleteUser/4
11.8.查看源码
11.8.1.DataSourceAutoConfiguration.java
数据源:
@Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class,DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.OracleUcp.class,DataSourceConfiguration.Generic.class, DataSourceJmxConfiguration.class })
这些数据源会在pom.xml
中导入JDBC包后自动引用
如果想要自定义:修改type
11.8.2.ConditionalOnProperty.java
点击DataSourceAutoConfiguration.java
中的name
跳转到此文件(由于版本不同,理应跳转到DataSourceConfiguration.java
),可见其中提供了自定义的方式和自动注入的设置。