当前位置:   article > 正文

springboot+mybatis-plus+redis整合_spring boot整合mybatis-plus,redis

spring boot整合mybatis-plus,redis

1、创建springboot项目

2、在pom.xml内添加依赖

  1. <properties>
  2. <mybatis-plus.version>3.1.0</mybatis-plus.version>
  3. <redisson.version>3.10.6</redisson.version>
  4. </properties>
  1. <!-- 使用redisson集成分布式锁等 -->
  2. <dependency>
  3. <groupId>org.redisson</groupId>
  4. <artifactId>redisson-spring-boot-starter</artifactId>
  5. <version>${redisson.version}</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>com.baomidou</groupId>
  9. <artifactId>mybatis-plus-boot-starter</artifactId>
  10. <version>${mybatis-plus.version}</version>
  11. </dependency>

3、数据库建表

如:

  1. CREATE TABLE `tz_area` (
  2. `area_id` bigint(20) NOT NULL AUTO_INCREMENT,
  3. `area_name` varchar(50) DEFAULT NULL,
  4. `parent_id` bigint(20) DEFAULT NULL,
  5. `level` int(1) DEFAULT NULL,
  6. PRIMARY KEY (`area_id`),
  7. KEY `parent_id` (`parent_id`) COMMENT '上级id'
  8. ) ENGINE=InnoDB AUTO_INCREMENT=659006000001 DEFAULT CHARSET=utf8;

4、在model内创建好实体类

  1. import java.io.Serializable;
  2. import java.util.List;
  3. import com.baomidou.mybatisplus.annotation.*;
  4. import io.swagger.annotations.ApiModelProperty;
  5. import lombok.Data;
  6. @Data
  7. @TableName("tz_area")
  8. public class Area implements Serializable {
  9. private static final long serialVersionUID = -6013320537436191451L;
  10. @TableId
  11. @ApiModelProperty(value = "地区id",required=true)
  12. private Long areaId;
  13. @ApiModelProperty(value = "地区名称",required=true)
  14. private String areaName;
  15. @ApiModelProperty(value = "地区上级id",required=true)
  16. private Long parentId;
  17. @ApiModelProperty(value = "地区层级",required=true)
  18. private Integer level;
  19. @TableField(exist=false)
  20. private List<Area> areas;
  21. }

5、创建dao层的接口方法

  1. import com.shop.bean.model.Area;
  2. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  3. import com.shop.common.util.PageAdapter;
  4. import org.apache.ibatis.annotations.Param;
  5. import java.util.List;
  6. public interface AreaMapper extends BaseMapper<Area> {
  7. }

对应dao层的方法,在mapper.xml配置sql语句

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.shop.dao.AreaMapper">
  4. <resultMap id="BaseResultMap" type="com.yami.shop.bean.model.Area">
  5. <!--
  6. WARNING - @mbg.generated
  7. -->
  8. <id column="area_id" jdbcType="BIGINT" property="areaId"/>
  9. <result column="area_name" jdbcType="VARCHAR" property="areaName"/>
  10. <result column="parent_id" jdbcType="BIGINT" property="parentId"/>
  11. <result column="level" jdbcType="INTEGER" property="level"/>
  12. </resultMap>
  13. </mapper>

6、配置application.yml配置文件

  1. spring:
  2. # 环境 dev|test|prod quart定时任务
  3. profiles:
  4. active: dev,quartz
  5. #文件上传设置
  6. servlet:
  7. multipart:
  8. max-file-size: 100MB
  9. max-request-size: 100MB
  10. enabled: true
  11. jackson:
  12. date-format: yyyy-MM-dd HH:mm:ss
  13. time-zone: GMT+8
  14. # mybaits-plus配置
  15. mybatis-plus:
  16. # MyBatis Mapper所对应的XML文件位置
  17. mapper-locations: classpath*:/mapper/*Mapper.xml
  18. global-config:
  19. # 关闭MP3.0自带的banner
  20. banner: false
  21. db-config:
  22. # 主键类型 0:数据库ID自增 1.未定义 2.用户输入 3 id_worker 4.uuid 5.id_worker字符串表示
  23. id-type: AUTO
  24. #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
  25. field-strategy: NOT_NULL
  26. # 默认数据库表下划线命名
  27. table-underline: true

7、在service层中写具体的业务

  1. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  2. import com.baomidou.mybatisplus.extension.service.IService;
  3. import com.shop.bean.model.Area;
  4. import java.util.List;
  5. import java.util.Map;
  6. public interface AreaService extends IService<Area> {
  7. /**
  8. * 通过pid 查找地址接口
  9. *
  10. * @param pid 父id
  11. * @return
  12. */
  13. List<Area> listByPid(Long pid);
  14. /**
  15. * 通过pid 清除地址缓存
  16. *
  17. * @param pid
  18. */
  19. void removeAreaCacheByParentId(Long pid);
  20. }
  1. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  2. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  3. import com.shop.bean.model.Area;
  4. import com.shop.dao.AreaMapper;
  5. import com.shop.service.AreaService;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.cache.annotation.CacheEvict;
  8. import org.springframework.cache.annotation.Cacheable;
  9. import org.springframework.stereotype.Service;
  10. import java.util.ArrayList;
  11. import java.util.HashMap;
  12. import java.util.List;
  13. import java.util.Map;
  14. import java.util.stream.Collectors;
  15. @Service
  16. public class AreaServiceImpl extends ServiceImpl<AreaMapper, Area> implements AreaService {
  17. @Autowired
  18. private AreaMapper areaMapper;
  19. @Override
  20. @Cacheable(cacheNames = "area", key = "#pid")
  21. public List<Area> listByPid(Long pid) {
  22. return areaMapper.selectList(new LambdaQueryWrapper<Area>().eq(Area::getParentId, pid));
  23. }
  24. @Override
  25. @CacheEvict(cacheNames = "area", key = "#pid")
  26. public void removeAreaCacheByParentId(Long pid) {
  27. }
  28. }

8、编写controller层的接口方法

  1. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  2. import com.baomidou.mybatisplus.core.metadata.IPage;
  3. import com.shop.common.util.PageParam;
  4. import com.shop.bean.model.Area;
  5. import com.shop.service.AreaService;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.http.ResponseEntity;
  8. import org.springframework.security.access.prepost.PreAuthorize;
  9. import org.springframework.web.bind.annotation.*;
  10. import javax.validation.Valid;
  11. import java.util.List;
  12. import java.util.Map;
  13. /**
  14. * @author lgh on 2018/10/26.
  15. */
  16. @RestController
  17. @RequestMapping("/admin/area")
  18. public class AreaController {
  19. @Autowired
  20. private AreaService areaService;
  21. /**
  22. * 分页获取
  23. */
  24. @GetMapping("/page")
  25. @PreAuthorize("@pms.hasPermission('admin:area:page')")
  26. public ResponseEntity<IPage<Area>> page(Area area,PageParam<Area> page) {
  27. IPage<Area> sysUserPage = areaService.page(page, new LambdaQueryWrapper<Area>());
  28. return ResponseEntity.ok(sysUserPage);
  29. }
  30. /**
  31. * 获取省市
  32. */
  33. @GetMapping("/list")
  34. @PreAuthorize("@pms.hasPermission('admin:area:list')")
  35. public ResponseEntity<List<Area>> list(Area area) {
  36. List<Area> areas = areaService.list(new LambdaQueryWrapper<Area>()
  37. .like(area.getAreaName() != null, Area::getAreaName, area.getAreaName()));
  38. return ResponseEntity.ok(areas);
  39. }
  40. /**
  41. * 通过父级id获取区域列表
  42. */
  43. @GetMapping("/listByPid")
  44. public ResponseEntity<List<Area>> listByPid(Long pid) {
  45. List<Area> list = areaService.listByPid(pid);
  46. return ResponseEntity.ok(list);
  47. }
  48. /**
  49. * 获取信息
  50. */
  51. @GetMapping("/info/{id}")
  52. @PreAuthorize("@pms.hasPermission('admin:area:info')")
  53. public ResponseEntity<Area> info(@PathVariable("id") Long id) {
  54. Area area = areaService.getById(id);
  55. return ResponseEntity.ok(area);
  56. }
  57. /**
  58. * 保存
  59. */
  60. @PostMapping
  61. @PreAuthorize("@pms.hasPermission('admin:area:save')")
  62. public ResponseEntity<Void> save(@Valid @RequestBody Area area) {
  63. if (area.getParentId() != null) {
  64. Area parentArea = areaService.getById(area.getParentId());
  65. area.setLevel(parentArea.getLevel() + 1);
  66. areaService.removeAreaCacheByParentId(area.getParentId());
  67. }
  68. areaService.save(area);
  69. return ResponseEntity.ok().build();
  70. }
  71. /**
  72. * 修改
  73. */
  74. @PutMapping
  75. @PreAuthorize("@pms.hasPermission('admin:area:update')")
  76. public ResponseEntity<Void> update(@Valid @RequestBody Area area) {
  77. areaService.updateById(area);
  78. areaService.removeAreaCacheByParentId(area.getParentId());
  79. return ResponseEntity.ok().build();
  80. }
  81. /**
  82. * 删除
  83. */
  84. @DeleteMapping("/{id}")
  85. @PreAuthorize("@pms.hasPermission('admin:area:delete')")
  86. public ResponseEntity<Void> delete(@PathVariable Long id) {
  87. Area area = areaService.getById(id);
  88. areaService.removeById(id);
  89. areaService.removeAreaCacheByParentId(area.getParentId());
  90. return ResponseEntity.ok().build();
  91. }
  92. }

9、运行启动类

10、整合上Redis缓存

配置redission.yml

  1. # 单节点设置
  2. singleServerConfig:
  3. address: redis://127.0.0.1:6379
  4. database: 0
  5. password: null
  6. idleConnectionTimeout: 10000
  7. pingTimeout: 1000
  8. connectTimeout: 10000
  9. timeout: 3000
  10. retryAttempts: 3
  11. retryInterval: 1500
  12. reconnectionTimeout: 3000
  13. failedAttempts: 3
  14. clientName: null
  15. # 发布和订阅连接的最小空闲连接数 默认1
  16. subscriptionConnectionMinimumIdleSize: 1
  17. # 发布和订阅连接池大小 默认50
  18. subscriptionConnectionPoolSize: 10
  19. # 单个连接最大订阅数量 默认5
  20. subscriptionsPerConnection: 5
  21. # 最小空闲连接数 默认32,现在暂时不需要那么多的线程
  22. connectionMinimumIdleSize: 4
  23. # connectionPoolSize 默认64,现在暂时不需要那么多的线程
  24. connectionPoolSize: 20
  25. # 这个线程池数量被所有RTopic对象监听器,RRemoteService调用者和RExecutorService任务共同共享。
  26. threads: 0
  27. # 这个线程池数量是在一个Redisson实例内,被其创建的所有分布式数据类型和服务,以及底层客户端所一同共享的线程池里保存的线程数量。
  28. nettyThreads: 0
  29. codec:
  30. class: com.yami.shop.common.serializer.redisson.FstCodec
  31. transportMode: NIO

编写RedisUtil工具类

  1. import java.util.List;
  2. import java.util.Map;
  3. import java.util.Set;
  4. import java.util.concurrent.TimeUnit;
  5. import org.springframework.data.redis.core.RedisTemplate;
  6. import org.springframework.util.CollectionUtils;
  7. public class RedisUtil {
  8. private static RedisTemplate<String,Object> redisTemplate = SpringContextUtils.getBean("redisTemplate",RedisTemplate.class);
  9. //=============================common============================
  10. /**
  11. * 指定缓存失效时间
  12. * @param key 键
  13. * @param time 时间(秒)
  14. * @return
  15. */
  16. public static boolean expire(String key,long time){
  17. try {
  18. if(time>0){
  19. redisTemplate.expire(key, time, TimeUnit.SECONDS);
  20. }
  21. return true;
  22. } catch (Exception e) {
  23. e.printStackTrace();
  24. return false;
  25. }
  26. }
  27. /**
  28. * 根据key 获取过期时间
  29. * @param key 键 不能为null
  30. * @return 时间(秒) 返回0代表为永久有效 失效时间为负数,说明该主键未设置失效时间(失效时间默认为-1)
  31. */
  32. public static long getExpire(String key){
  33. return redisTemplate.getExpire(key,TimeUnit.SECONDS);
  34. }
  35. /**
  36. * 判断key是否存在
  37. * @param key 键
  38. * @return true 存在 false 不存在
  39. */
  40. public static boolean hasKey(String key){
  41. try {
  42. return redisTemplate.hasKey(key);
  43. } catch (Exception e) {
  44. e.printStackTrace();
  45. return false;
  46. }
  47. }
  48. /**
  49. * 删除缓存
  50. * @param key 可以传一个值 或多个
  51. */
  52. @SuppressWarnings("unchecked")
  53. public static void del(String ... key){
  54. if(key!=null&&key.length>0){
  55. if(key.length==1){
  56. redisTemplate.delete(key[0]);
  57. }else{
  58. redisTemplate.delete(CollectionUtils.arrayToList(key));
  59. }
  60. }
  61. }
  62. //============================String=============================
  63. /**
  64. * 普通缓存获取
  65. * @param key 键
  66. * @return
  67. */
  68. @SuppressWarnings("unchecked")
  69. public static <T> T get(String key){
  70. return key==null?null:(T)redisTemplate.opsForValue().get(key);
  71. }
  72. /**
  73. * 普通缓存放入
  74. * @param key 键
  75. * @param value 值
  76. * @return true成功 false失败
  77. */
  78. public static boolean set(String key,Object value) {
  79. try {
  80. redisTemplate.opsForValue().set(key, value);
  81. return true;
  82. } catch (Exception e) {
  83. e.printStackTrace();
  84. return false;
  85. }
  86. }
  87. /**
  88. * 普通缓存放入并设置时间
  89. * @param key 键
  90. * @param value 值
  91. * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
  92. * @return true成功 false 失败
  93. */
  94. public static boolean set(String key,Object value,long time){
  95. try {
  96. if(time>0){
  97. redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
  98. }else{
  99. set(key, value);
  100. }
  101. return true;
  102. } catch (Exception e) {
  103. e.printStackTrace();
  104. return false;
  105. }
  106. }
  107. /**
  108. * 递增 此时value值必须为int类型 否则报错
  109. * @param key 键
  110. * @param delta 要增加几(大于0)
  111. * @return
  112. */
  113. public static long incr(String key, long delta){
  114. if(delta<0){
  115. throw new RuntimeException("递增因子必须大于0");
  116. }
  117. return redisTemplate.opsForValue().increment(key, delta);
  118. }
  119. /**
  120. * 递减
  121. * @param key 键
  122. * @param delta 要减少几(小于0)
  123. * @return
  124. */
  125. public static long decr(String key, long delta){
  126. if(delta<0){
  127. throw new RuntimeException("递减因子必须大于0");
  128. }
  129. return redisTemplate.opsForValue().increment(key, -delta);
  130. }
  131. }

在需要缓存的地方调用该工具类即可,如controller层

  1. @GetMapping("/captcha.jpg")
  2. public void login(HttpServletResponse response,String uuid) {
  3. //定义图形验证码的长、宽、验证码字符数、干扰元素个数 300s后过期
  4. SimpleCaptcha simpleCaptcha = new SimpleCaptcha(200, 50, 4, 20);
  5. try {
  6. simpleCaptcha.write(response.getOutputStream());
  7. RedisUtil.set(SecurityConstants.SPRING_SECURITY_RESTFUL_IMAGE_CODE+uuid, simpleCaptcha.getCode(), 300);
  8. } catch (IOException e) {
  9. e.printStackTrace();
  10. }
  11. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/715780
推荐阅读
相关标签
  

闽ICP备14008679号