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

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

MyBatis-Plus的常见使用场景

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

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

Springboot集成Mybatisplus

涉及的模块

  • springboot-mybatisplus:mysql测试,端口号18086

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

本示例依赖一个基础开发框架,这部分详细可参考:动手开发基于Springboot的基础开发框架-01

模块结构说明

在这里插入图片描述

  • 类文件说明

    • 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;}

模块配置

Maven 依赖

这里需要注意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集成Mybatispuls操作mysql数据库

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

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

相关文章

土壤重金属含量分布、Cd镉含量、Cr、Pb、Cu、Zn、As和Hg、土壤采样点、土壤类型分布

土壤是人类赖以生存和发展的重要资源之一,也是陆地生态系统重要的组成部分。近年来, 随着我国城市化进程加快&#xff0c;矿产资源开发、金属加工冶炼、化工生产、污水灌溉以及不合理的化肥农药施用等因素导致重金属在农田土壤中不断富集。重金属作为土壤环境中一种具有潜在危害…

练习题(2024/5/6)

1路径总和 II 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], target…

vue3 axios数据请求封装

准备工作 vue3jsvite 首先确认package.json中有axios 如果没有 运行 npm install axios 安装axios 成功后在package.json文件会显示。 第一步 创建app.js、request.js 两个文件在同级目录下即可 api.js import instance from "./request"; const api_name "&qu…

前端小案例

案例一: 在 onLoad 函数中&#xff0c;首先通过 wx.getStorageSync(userInfo) 获取用户信息&#xff0c;如果用户信息存在&#xff0c;则从中提取用户ID&#xff0c;并将其存储在页面数据中&#xff0c;以便后续使用。如果用户信息不存在&#xff0c;你可以根据实际需求进行相…

linux安装 mysql

环境&#xff1a;centOS8 一、安装 1 安装wget库 sudo yum -y install wget 2. 安装 mysql 换yum源 亲测成功&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 换yum源 1.下载对应版本的repo文件 wget -O CentOS-Base.repo http://mirrors…

watch侦听器

在 Vue.js 中&#xff0c;watch 侦听器用于观察和响应 Vue 实例上的数据变动。当你想在数据变化时执行异步或开销较大的操作时&#xff0c;这个方式是最有用的。与计算属性不同&#xff0c;watch 侦听器允许你执行更复杂的逻辑&#xff0c;包括异步操作&#xff0c;并且只有当观…

C#编程模式之外观模式

创作背景&#xff1a;给位伙伴&#xff0c;五一小长假结束&#xff0c;我们继续对C#编程之路进行探索。本文将继续编程模式的研究&#xff0c;主要介绍外观模式。外观模式也称为门面模式&#xff0c;是一种结构型设计模式&#xff0c;它的目的是为子系统中的一组接口提供一个统…

力扣每日一练(螺旋矩阵)

54. 螺旋矩阵 - 力扣&#xff08;LeetCode&#xff09; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,…

centos 8.2 安装配置 vsftpd 虚拟用户访问

1安装vsftp yum install vsftpd -y 2安装db5 wget https://github.com/berkeleydb/libdb/releases/download/v5.3.28/db-5.3.28.tar.gz . tar zxvf db-5.3.28.tar.gz cd db-5.3.28/build_unix/ ../dist/configure -prefix/usr/local Make Make install3建用户等 useradd…

ESCI3罗德与施瓦茨ESCI3测试接收机

181/2461/8938产品概述&#xff1a; R&S ESCI接收机的特点包括: 出色表现 多达10个子范围的可编程扫描表自动或交互式预览和最终EMI测量的内部测试程序预扫描、数据缩减&#xff08;峰列表&#xff09;和最终测量的评估功能光谱分析仪快速ACP测量时域分析&#xff08;记…

Linux内核--设备驱动(六)媒体驱动框架整理(2)--视频

目录 一、引言 二、V4L2 ------>2.1、主要结构体 ------------>2.2.1、video_device ------------>2.2.2、v4l2_device ------------>2.2.3、v4l2_subdev ------>2.2、流程 ------>2.3、驱动实例 ------>2.4、V4L2的ioctl类型 ------------>…

Unity射击游戏开发教程:(11)制造敌人爆炸

增加爆炸效果 爆炸一切都变得更好!尤其是当你消灭敌人时。在这篇文章中,我将讨论如何在敌人被击中时为其添加爆炸动画。 在敌人的预制件中,您将需要创建一个新的动画。查看控制动画的动画器,默认情况下将从进入动画到敌人爆炸动画。这意味着,一旦敌人被实例化,敌人爆炸…

【Git】【MacOS】Github从创建与生成SSH公钥

创建账号 这一步不过多赘述&#xff0c;根据自己的邮箱新创建一个账号 配置SSH公钥 本人是macOS系统&#xff0c;首先从终端输入 cd ~/.ssh进入.ssh目录,然后通过 ls查看有没有一个叫做id_rsa.pub的文件 本人之前生成过SSH公钥,如果没有的话&#xff0c;通过 ssh-keygen -t…

vue 金额组件,输入提示单位:‘千’、‘万’、‘十万’...并用‘,’三个格式化

近期项目中遇到一个需求&#xff0c;金额输入框&#xff0c;输入过程中自动提示‘千’、‘万’、‘十万’、‘百万’......等单位提示&#xff0c;鼠标失去焦点后&#xff0c;并用‘,’三位隔开计数。 例如&#xff1a; 输入&#xff1a;12345.99 失去焦点&#xff1a;12,34…

Unit3

&#x1f4e3;Unit3 ✨1. capt&#xff0c;cept&#xff0c;ceive 抓&#xff0c;收 capture captain capable capability accept be accepted as acceptance acceptable unacceptable conceive conceive of sth concept conception except nothing expect exception …

科技云报道:从亚运到奥运,大型国际赛事共赴“云端”

科技云报道原创。 “广播电视转播技术拯救了奥运会”前奥委会主席萨马兰奇这句话广为流传。 奥运会、世界杯、亚运会这样的全球大型体育赛事不仅是体育竞技的盛宴&#xff0c;也是商业盛宴&#xff0c;还是技术与人文的融合秀。随着科技的进步&#xff0c;技术在体育赛事中扮…

vue中怎样清除computed的缓存

vue中computed计算属性自带缓存&#xff0c;会提高程序的渲染性能&#xff0c;但根据业务需求以及相应的优化&#xff0c;可能要清除computed的缓存&#xff0c;具体方法和场景分为了vue2和vue3 vue2&#xff1a; this.$delete(this.someObject, cachedProperty); 使用 this…

嵌入式交叉编译:x265

下载 multicoreware / x265_git / Downloads — Bitbucket 解压编译 BUILD_DIR${HOME}/build_libs CROSS_NAMEaarch64-mix210-linuxcd build/aarch64-linuxmake cleancmake \-G "Unix Makefiles" \-DCMAKE_C_COMPILER${CROSS_NAME}-gcc \-DCMAKE_CXX_COMPILER${CR…

实现主动威胁狩猎的7种方法及其特点分析

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、基于假设的威胁狩猎二、基于异常行为的威…

Spring Cloud Alibaba Sentinel 集成与限流实战(6)

Spring Cloud Alibaba 工程搭建&#xff08;1&#xff09; Spring Cloud Alibaba 工程搭建连接数据库&#xff08;2&#xff09; Spring Cloud Alibaba 集成 nacos 以及整合 Ribbon 与 Feign 实现负载调用&#xff08;3&#xff09; Spring Cloud Alibaba Ribbon 负载调用说明&…