springboot之数据访问


jdbc

若想使用最基础的jdbc来操作数据库,可以引入spring官方的starter,如下

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

他会自动帮我们引入hikari连接池(hikari是日语“光”)、jdbc和事务。但没有给我们引入驱动,因为官方并不知道我们使用什么数据库,所以我们需要自己引入,例如MySQL的驱动依赖如下

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.18</version>
</dependency>

引入完成后就需要配置数据库连接了,如下:

# 数据库连接
spring.datasource.url=jdbc:mysql://localhost:3306/test
# 数据库用户名
spring.datasource.username=root
# 数据库密码
spring.datasource.password=passwd
# 数据库驱动
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 数据库连接池,默认就是Hikari
spring.datasource.type=com.zaxxer.hikari.HikariDataSource

spring为我们提供了一个JdbcTemplate组件,我们可以通过他来CRUD,例如

@Autowired
JdbcTemplate jdbcTemplate;

@Test
public void testJdbc() {
    Long count = jdbcTemplate.queryForObject("select count(*) from student;", Long.class);
    log.info("记录总数:{}", count);
}

整合Druid

Druid(德鲁伊)是由阿里开发的数据源,他除了提供数据库连接池外,还提供了整套解决方案,比如监控,安全等等。

整合Druid只需要引入一个starter即可,引入后就会使用Druid作为数据源,例如

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid-spring-boot-starter</artifactId>
  <version>1.1.17</version>
</dependency>

关于配置Druid的监控示例如下

# Druid开启监控页,默认false
spring.datasource.druid.stat-view-servlet.enabled=true
# 监控页路径,默认/druid/*
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
# 监控页登录用户
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=1
# 允许访问的ip
spring.datasource.druid.stat-view-servlet.allow=127.0.0.1
# 禁止重置监控数据,默认true
spring.datasource.druid.stat-view-servlet.reset-enable=false

# 开启监控功能,默认false
spring.datasource.druid.web-stat-filter.enabled=true
# 监控的路径
spring.datasource.druid.web-stat-filter.url-pattern=/*
# 监控排除的路径
spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*

# 将监控加入到过滤器中
spring.datasource.druid.filter.stat.enabled=true
# 将防火墙加入过滤器中
spring.datasource.druid.filter.wall.enabled=true
# 多慢属于慢查询,单位ms
spring.datasource.druid.filter.stat.slow-sql-millis=1000
# 记录慢查询日志
spring.datasource.druid.filter.stat.log-slow-sql=true

详细的配置项可以参考https://github.com/alibaba/druid/wiki/常见问题


整合Mybatis

  1. 引入如下starter
<dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
  <version>2.1.2</version>
</dependency>
  1. 配置“映射文件的路径”和一些全局配置
# 配置Mybatis全局配置文件,一般不用,因为可以通过mybatis.configuration来配置
#mybatis.config-location=classpath:mybatis-config.xml
# 配置映射文件
mybatis.mapper-locations=classpath:mapper/*.xml
# 自动驼峰转换
mybatis.configuration.map-underscore-to-camel-case=true
  1. 写实体类和DAO接口,其中DAO接口需要使用@Mapper注解标注,例如
@Mapper
public interface MyStudentDAO {
    MyStudent getBySno(String sno);
}

如果不想每个DAO都写@Mapper注解,则可以在Spring配置类上加上@MapperScan("com.mysiteforme.admin.dao"),这样在指定的包下所有的类都会被视为加上了@Mapper

  1. 在mapper.xml中写对应的SQL,例如
<?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">
<mapper namespace="com.example.demo6.MyStudentDAO">
  <select id="getBySno" resultType="com.example.demo6.MyStudent">
    select *
    from student
    where sno = #{sno}
  </select>
</mapper>

tip:对于insert语句,如果需要在插入后返回自增id,则可以在insert标签中配置,例如

<insert id="xxx" useGeneratedKeys="true" keyProperty="id"></insert>

Mybatis官网:https://mybatis.net.cn/


整合Mybatis-plus

  1. 引入starter,Mybatis-plus的starter会自动帮我们引入jdbc和mybatis的相关依赖,同时也会自动帮我们设定好mapper.xml的路径,默认路径为:classpath*:/mapper/**/*.xml
<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-plus-boot-starter</artifactId>
  <version>3.4.3.4</version>
</dependency>
  1. 对于实体类,和之前一样,但如果表名和类名不一致(除了大小写不一样外),则需要使用@TableName("tableName")来指定真正的表名。如果主键不叫id,则需要在主键字段上加上@TableId("idName")来指定真正的主键名,否则无法使用Mybatis-plus默认的通过主键查找。在开发中建议无论什么情况都加上。
  2. 对于DAO接口,只需要继承BaseMapper<Entity>,就会有对实体类T基本的增删改查功能
@Mapper
public interface MyStudentDAO extends BaseMapper<MyStudent> {}
  1. 对于Service接口,需要继承IService<Entity>。在Service接口的实现类,需要继承ServiceImpl<M extends BaseMapper<Entity>, Entity>,第一个泛型是DAO,第二个泛型是实体类
public interface MyService extends IService<MyStudent> { }
@Service
public class MyServiceImpl extends ServiceImpl<MyStudentDAO, MyStudent> implements MyService {}

tip:对于实体类中有,但表中没有的字段,可以使用@TableField(exist = false)来表示,但不推荐,因为实体类的就是用来表示表数据的,应该和表字段一一对应。

mybatis-plus官网:https://mp.baomidou.com/guide/