1.SpringData简介
- 对于数据访问层,无论是 SQL(关系型数据库) 还是 NOSQL(非关系型数据库),Spring Boot 底层都是采用 Spring Data 的方式进行统一处理
- Spring Boot 底层都是采用 Spring Data 的方式进行统一处理各种数据库,Spring Data 也是 Spring 中与 Spring Boot、Spring Cloud 等齐名的知名项目
- Sping Data 官网
- 数据库相关的启动器,可以参考官方文档,其实这个文档记录了springBoot所有启动器,与数据库相关的我们只需要找spring-boot-starter-data-xxx的启动器即可
2.springBoot对JDBC的自动配置/springBoot对JDBC的封装
- 直接上代码进行讲解
- 创建一个新项目:springboot-04-data
- 清理项目结构,只保留有用的东西
- 数据库操作step1,配置4大参数;springBoot对于数据库的连接也做了封装,我们只需要在配置文件中配置好4大参数即可使用
spring: datasource: username: root password: 123 url: jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=utf-8 driver-class-name: com.mysql.jdbc.Driver
- 注意:springBoot最大优点:自动配置,对于数据库连接池/数据源,springBoot当然也为我们实现了自动配置,我们可以输出看看springBoot为我们自动配置的是哪一个数据源
package com.thhh; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import javax.sql.DataSource; @SpringBootTest class Springboot04DataApplicationTests { @Autowired DataSource dataSource; @Test void contextLoads() { System.out.println(dataSource.getClass()); } }
- 有了数据源我们就可以使用数据源获取数据库连接对象,这里我们获取一个连接对象并输出作为测试
@SpringBootTest class Springboot04DataApplicationTests { @Autowired DataSource dataSource; @Test void contextLoads() throws SQLException { Connection conn = dataSource.getConnection(); System.out.println(conn); conn.close(); } }
- 因为我们使用的springBoot是最新的,最新的导致它是由的mysql配置也是最新的,在最新的MySQL8.xxx里面使用数据库必须配置时区
- 解决:在配置文件中加入时区配置
url: jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=utf- 8&serverTimezone=UTC #时区随便配一个就可以使用,但是一般配自己所在国家的时区,所以国内正常应该使用 #serverTimezone=Asia/Shanghai
- 既然有了自动配置并且可以在application中进行修改配置,我们就可以找到XXXProperties,再往上找就可以找到xxxAutoConfiguration,通过查找我们确实找到了DataSourceProperties和DataSourceAutoConfiguration
- 注意:在springBoot中有大量的XXXtemplate,这些就是springBoot自动为我们装配在spring容器中的bean,我们可以直接拿过来使用,比如jdbctemplate,我们可以去源码中验证这一说法
- 测试JdbcTemplate对象的功能
- 写一个controller来测试
- 测试查询数据
package com.thhh.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.Map; @RestController public class JDBCController { @Autowired JdbcTemplate jdbcTemplate; @RequestMapping("/userlist") public List<Map<String,Object>> queryUserList(){ String sql = "SELECT * FROM user"; List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql); return maps; } }
- 测试插入数据
@RequestMapping("addUser") public String addUser(){ String sql= "INSERT INTO mybatis.user(id,name,pwd) values(10,'test_JdbcTemplate','123')"; jdbcTemplate.update(sql); return "update success!"; }
- 需要注意一点,jdbcTemplate对于数据库的操作也只是分了两种:①数据库查询query ②数据库修改update
- 测试修改数据
@RequestMapping("/updateUser") public String updateUser(){ String sql= "UPDATE mybatis.user SET name='test_updateUser' WHERE id= 10"; jdbcTemplate.update(sql); return "update success!"; }
- 测试删除数据
@RequestMapping("/deleteUser") public String deleteUser(){ String sql= "DELETE FROM mybatis.user where id=10"; jdbcTemplate.update(sql); return "delete success!"; }
- 我们也可以实验一下sql中使用?作为占位符传递参数
@RequestMapping("/updateUser/{id}") public String updateUser(@PathVariable("id") String id){ String sql= "UPDATE mybatis.user SET name=?,pwd=? WHERE id="+id; Object[] o = new Object[2]; o[0] = "zzzzzzz"; o[1] = "aaaaaaaaa"; jdbcTemplate.update(sql,o); return "update success!"; }
- 测试
3.数据源切换
- 本来市面上就有很多开源的数据源可供我们使用,虽然springBoot为我们自动配置了hikari数据源,但是我们也是可以通过application进行更改要使用的数据源的
- 怎么改?看源码,直接去找DataSourceProperties
- 所以我们在application中修改数据源的方法为spring.datasource.type,其实可以直接去配置文件application中通过联想功能找到对应的设置
4.小结
- 从springBoot封装的数据源的使用我们可以发现,使用springBoot封装的数据源的简洁程度已经达到了直接使用mybatis实现数据库操作相似的程度,这也是因为别人为我们封装的操作很好,我们使用起来就很简单
- 所以在不使用mybatis的情况下直接使用springBoot提供的数据源来操 作数据库是很简单的,甚至连service层我们都不需要,直接将所有的操作都写在controller层,但是这样也就污染了controller,它混入了sql操作,逻辑实现;但是好处就是简单,易使用和实现功能
- 使用springBoot的数据源的时候我们可以直接在application中直接更换数据源