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
- 引入如下starter
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
- 配置“映射文件的路径”和一些全局配置
# 配置Mybatis全局配置文件,一般不用,因为可以通过mybatis.configuration来配置
#mybatis.config-location=classpath:mybatis-config.xml
# 配置映射文件
mybatis.mapper-locations=classpath:mapper/*.xml
# 自动驼峰转换
mybatis.configuration.map-underscore-to-camel-case=true
- 写实体类和DAO接口,其中DAO接口需要使用
@Mapper
注解标注,例如
@Mapper
public interface MyStudentDAO {
MyStudent getBySno(String sno);
}
如果不想每个DAO都写@Mapper
注解,则可以在Spring配置类上加上@MapperScan("com.mysiteforme.admin.dao")
,这样在指定的包下所有的类都会被视为加上了@Mapper
- 在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
- 引入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>
- 对于实体类,和之前一样,但如果表名和类名不一致(除了大小写不一样外),则需要使用
@TableName("tableName")
来指定真正的表名。如果主键不叫id,则需要在主键字段上加上@TableId("idName")
来指定真正的主键名,否则无法使用Mybatis-plus默认的通过主键查找。在开发中建议无论什么情况都加上。 - 对于DAO接口,只需要继承
BaseMapper<Entity>
,就会有对实体类T基本的增删改查功能
@Mapper
public interface MyStudentDAO extends BaseMapper<MyStudent> {}
- 对于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/