Springboot集成Mybatispuls操作mysql数据库-04

MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强而不做改变。它支持所有MyBatis原生的特性,因此引入MyBatis-Plus不会对现有的MyBatis构架产生任何影响。MyBatis-Plus旨在简化开发、提高效率,特别是简化了CRUD(增删改查)操作。

MyBatis常见使用场景

  1. 数据权限控制:在查询数据时,自动添加当前用户可访问的数据范围的WHERE条件。
  2. 多租户支持:在查询数据时,自动添加租户ID的WHERE条件,以区分不同租户的数据。
  3. 动态表名:根据不同的请求参数,动态修改SQL语句中的表名,以实现数据分片或数据隔离等功能。
  4. 加密解密:对数据库中的敏感数据进行加密,查询数据时进行解密。
  5. 缓存优化:通过缓存某些查询结果来提高系统性能,可以将缓存对象作为拦截器的属性来管理。

MyBatis-Plus通过启动加载XML配置时注入单表SQL操作来简化开发工作,提高生产率。总的来说,MyBatis-Plus是一个强大的MyBatis增强工具,为开发者提供了更多的便利和灵活性。

springboot-mybatisplus模块

在此模块中我们会通过springbootTest和Controller两种方式来进行测试。

模块结构说明

在这里插入图片描述

  • 类文件说明

    • SystemLogController.java:controller,它会调用ISystemLogDao接口
    • ISystemLogDao.java:Dao接口
    • SystemLogQuery:ISystemLogDao接口参数
    • SystemLogDaoImpl.java:ISystemLogDao接口实现
    • SystemLogMapper.java:mybatis Mapper接口
    • SystemLogEntity.java:数据库实体类
  • 文件夹

    • resources/mybatis:mybatis配置文件,一般与SystemLogMapper.java一一对应
  • 测试类

    • SystemLogControllerTest:测试 LoadBalanceController.java URI接口功能
    • SystemLogDaoTest:测试 ISystemLogDao.java 接口实现功能

数据库脚本

数据库脚本

需要事先导入到数据库中

CREATE TABLE `jdemo`.`t_sys_record_demo`  (`uuid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,`biz_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '业务ID',`user_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作用户ID',`track_uid` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '链路ID',`code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作代码',`custom_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作2级代码',`status` int NULL DEFAULT NULL COMMENT '记录状态:1可查询,0不可查询',`ctime` datetime NULL DEFAULT NULL,`utime` datetime NULL DEFAULT NULL,`cid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,`cname` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,PRIMARY KEY (`uuid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

java实体类

注意下列@TableName中的值要和数据库表名一致。

@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("t_sys_record_demo")
public class SystemLogEntity extends DBEntity {private String bizId;private String userId;private String trackUid;private String code;private String customCode;private Integer status;@TableField(value = "cid", fill = FieldFill.INSERT, insertStrategy = FieldStrategy.NEVER, updateStrategy = FieldStrategy.NEVER)private String cid;@TableField(value = "cname", fill = FieldFill.INSERT, insertStrategy = FieldStrategy.NEVER, updateStrategy = FieldStrategy.NEVER)private String cname;}

模块配置

pom.xml

这里需要注意mybatisplus分2和3两个版本,3版本对应的springboot3,2对应的是springboot2,这两个mybatisplus版本并不兼容。

    <dependencies><!--数据库相关--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId></dependency><!--工具包--><dependency><groupId>com.korgs</groupId><artifactId>framework-persistence</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies>

framework-persistence是笔者开发的一个基础jar包,在源码中可以找到。

Invalid value type for attribute ‘factoryBeanObjectType’: java.lang.String 这个错误是由于版本不对引起的, 因为mybatis2和3不相互兼容,这主要是jdk版本不同导致的,其它三方插件也有这个问题。

application.properties配置

spring.profiles.active = dev
spring.application.name=springbootMybatisplus
server.port=18086
#debug=truemanagement.endpoints.web.exposure.include = *
management.endpoint.health.show-details=always##mybatis Server
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/jdemo?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=12345678
spring.datasource.druid.initial-size=5
spring.datasource.druid.min-idle=5
spring.datasource.druid.max-active=20
spring.datasource.druid.max-wait=60000
spring.datasource.druid.validation-query=SELECT 1 FROM DUAL
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=5
spring.datasource.druid.test-while-idle=true
spring.datasource.druid.test-on-borrow=false
spring.datasource.druid.test-on-return=false
spring.datasource.druid.time-between-eviction-runs-millis=60000
spring.datasource.druid.min-evictable-idle-time-millis=100000
spring.datasource.druid.filters=stat
#
##mybatis plugs
mybatis-plus.mapper-locations=classpath:/mybatis/*Mapper.xml
mybatis-plus.configuration.map-underscore-to-camel-case=true
mybatis-plus.configuration.default-statement-timeout=20000
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

注意:上面配置中的mybatis-plus.configuration.log-implmybatis-plus.mapper-locations。前者用于日志打印,在发布应用时需要注释掉,后者用来指定Mapper.xml文件存放的classpath地址。

SpringbootApplication启动类

配置@MapperScan注解,比如@MapperScan("com.korgs.dao")表示要查找的mybatis bean类。

@Slf4j
@SpringBootApplication(scanBasePackages = {"com.korgs",  "cn.hutool.extra.spring"})
@Configuration
@EnableConfigurationProperties
@ServletComponentScan
@RestController
@MapperScan("com.korgs.dao")
public class SpringbootMybatisplusApplication {public static void main(String[] args) {SpringApplication.run(SpringbootMybatisplusApplication.class, args);}@GetMapping("/helloworld")public BaseResponse helloWorld(){log.info(LogGenerator.trackLog()+ "msg="+ "I am busy to handle this request.");return BaseResponse.success("hello world");}
}

程序实现

定义ISystemLogDao接口

定义供上层类调用的数据库操作接口
在这里插入图片描述

接口定义
public interface ISystemLogDao extends IService<SystemLogEntity> {List<SystemLogEntity> listByCondition(SystemLogQuery query);IPage<SystemLogEntity> pageSystemLog(IPage<SystemLogEntity> iPage, String bizId, String code);
}
接口实现
@Repository
@Primary
public class SystemLogDaoImpl extends ServiceImpl<SystemLogMapper, SystemLogEntity> implements ISystemLogDao {@Overridepublic List<SystemLogEntity> listByCondition(SystemLogQuery query) {LambdaQueryWrapper<SystemLogEntity> queryWrapper = Wrappers.lambdaQuery();if(StrUtil.isNotEmpty(query.getCode())){queryWrapper.eq(SystemLogEntity::getCode, query.getCode());}if(StrUtil.isNotEmpty(query.getBizId())){queryWrapper.eq(SystemLogEntity::getBizId, query.getBizId());}return list(queryWrapper);}@Overridepublic IPage<SystemLogEntity> pageSystemLog(IPage<SystemLogEntity> iPage, String bizId, String code) {return this.getBaseMapper().pageSystemLog(iPage, bizId, code);}}
接口参数
@Data
public class SystemLogQuery {private String bizId;private String code;
}

定义Mapper实现

一个Mapper实现类对应一个Mapper.xml,即使Mapper.xml为空实现也需要配置。

Mapper接口定义
public interface SystemLogMapper extends BaseMapper<SystemLogEntity> {IPage<SystemLogEntity> pageSystemLog(IPage<SystemLogEntity> iPage,@Param("bizId") String bizId,@Param("code") String code);
}
Mapper接口对应的Mapper.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" >
<mapper namespace="com.korgs.dao.SystemLogMapper"><select id="pageSystemLog" resultType="com.korgs.dao.SystemLogEntity">selectt_sys_record_demo.*fromt_sys_record_demowhere 1=1<if test="bizId != null">and t_sys_record_demo.biz_id = #{bizId}</if><if test="code != null">and upper(t_sys_record_demo.code) LIKE upper(CONCAT('%',#{code},'%'))</if></select>
</mapper>

上述配置文件中:

  • mapper标签:配置为SystemLogMapper.java类的全路径
  • select标签中的id属性:配置为SystemLogMapper.java类中定义的接口名称
    • select标签中的resultType属性:定义为sql语句要返回的实体对象的全路径,此值也与SystemLogMapper.java中相应的接口返回参数相对应。

编写Controller Restful

@Slf4j
@RestController
@RequestMapping("/api/load")
public class SystemLogController {@Autowiredprivate ISystemLogDao iSystemLogDao;@GetMapping("/v1/hello-content")public ListResponse<SystemLogEntity> loadHelloContent(String uuid){log.info("{} uuid ={}", LogGenerator.trackLog(), uuid);List<SystemLogEntity> list = iSystemLogDao.list();log.info("{} uuid={} size={}", LogGenerator.trackLog(), uuid, CollUtil.size(list));return ListResponse.success(list);}
}

使用SpringbootTest测试

测试Dao接口

@SpringBootTest
public class SystemLogDaoTest {private static final Logger logger = LoggerFactory.getLogger(SystemLogDaoTest.class);@Autowiredprivate ISystemLogDao iSystemLogDao;/*注意此处要引用 import org.junit.jupiter.api.Test;*//*全表搜索*/@Testpublic void iSystemLogDao() {List<SystemLogEntity> list = iSystemLogDao.list();logger.info(JSONUtil.toJsonStr(list));}/*增加操作*/@Testpublic void iSystemLogDaoInsert() {SystemLogEntity systemLogEntity = new SystemLogEntity();systemLogEntity.setUuid(UUIDUtil.uuid32());iSystemLogDao.save(systemLogEntity);}/*删除操作*/@Testpublic void iSystemLogDaoDelete() {iSystemLogDao.removeById("3006316502a24b6b8b5eac4d1a8f6e5a");}/*更新操作*/@Testpublic void iSystemLogDaoUpdate() {SystemLogEntity systemLogEntity = new SystemLogEntity();systemLogEntity.setUuid("a4dd3bcf2a134941a4a1fb9119028600");systemLogEntity.setCode("heart");iSystemLogDao.updateById(systemLogEntity);}/*分页查询*/@Testpublic  void iSystemLogDaoPage() {IPage<SystemLogEntity> iPage = new Page<SystemLogEntity>(1, 3);iPage = iSystemLogDao.pageSystemLog(iPage, "001", "lung");List<SystemLogEntity>  logEntityIPage = iPage.getRecords();logger.info(JSONUtil.toJsonStr(logEntityIPage));}}

测试Controller服务

@SpringBootTest
@AutoConfigureMockMvc
public class SystemLogControllerTest {@Autowiredprotected MockMvc mockMvc;private HttpHeaders httpHeaders = new HttpHeaders();private static final ObjectMapper mapper = new ObjectMapper();//    @Beforepublic void setBasicAuth() throws Exception {// 设置basicAuthString basicAuthString = "Basic " + Base64.getEncoder().encodeToString("aaa:bbb".getBytes());httpHeaders.set("Authorization", basicAuthString);}@Testpublic void testController() throws Exception {MvcResult mvcResult = mockMvc.perform(get("/api/load//v1/hello-content").contentType(MediaType.APPLICATION_JSON_VALUE)// 设定basicAuth到请求header中.headers(httpHeaders).param("uuid", "12312312"))// 打印详细的请求以及返回内容.andDo(print())// 判断HttpStatus是200,如果不是表示失败.andExpect(status().isOk())// 返回结果给mvcResult.andReturn();// 获取mvcResult的bodyString resutlStr = mvcResult.getResponse().getContentAsString(Charset.defaultCharset());ListResponse response =  mapper.readValue(resutlStr, ListResponse.class);// 判断结果是否成功assertEquals("0", response.getStatus().toString());}}

源码下载

涉及模块:

  • springboot-mybatisplus:18086

源码下载:

  • 着手开发属于自己的第一个Intellij-platform plugin插件程序(三)配套源码
  • Springboot集成Mybatispuls操作mysql数据库

源码运行方法:

  • SpringCloud专题模块项目功能说明和运行方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/323933.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构-二叉树结尾+排序

一、二叉树结尾 1、如何判断一棵树是完全二叉树。 我们可以使用层序遍历的思路&#xff0c;利用一个队列&#xff0c;去完成层序遍历&#xff0c;但是这里会有些许的不同&#xff0c;我们需要让空也进队列。如果队列里到最后只剩下空那么这棵树就是完全二叉树。具体的实现如下…

【springboot基础】如何搭建一个web项目?

正在学习springboot&#xff0c;还是小白&#xff0c;今天分享一下如何搭建一个简单的springboot的web项目&#xff0c;只要写一个类就能实现最基础的前后端交互&#xff0c;实现web版helloworld &#xff0c;哈哈&#xff0c;虽然十分简陋&#xff0c;但也希望对你理解web运作…

C++STL细节,底层实现,面试题04

文章目录 19. STL19.1. 序列容器19.1.1. vector19.1.1.1. 底层实现和特点19.1.1.2. 常用函数19.1.1.3. emplace_back() vs push_back() 19.1.2. array19.1.2.1. 底层实现和特点19.1.2.2. 常用函数 19.1.3. deque19.1.3.1. 底层实现和特点19.1.3.2. 常用函数 19.1.4 list19.1.4.…

誉天教育近期开班计划

云计算HCIE 晚班 2024/5/13 大数据直通车 周末班 2024/5/25 数通直通车 晚班 2024/5/27 云服务HCIP 周末班 2024/6/1 云计算HCIP 周未班 2024/6/1 RHCA442 晚班 2024/6/17 周末班&#xff1a;周六-周日9:00-17:00晚 班&#xff1a;周一到周五19:00-21:30注&…

搜索的未来:OpenAI 的 GPT 如何彻底改变行业

搜索的未来&#xff1a;OpenAI 的 GPT 如何彻底改变行业 概述 搜索引擎格局正处于一场革命的风口浪尖&#xff0c;而 OpenAI 的 GPT 处于这场变革的最前沿。最近出现了一种被称为“im-good-gpt-2-chatbot”的神秘聊天机器人&#xff0c;以及基于 ChatGPT 的搜索引擎的传言&am…

android zygote进程启动流程

一&#xff0c;启动入口 app_main.cpp int main(int argc, char* const argv[]) {if (!LOG_NDEBUG) {String8 argv_String;for (int i 0; i < argc; i) {argv_String.append("\"");argv_String.append(argv[i]);argv_String.append("\" ")…

Python语言基础学习(上)

目录 一、常量和表达式 二、变量和类型 2.1 认识变量 2.2 定义变量 2.3 变量类型 1、整数 int 2、浮点数&#xff08;小数&#xff09;float 3、字符串 str 4、布尔类型 2.4 类型转换 三、注释 3.1 单行注释 3.2 文档注释&#xff08;或者多行注释&#xff09; …

[附源码]石器时代_恐龙宝贝内购版_三网H5手游_带GM工具

石器时代之恐龙宝贝内购版_三网H5经典怀旧Q萌全网通手游_Linux服务端源码_视频架设教程_GM多功能授权后台_CDK授权后台 本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff0…

SpringBoot工作原理

优点&#xff1a;自动装配&#xff0c;起步依赖 起步依赖 原理就是maven的依赖传递 【A依赖B、B依赖C….&#xff0c;则我导入依赖A的时候&#xff0c;B&#xff0c;C都会被maven加载进来】 重点看看自动装配 概念&#xff1a; 当Spring容器启动后&#xff0c;一些配置类、…

攻略:ChatGPT3.5~4.0(中文版)国内无限制免费版(附网址)【2024年5月最新更新】

一、什么是ChatGPT&#xff1f; 1、ChatGPT的全名是Chat Generative Pre-trained Transformer&#xff0c;其中"chat"表示聊天。"GPT"则是由三部分组成&#xff1a;生成式&#xff08;generative&#xff09;意味着具有创造力&#xff1b;预训练&#xff0…

LeetCode 难题解析 —— 正则表达式匹配 (动态规划)

10. 正则表达式匹配 思路解析 这道题虽然看起来不难理解&#xff0c;但却存在多种可能&#xff0c;当然这种可能的数量是有限的&#xff0c;且其规律对于每一次判别都使用&#xff0c;所以自然而然就想到用 动态规划 的方法啦 接下来逐步分析可能的情况&#xff1a; &#x…

3---Linux编译器gcc/g++

一、程序的翻译过程&#xff1a;ESc->iso 1.1预处理&#xff1a;c->c 主要功能&#xff1a;宏替换、头文件的展开、条件编译、去注释&#xff1b;目的是让代码变得纯粹。条件编译&#xff0c;可以实现对代码的裁剪。比如对于不同用户&#xff0c;设置不同的宏常量&…

详解分布式锁

知识点&#xff1a; 单体锁存在的问题&#xff1a; 单体锁&#xff0c;即单体应用中的锁&#xff0c;通过加单体锁&#xff08;synchronized或RentranLock&#xff09;可以保证单个实例并发安全 单体锁是JVM层面的锁&#xff0c;只能保证单个实例上的并发访问安全 如果将单…

java JMH 学习

JMH 是什么&#xff1f; JMH&#xff08;Java Microbenchmark Harness&#xff09;是一款专用于代码微基准测试的工具集&#xff0c;其主要聚焦于方法层面的基准测试&#xff0c;精度可达纳秒级别。此工具由 Oracle 内部负责实现 JIT 的杰出人士编写&#xff0c;他们对 JIT 及…

鸿蒙内核源码分析(任务切换篇) | 看汇编如何切换任务

在鸿蒙的内核线程就是任务&#xff0c;系列篇中说的任务和线程当一个东西去理解. 一般二种场景下需要切换任务上下文: 在线程环境下&#xff0c;从当前线程切换到目标线程&#xff0c;这种方式也称为软切换&#xff0c;能由软件控制的自主式切换.哪些情况下会出现软切换呢? 运…

【AutoGPT】踩坑帖(follow李鱼皮)

本文写于2024年5月7日 参考视频&#xff1a;AutoGPT傻瓜式使用教程真实体验&#xff01; 对应文章&#xff1a;炸裂的AutoGPT&#xff0c;帮我做了个网站&#xff01; 平台&#xff1a;GitPod 云托管服务 原仓库已经改动很大&#xff0c;应使用的Repo为&#xff1a;Auto-GPT-ZH…

应用层协议之 DNS 协议

DNS 就是一个域名解析系统。域名就是网址&#xff0c;类似于 www.baidu.com。网络上的服务器想要访问它&#xff0c;就得需要它对应的 IP 地址&#xff0c;同时&#xff0c;每个域名对对应着一个 / N个 IP 地址&#xff08;即对应多台服务器&#xff09;。 因此&#xff0c;为了…

如何编译不同目录下的两个文件

1.直接编译 2.打包成动静态库进行链接

【bug记录】清除僵尸进程,释放GPU显存

目录 1. 为什么会出现这种情况&#xff1f;2. 解决方案方法一&#xff1a;使用 fuser 命令方法二&#xff1a; 3. 小贴士 在进行深度学习或其他需要GPU支持的任务时&#xff0c;我们有时会发现虽然没有可见的进程在执行&#xff0c;但GPU资源却意外地被占用。这种情况往往会阻碍…

如何确保UDP文件传输工具有最低稳定的传输速度?

在当前日新月异的数字时代背景下&#xff0c;文件传输工具已经成为我们日常生活与工作中不可或缺的一部分&#xff0c;尤其针对那些频繁涉及即时数据交互与多媒体流通的场景。 UDP协议&#xff0c;以其突出的高速传输与低延迟特性&#xff0c;脱颖而出成为众多用户的首选。不过…