无论是关系型数据库还是非关系型数据库,Spring Boot 底层都是采用 Spring Data 的方式统一进行处理。
一、整合 JDBC 使用
1、新建 SpringBoot 项目,还要导入 Web 依赖
2、新建yaml配置文件: application.yml
spring:
datasource:
username: 'root'
password: ''
url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
3、使用 SpringBoot 单元测试进行测试:
@SpringBootTest
class Springboot05DataApplicationTests {
@Autowired
DataSource dataSource;
@Test
void contextLoads() throws SQLException {
// 查看一下默认的数据源
System.out.println(dataSource.getClass());
// 获得数据库连接
Connection connection = dataSource.getConnection();
System.out.println(connection);
// xxxTemplate : SpringBoot 已经配置好的 Bean,拿来即用
// 关闭数据库连接
connection.close();
}
}
新建一个 controller 进行测试:
@RestController
public class JDBCController {
@Autowired
JdbcTemplate jdbcTemplate;
// 查询数据库的所有信息
// 没有实体类,使用 Map 获取信息
@GetMapping("/userList")
public List<Map<String, Object>> userList(){
String sql = "select * from user";
List<Map<String, Object>> list_maps = jdbcTemplate.queryForList(sql);
return list_maps;
}
// 可以实现增删改查
@GetMapping("/updateUser/{id}") // 访问地址:http://localhost:8080/updateUser/id
public String updateUser(@PathVariable("id")Integer id){
String sql = "update mybatis.user set name=?, pwd=? where id=" + id;
// 封装
Object[] objects = new Object[2];
objects[0] = "面包+";
objects[1] = "aaaaa";
jdbcTemplate.update(sql, objects);
return "Update-Ok";
}
}
二、整合 Druid 数据源
1、简介
Druid 是一个JDBC组件,它包括三部分:
- DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系。
- DruidDataSource 高效可管理的数据库连接池。
- SQLParser
Druid可以做什么?
-
可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。
-
数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。
-
SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。
2、使用
导入依赖
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.4</version>
</dependency>
配置文件配置数据源
spring:
datasource:
...
type: com.alibaba.druid.pool.DruidDataSource
使用 一、 中的单元测试可以查看配置后使用的数据源。
Druid 的一些配置
spring:
datasource:
...
# SpringBoot 默认是不注入这些的,需要自己绑定
# druid 数据源专有配置
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
# 配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入
# 如果允许报错,java.lang.ClassNotFoundException: org.apache.Log4j.Properity
# 则导入log4j 依赖就行
filters: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
一样能使用 一、中的 controller 进行测试。
新建 config 包下新建 DruidConfig 配置类。@Bean : 注册到容器中
@Configuration
public class DruidConfig {
@ConfigurationProperties(prefix = "spring.datasource") // 与 application.yml 绑定
@Bean
public DataSource druidDataSource(){
return new DruidDataSource();
}
// 后台监控 (访问 /druid/* 进入后台监控界面)
// 因为 SpringBoot 内置了 Servlet 容器,所以没有 web.xml. 替代方法:ServletRegistrationBean
// 相当于 web.xml 配置这个 Servlet: ServletRegistrationBean
@Bean
public ServletRegistrationBean statViewServlet(){
ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
// 后台需要有人登陆,就是账号和密码
HashMap<String, String> initParameters = new HashMap<>();
// 增加配置
initParameters.put("loginUsername", "admin"); // 登陆的 key 是固定的 loginUsername, loginPassword
initParameters.put("loginPassword","123456");
// 允许谁访问
initParameters.put("allow", ""); // "localhost" ==> 允许本机访问
// 禁止谁访问 initParameters.put("mianbao", "192.198.10.10");
bean.setInitParameters(initParameters); // 设置初始化参数
return bean;
}
// filter
@Bean
public FilterRegistrationBean webStatFilter(){
FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
bean.setFilter(new WebStatFilter());
// 可以过滤哪些请求
HashMap<String, String> initParameters = new HashMap<>();
// 这些东西不用统计
initParameters.put("exclusions", "*.js, *.css, /druid/*"); // 点到 WebStatFilter 里,查看可配置选项
bean.setInitParameters(initParameters);
return bean;
}
}
三、整合 MyBatis
1、新建 SpringBoot 项目
导入整合包:mybatis-spring-boot-starter (非官方) 。 官方的是: spring-boot-starter-xxxx。
<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
使用 SpringBoot 单元测试进行测试 (一、的3、)
2、使用测试
2.1 新建 pojo包,新建与数据库映射的实体类 User。
public class User {
private int id;
private String name;
private String pwd;
// getter and setter
}
2.2 新建 mapper包,新建 UserMapper 接口。
在 UserMapper 接口上加上注解 @Mapper
,这个注解表示了这是一个 Mybatis 的 mapper 类。
@Mapper // 这个注解表示了这是一个 Mybatis 的 mapper 类:
@Repository // Dao 层组件的注解
public interface UserMapper {
List<User> queryUserList();
User queryUserById(int id);
int addUser(User user);
int updateUser(User user);
int deleteUser(int id);
}
也可以在启动类加上注解 @MapperScan("com.example.mapper")
。
2.3 在 resources 下新建 mybatis/mapper/UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace 定义一个对应的 Dao/Mapper 接口 -->
<mapper namespace="com.example.mapper.UserMapper">
<select id="queryUserList" resultType="User">
select * from mybatis.user
</select>
<select id="queryUserById" resultType="User">
select * from mybatis.user where id = #{id}
</select>
<insert id="addUser" parameterType="User">
insert into mybatis.user(id, name, pwd) VALUES(#{id}, #{name}, #{pwd})
</insert>
<update id="updateUser" parameterType="User">
update mybatis.user set name = #{name}, pwd = #{pwd} where id = #{id}
</update>
<delete id="deleteUser" parameterType="int">
delete from mybatis.user where id = #{id}
</delete>
</mapper>
2.4 配置文件整合MyBatis
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
# 整合 MyBatis
# Mybatis 的别名配置
mybatis.type-aliases-package=com.example.pojo
# Mapper 的地址配置 classpath: 指的是 resource
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
2.5 编写 controller 进行测试
@RestController
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping("/queryUserList")
public List<User> queryUserList(){
List<User> userList = userMapper.queryUserList();
for (User user : userList) {
System.out.println(user.toString());
}
return userList;
}
}