4、SpringBoot 整合Druid+Mybatis-plus实现数据持久化
前言
数据持久化就是将内存中的数据模型转为存储模型,以及将存储模型转换为内存中的数据模型的模型。存储模型可以是关系模型、xml、二进制流等。本文实现的是对象模型到关系模型之间的转换。
1、数据连接池
数据库连接是一种关键的有限的昂贵的资源,同时建立过多的数据库链接得不到及时释放则容易导致系统内存溢出至崩溃。数据库连接池是在应用程序启动时建立足够的数据库连接,将这些连接放到一个“池”中,当连接申请超过池中的数量时则在请求队列中等待。连接池技术尽可能地重用了小号内存地资源,大大节省了内存,提高服务器的效率。
JAVA主流的数据库连接有C30P、DBCP、Druid、HikariCP。本文介绍Springboot +Druid的整合,下面是实现步骤
1.1、添加Druid的maven依赖
<!-- druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>
<!--mysql driver -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
<scope>runtime</scope>
</dependency>
1.2、添加配置文件(application.yml)
spring:
datasource:
#MySQL
driver-class-name: com.mysql.cj.jdbc.Driver #数据库连接驱动
url: jdbc:mysql://localhost:3306/kljf-boot?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: renren
password: 123456
type: com.alibaba.druid.pool.DruidDataSource
druid:
web-stat-filter:
enabled: true
url-pattern: "/*"
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.iso"
stat-view-servlet: #设置访问druid监控页的账号和密码,默认没有
login-username: admin
login-password: 123456
url-pattern: "/druid/*"
allow: 127.0.0.1 # 只允许127.0.0.1访问druid的监控页
reset-enable: false
enabled: true
use-global-data-source-stat: true #合并多个DruidDataSource的监控数据
filters: stat,wall,slf4j # 配置扩展插件
connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500 #通过connectProperties属性来打开mergeSql功能;慢SQL记录
1.3 在浏览器方位127.0.0.1/druid/,可看到druid的登录框
2、Mybatis-Plus
2.1、简介
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
2.2、添加依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
2.3、分页的实现
package io.kljf.boot.config.handler;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
/**
* @author katherine
* @version 2020-11-16
**/
@Configuration
public class MyBatisPlusConfig {
@Bean
@Order(0)
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
2.4、CRUD实现
2.4.1、创建数据库表
CREATE TABLE `sys_user` (
`id` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'id',
`username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `username`(`username`) USING BTREE COMMENT '用户名唯一索引'
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
2.4.2、创建实体类
package io.kljf.boot.modules.sys.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.util.Date;
/**
* @author katherine
* @version 2020-11-13
**/
@Data
@TableName("sys_user")
public class UserEntity {
/**
* 用户ID
*/
@TableId(type= IdType.ASSIGN_UUID)
private String id;
/**
* 用户名
*/
private String username;
/**
* 创建时间
*/
private Date createTime;
/**
* 修改时间
*/
private Date updateTime;
}
@TableName 表名注解,详见Mybatis-Plus 官网
@TableId 主键注解 详见Mybatis-Plus 官网
2.4.3、创建Mapper
package io.kljf.boot.modules.sys.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import io.kljf.boot.modules.sys.entity.UserEntity;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserDao extends BaseMapper<UserEntity> {
}
2.4.4、创建Service接口
package io.kljf.boot.modules.sys.services;
import com.baomidou.mybatisplus.extension.service.IService;
import io.kljf.boot.modules.sys.entity.UserEntity;
/**
* @author katherine
* @version 2020-11-13
**/
public interface IUserService extends IService<UserEntity> {
}
2.4.5、实现Service接口
package io.kljf.boot.modules.sys.services.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import io.kljf.boot.modules.sys.dao.UserDao;
import io.kljf.boot.modules.sys.entity.UserEntity;
import io.kljf.boot.modules.sys.services.IUserService;
import org.springframework.stereotype.Service;
/**
* @author katherine
* @version 2020-11-13
**/
@Service
public class UserServiceImpl extends ServiceImpl<UserDao,UserEntity> implements IUserService {
}
2.4.5、写单元测试
package io.kljf.boot;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.kljf.boot.modules.sys.controller.UserControllerTest;
import io.kljf.boot.modules.sys.entity.UserEntity;
import io.kljf.boot.modules.sys.services.IUserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
/**
* @author katherine
* @version 2020-11-13
**/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = KljfApplication.class)
public class TestMyBatisPlus {
private static Logger logger = LoggerFactory.getLogger(TestMyBatisPlus.class);
@Autowired
IUserService userService;
@Test
public void test(){
// 模拟新增一百条数据
for(int i =0;i<100;i++){
UserEntity userEntity = new UserEntity();
userEntity.setUsername("username"+i);
userService.save(userEntity);
}
// 模拟获取全部数据
List<UserEntity> userlist = userService.list();
userlist = userService.list();
logger.info(userlist.toString());
// 模拟获取用户名包含10的数据
userlist = userService.list(new QueryWrapper<UserEntity>().like("username","10"));
logger.info(userlist.toString());
// 根据获取ID修改数据
UserEntity userNew = new UserEntity();
userNew.setId("0075f0dd0d327254424db2bd7c7ffc5e");
userNew.setUsername("小超人");
userService.updateById(userNew);
// 根据ID获取数据
UserEntity userEntity = userService.getById("0075f0dd0d327254424db2bd7c7ffc5e");
logger.info(userEntity.toString());
// 获取分页
IPage<UserEntity> page = new Page<>();
IPage<UserEntity> userIPage = userService.page(page);
logger.info(userIPage.toString());
}
}