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.mzph.cn/news/835016.shtml

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

相关文章

【机器学习与实现】线性回归分析

目录 一、相关和回归的概念&#xff08;一&#xff09;变量间的关系&#xff08;二&#xff09;Pearson&#xff08;皮尔逊&#xff09;相关系数 二、线性回归的概念和方程&#xff08;一&#xff09;回归分析概述&#xff08;二&#xff09;线性回归方程 三、线性回归模型的损…

3D Gaussian Splatting for Real-Time Radiance Field Rendering 论文阅读

如此热门的项目&#xff0c;网络上有很多大牛分析了这篇文章的做法&#xff0c;在这里简单记录一下个人粗浅的理解。 关于各种数学表达式的推导&#xff0c;论文和参考资料中都提供了较为详细的解读&#xff0c;本人能力有限&#xff0c;这一部分理解不够深刻&#xff0c;先不做…

【CSDN搜材料的小技巧】怎么快速查到高质量最新的内容

问题描述: 我最近搜CSDN已经搜累了&#xff0c;好多东西明显是有问题的&#xff0c;还有一堆人复制粘贴&#xff0c;从海量文章中提取出最新且高质量文章成了当务之急&#xff01; 解决方案: 我本来想写个爬虫按照文章的收藏或者点赞排序的&#xff0c;无意中看到了这篇文章…

多线程三种实现

多线程 线程 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。 &#xff08;理解&#xff1a;应用软件中互相独立&#xff0c;可以同时运行的功能&#xff09; 进程 进程是程序的基本执行实体。&#xff08;理解&#…

在windows下安装wsl子系统

一、安装环境 windows规格 版本Windows 10企业版版本号22H2操作系统内部版本19045.4291 二、安装过程 2.1 以管理员身份打开PowerShell&#xff08;win X快捷键&#xff09;&#xff1b; 2.2 输入命令&#xff1a;wsl --list --online&#xff08;简写&#xff1a;wsl -l …

探索 Joomla! CMS:打造个性化网站的利器

上周我们的Hostease客户咨询建站服务。他想要用Joomla建站。Hostease提供免费安装Joomla CMS服务。这可以让客户搭建网站变得更加简单和高效。下面是针对Joomla建站的一些使用心得。 Joomla CMS是一款开放自由的软件&#xff0c;为用户提供了创建和维护网站的自由度。它经过全…

鸿蒙应用开发DevEco Studio工程目录模块介绍

面向开发者&#xff0c;HarmonyOS 推出了 DevEco Studio 和 Dev Device Tool 两款开发工具&#xff0c;前者目前迭代至 3.1 版本&#xff08;对外开放版本&#xff09;&#xff0c;用于开发 HarmonyOS 应用&#xff1b;后者用于开发智能设备 应用的工程主体结构如上图 在这里我…

编写一个C#程序,实现音乐文件的播放功能

一、作业要求 要求1&#xff1a; 1. 程序应能够读取MP3文件&#xff0c;并播放其中的音频。 2. 程序应能够处理可能出现的异常&#xff0c;如文件不存在、文件读取错误等。 3. 程序应具有良好的用户界面&#xff0c;方便用户进行操作。 4. 程序应具有良好的兼容性&#xf…

数据可视化训练第三天(富豪借钱问题可视化)

题目 一个穷人到富人那里去借钱&#xff0c;原以为富人不愿意&#xff0c;哪知富人一口答应了下来&#xff0c; 但提出了如下条件&#xff1a; 在30天中&#xff0c;富人第一天借给穷人1万元&#xff0c;第二天借给2万&#xff0c;以后每天所借的钱数都比上一天的多一万&…

C++数据结构——AVL树

前言&#xff1a;本篇文章将紧随二叉搜索树的节奏&#xff0c;分享一个新的数据结构——AVL树。 目录 一.AVL树概念 二.AVL树插入规则 三.AVL树实现 1.基本框架 2.插入 3.旋转 1&#xff09;左\右单旋 2&#xff09;左右/右左双旋 4.遍历 5.求树高度 6.判断平衡 7.…

仿真算法验证成功后,如何快速实现真机无缝切换?

Prometheus仿真优势 首先&#xff0c;我们先通过下面这个视频了解一下Prometheus仿真有哪些优势&#xff1a; 开源自主无人机平台重大更新&#xff01;Promethus仿真到真机无缝切换 Prometheus仿真最大的优势之一是采用了模块化设计&#xff0c;对每个操作节点进行了封装&…

影刀进行shopee商品排名零代码爬取

需要研究shopee平台的排名更新时间段和周期&#xff0c;几分钟用影刀写了一个爬取应用&#xff0c;每10分钟进行一次排名爬取&#xff08;以fan‘风扇’为例&#xff09;&#xff0c;0代码爬取。 打开’fan’关键词搜索网页&#xff1b;等待网页加载&#xff1b;滚动进一步加载…

如何使用Python为Excel文件添加预设文档属性和自定义文档属性

向Excel文件添加文档属性是专业地组织和管理电子表格数据的关键步骤。这些属性&#xff0c;如标题、作者、主题和关键词&#xff0c;增强了文件的元数据&#xff0c;使得在大型数据库或文件系统中跟踪、排序和搜索文档变得更加容易。通过包含这些信息&#xff0c;您不仅提高了文…

太牛了!360大佬编写的《应急响应指导手册》火了!(PDF限时3天领取)

免责声明&#xff1a; 请使用者遵守《中华人民共和国网络安全法》&#xff0c;由于传播、利用本账号所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;公众号及作者不为此承担任何责任。 简介 这份《应急响应指导手册》&#xf…

CSS跳动文字

<div class"loading-mask"><div class"loading-text"><span style"--i:1">加</span><span style"--i:2">载</span><span style"--i:3">中</span><span style"--i:…

android进阶-AIDL

参考&#xff1a;Android进阶——AIDL详解_android aidl-CSDN博客 AIDL&#xff08;Android 接口定义语言&#xff09;&#xff0c;可以使用它定义客户端与服务端进程间通信&#xff08;IPC&#xff09;的编程接口&#xff0c;在 Android 中&#xff0c;进程之间无法共享内存&…

Word设置代码块格式

前言 Word中无法像Markdown和LaTeX一样插入代码块&#xff0c;若要在Word中插入代码块可以手动设置代码块格式或自动粘贴代码块格式。若不追求完美高亮效果&#xff0c;可使用前者方案&#xff1b;若追求完美的高亮效果&#xff0c;可使用后者方案。下文介绍这2种方案。 手动…

C++ 多态的相关问题

目录 1. 第一题 2. 第二题 3. inline 函数可以是虚函数吗 4. 静态成员函数可以是虚函数吗 5. 构造函数可以是虚函数吗 6. 析构函数可以是虚函数吗 7. 拷贝构造和赋值运算符重载可以是虚函数吗 8. 对象访问普通函数快还是访问虚函数快 9. 虚函数表是什么阶段生成的&…

华为 Huawei 交换机 配置 Dot1q 终结子接口实现同设备 VLAN 间通信示例

组网需求 企业的不同部门拥有相同的业务&#xff0c;如上网、 VoIP 等业务&#xff0c;且各个部门中的用户位于不同的网段。目前存在不同的部门中相同的业务所属的VLAN 不相同&#xff0c;现需要实现不同VLAN中的用户相互通信。 如 图 7-7 所示&#xff0c;部门 1 和部门 2 中…

【拼多多笔试题汇总】2024-05-09-拼多多春招笔试题-三语言题解(Cpp/Java/Python)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新拼多多近期的春秋招笔试题汇总&#xff5e; &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f…