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=true

management.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 {

    @Override
    public 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);
    }

    @Override
    public 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">
        select
            t_sys_record_demo.*
        from
            t_sys_record_demo
        where 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 {

    @Autowired
    private 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);

    @Autowired
    private ISystemLogDao iSystemLogDao;

    /*注意此处要引用 import org.junit.jupiter.api.Test;*/

    /*全表搜索*/
    @Test
    public void iSystemLogDao() {
        List<SystemLogEntity> list = iSystemLogDao.list();
        logger.info(JSONUtil.toJsonStr(list));
    }

    /*增加操作*/
    @Test
    public void iSystemLogDaoInsert() {
        SystemLogEntity systemLogEntity = new SystemLogEntity();
        systemLogEntity.setUuid(UUIDUtil.uuid32());
        iSystemLogDao.save(systemLogEntity);
    }

    /*删除操作*/
    @Test
    public void iSystemLogDaoDelete() {
        iSystemLogDao.removeById("3006316502a24b6b8b5eac4d1a8f6e5a");
    }

    /*更新操作*/
    @Test
    public void iSystemLogDaoUpdate() {
        SystemLogEntity systemLogEntity = new SystemLogEntity();
        systemLogEntity.setUuid("a4dd3bcf2a134941a4a1fb9119028600");
        systemLogEntity.setCode("heart");
        iSystemLogDao.updateById(systemLogEntity);
    }

    /*分页查询*/
    @Test
    public  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 {
    @Autowired
    protected MockMvc mockMvc;

    private HttpHeaders httpHeaders = new HttpHeaders();

    private static final ObjectMapper mapper = new ObjectMapper();

//    @Before
    public void setBasicAuth() throws Exception {
        // 设置basicAuth
        String basicAuthString = "Basic " + Base64.getEncoder().encodeToString("aaa:bbb".getBytes());
        httpHeaders.set("Authorization", basicAuthString);
    }

    @Test
    public 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的body
        String resutlStr = mvcResult.getResponse().getContentAsString(Charset.defaultCharset());
        ListResponse response =  mapper.readValue(resutlStr, ListResponse.class);
        // 判断结果是否成功
        assertEquals("0", response.getStatus().toString());
    }

}

程序源码下载

Springboot集成Mybatispuls操作mysql数据库

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于FPGA的去雾算法

去雾算法的原理是基于图像去模糊的原理&#xff0c;通过对图像中的散射光进行估计和去除来消除图像中的雾霾效果。 去雾算法通常分为以下几个步骤&#xff1a; 1. 导引滤波&#xff1a;首先使用导引滤波器对图像进行滤波&#xff0c;目的是估计图像中散射光的强度。导引滤波器…

MATLAB绘制蒸汽压力和温度曲线

蒸汽压力与温度之间的具体关系公式一般采用安托因方程&#xff08;Antoine Equation&#xff09;&#xff0c;用于描述纯物质的蒸汽压与温度之间的关系。安托因方程的一般形式如下&#xff1a; [\log_{10} P A - \frac{B}{C T}] 其中&#xff0c; (P) 是蒸汽压&#xff08…

安卓view坐标系

目录 一、getX、 getRawX、 getTranslationX 等的图形表示二、 getX、 getRawX、 getTranslationX 意义的文字描述 一、getX、 getRawX、 getTranslationX 等的图形表示 坐标系&#xff1a; 视图坐标系&#xff1a; 二、 getX、 getRawX、 getTranslationX 意义的文字描述 …

【吊打面试官系列】Java高并发篇 - volatile 变量和 atomic 变量有什么不同?

大家好&#xff0c;我是锋哥。今天分享关于 【volatile 变量和 atomic 变量有什么不同&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; volatile 变量和 atomic 变量有什么不同&#xff1f; Volatile 变量可以确保先行关系&#xff0c;即写操作会发生在后续的读…

Vue 插槽

Vue插槽是一种特殊的语法&#xff0c;用于在组件中定义可复用的模板部分。它允许开发者在组件的标记中声明一个或多个插槽&#xff0c;然后在使用该组件时&#xff0c;可以根据自己的需求将内容插入到这些插槽中。 Vue插槽分为默认插槽和具名插槽两种。 默认插槽 语法 组件…

中国科技大航海时代,“掘金”一带一路

文&#xff5c;白 鸽 编&#xff5c;王一粟 “这不就是90年代的内地吗&#xff1f;” 在深度考察完沙特市场后&#xff0c;华盛集团联合创始人兼CEO张霆对镜相工作室感慨道。 在张霆看来&#xff0c;沙特落后的基建&#xff08;意味着大量创新空间&#xff09;、刚刚开放…

18.Blender 渲染工程、打光方法及HDR贴图导入

HDR环境 如何导入Blender的HDR环境图 找到材质球信息 在右上角&#xff0c;点击箭头&#xff0c;展开详细部分 点击材质球&#xff0c;会出现下面一列材质球&#xff0c;将鼠标拖到第二个材质球&#xff0c;会显示信息 courtyard.exr 右上角打开已渲染模式 左边这里选择世界…

01、JMS规范介绍

01、JMS规范介绍 在我们正式学习Kafka之前&#xff0c;先来了解下JMS&#xff0c;因为这可以在一定程度上帮助你更加深入的理解和学习Kafka。 1、 JMS简介 JMS&#xff0c;全称Java Mesage Service&#xff0c;即Java消息服务应用程序接口&#xff0c;是一个Java平台中关于面…

HIVE统计WordCount

HIVE WORDCOUNT 目录 HIVE WORDCOUNT 一、WORDCOUNT 1.我们先创建一个新的数据库 2.创建表并插入数据 3.统计WORDCOUNT 4.UNION ALL 用法 5.WITH AS 用法 1.WORDCOUNT 1&#xff09;我们先创建一个新的数据库 create database learn3;use learn3; 2&#xff09;创建表…

产品推荐 | 基于 Virtex UltraScale+ XCVU3P的FACE-VPXSSD-3PA 存储板

01 产品概述 FACE&#xff08;FPGA Algorithm aCceleration Engine&#xff09;FPGA算法加速开发引擎是基于FPGA可编程器件构建的一系列算法加速开发引擎平台。FACE-VPXSSD-3PA存储平台是FACE系列中的一员。该平台板载2组2GB 64bit DDR4、2路QSFP28光接口、4个NVME SSD M.2接口…

yum常用命令与lrzsz的在线安装

yum命令 yum&#xff08; Yellow dog Updater, Modified&#xff09;是一个在 Fedora 和 RedHat 以及 SUSE 中的 Shell 前端软件包管理器。 基于 RPM 包管理&#xff0c;能够从指定的服务器自动下载 RPM 包并且安装&#xff0c;可以自动处理依赖性关系&#xff0c;并且一次安装…

设备驱动中device_create函数与sys/devices目录

当调用device_create时parent参数为空时&#xff0c;新添加的设备位于sys/devices//sys/devices/virtual目录 以下面代码的为例 my_newcharled.myclass class_create(THIS_MODULE,dtled); my_newcharled.mydevice device_create(my_newcharled.myclass,NULL,my_newcharled.ne…

04-19 周五 GitHub actions-runner 程序解释

04-19 周五 GitHub actions-runner 程序解释 时间版本修改人描述2024年4月19日17:26:17V0.1宋全恒新建文档 简介 本文主要描述了actions-runner-linux-x64-2.315.0.tar.gz这个github actions CI所需要的客户端安装包的重要文件和内容信息。有关GitHub actions 的配置&#xff…

天图通逊|塘厦总仓服务全面升级

尊敬的客户&#xff1a; 您好!为了提供更优质、更高效的物流服务品质&#xff0c;我司针对国内塘厦仓库进行全面优化升级。升级内容如下&#xff1a; 1.分拣设备升级&#xff1a;在原有的自动分拣设备进行升级&#xff0c;由1.0速升级为1.5高速版&#xff1b;将分拣口的数量从…

<网络安全>《77 概念讲解<第十课 物联网常用协议-(近距离通信)感应层协议>》

协议简称全称名称内容说明RFIDRadio Frequency Identification射频识别阅读器与标签之间进行非接触式的数据通信&#xff0c;达到识别目标的目的。RFID的应用非常广泛&#xff0c;典型应用有动物晶片、汽车晶片防盗器、门禁管制、停车场管制、生产线自动化、物料管理。完整的RF…

基于数字证书的移动终端金融安全身份认证规范

基于数字证书的移动终端金融安全身份认证规范 1 范围 本文件规定了基于数字证书的移动终端金融安全身份认证的服务描述、移动终端生命周期管理、服 务生命周期管理、密钥管理、安全及功能、风险控制和运营管理的要求。 本文件适用于银行业金融机构、非银行支付机构&#xff0c…

1.4 初探JdbcTemplate操作

实战目的 掌握Spring框架中JdbcTemplate的使用&#xff0c;实现对数据库的基本操作。理解数据库连接池的工作原理及其在实际开发中的重要性。通过实际操作&#xff0c;加深对Spring框架中ORM&#xff08;对象关系映射&#xff09;的理解。 关键技术点 JdbcTemplate操作&…

triton之语法学习

一 基本语法 1 torch中tensor的声明 x = torch.tensor([[1,2, 1, 1, 1, 1, 1, 1],[2,2,2,2,2,2,2,2]],device=cuda) 声明的时候有的时候需要指出数据的类型,不然在kernel中数据类型无法匹配 x = torch.tensor([1,2,1,1,1,1,1,1],dtype = torch.int32,device=cuda) 2 idx id…

小程序激励广告视频多次回调问题

1.问题 2. 激励视频使用及解决方案 官方文档 let videoAd null; // 在页面中定义激励视频广告 Page({/*** 页面的初始数据*/data: {},/*** 生命周期函数--监听页面加载*/onLoad(options) {let that this;// 创建激励视频广告实例if (wx.createRewardedVideoAd) {videoAd w…

计算机网络4——网络层8 软件定义网络 SDN

文章目录 一、介绍1、简介2、原理3、案例1&#xff09;普通2&#xff09;负载均衡的例子3&#xff09;防火墙的例子 二、控制层面1、特征2、层次 一、介绍 1、简介 SDN的概念最初由斯坦福大学N.McKeown于2009年首先提出。当时还只是在学术界进行探讨的一种新的网络体系结构。…
最新文章