MyBatisPlus基操

【MyBatisPlus】MyBatisPlus介绍与使用 【MyBatisPlus】MyBatisPlus介绍与使用1、什么MyBatisPlus2、MyBatisPlus的CRUD操作3、MyBatisPlus分页使用。 阅读详情

先跑起来

依赖

		<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.0</version>
        </dependency>

依赖yml

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: xx2255
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: false

数据库
数据库
entity

@Data
public class User {
    private Integer id;
    private String name;
    private Integer age;
}

mapper

@Mapper
public interface UserMapper extends BaseMapper<User> {
}

测试

 @Autowired
    private UserMapper userMapper;

    @Test
    void test() {
        userMapper.selectList(null).forEach(System.out::println);
    }

结果

User(id=1, name=张三, age=19)
User(id=2, name=李四, age=18)
User(id=3, name=王马子, age=17)

注解

@TableName

映射数据库的表名

@TableName(value = "user")

@TableId

主键映射,type属性是设置主键生成策略,可以设置:

@TableId(value = "id",type = IdType.AUTO)
	AUTO(0),
    NONE(1),
    INPUT(2),
    ASSIGN_ID(3),
    ASSIGN_UUID(4),
值描述
AUTO数据库自增
NONE无状态,实验证明无状态就用雪花
INPUT码农手动赋值
ASSIGN_IDMP分配雪花ID,Long、String
ASSIGN_UUID分配UUID,String

官方说:
在这里插入图片描述
另外全局也可以配一下,温馨提醒,踩坑需谨慎

mybatis-plus.global-config.db-config.id-type=assign_id

@TableField

value:映射数据库表非主键的字段

@TableField(value = "name")

exist:是否为数据库字段

@TableField(exist = false)

select:是否查这个字段

@TableField(value = "name",select = false)

fill:比如每次更新时间很烦,除了设置数据库的方式外,MP提供这种更新方法,FieldFill:

	DEFAULT,
    INSERT,
    UPDATE,
    INSERT_UPDATE;

设置后,每次创建一条数据的时候createTime、updateTime都会自动填充值,每次更新时updateTime更新

@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;

这里枚举设置好后还得自己写个方法实现MetaObjectHandler ,给两个方法写需要赋的值。注意不要忘了给spring注入

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime",new Date(), metaObject);
        this.setFieldValByName("updateTime",new Date(), metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime",new Date(), metaObject);
    }
}

@Version

用来标记乐观锁,通过version字段保证数据的安全性,当修改数据的时候,会以version作为条件,当条件成立的时候才会修改。
修改数据库字段,加上version字段,实体类也加上version

	@Version
    private int version;

为了让乐观锁生效,得弄个配置类,返回一个乐观锁拦截器

@Configuration
public class MyBatisPlusConfig {
    
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return new OptimisticLockerInterceptor();
    }
}

换了台电脑,刚那台冒烟了。懒得新建数据库和实体类,所以我这里用现成的

		Shop shop = shopMapper.selectById(777);
        shop.setShopName("123");
        shopMapper.updateById(shop);
JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@33f2df51] will not be managed by Spring
==>  Preparing: SELECT id,shopName,inventory,version FROM shop WHERE id=? 
==> Parameters: 777(Integer)
<==    Columns: id, shopName, inventory, version
<==        Row: 777, 777, 777, 1
<==      Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@11c3ff67]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@69f0b0f4] was not registered for synchronization because synchronization is not active
JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@33f2df51] will not be managed by Spring
==>  Preparing: UPDATE shop SET shopName=?, inventory=?, version=? WHERE id=? AND version=? 
==> Parameters: 123(String), 777(Integer), 2(Integer), 777(Integer), 1(Integer)
<==    Updates: 1

更新
更新成功
模拟一下两个线程同时修改一条数据

		Shop shop = shopMapper.selectById(999);
        shop.setShopName("001");

        Shop shop1 = shopMapper.selectById(999);
        shop1.setShopName("002");

        shopMapper.updateById(shop);
        shopMapper.updateById(shop1);

如果忽略乐观锁,那么最后的结果应该是002,有了version,乐观锁生效

JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6056232d] will not be managed by Spring
==>  Preparing: UPDATE shop SET shopName=?, inventory=?, version=? WHERE id=? AND version=? 
==> Parameters: 001(String), 999(Integer), 2(Integer), 999(Integer), 1(Integer)
<==    Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@66933239]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@470d183] was not registered for synchronization because synchronization is not active
JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6056232d] will not be managed by Spring
==>  Preparing: UPDATE shop SET shopName=?, inventory=?, version=? WHERE id=? AND version=? 
==> Parameters: 002(String), 999(Integer), 2(Integer), 999(Integer), 1(Integer)
<==    Updates: 0

结果

@EnumValue

通用枚举类注解,把数据库字段映射成实体类的枚举类型成员变量,枚举类里的code对应数据库里的值

public enum  StatusEnum {
    //两个状态,0是醒着,1是睡着了
    WORK(0,"醒着"),
    SLEEP(1,"睡着了");

    StatusEnum(Integer code, String msg){
        this.code = code;
        this.msg = msg;
    }
    
    @EnumValue
    private Integer code;
    private String msg;
}

实体类加上枚举类型,并且名字要跟数据库字段保持一致

private StatusEnum status;

yml里mybatis plus加上扫描枚举包的配置

type-enums-package: cn.xx.emnus

第二种方法时通过实现IEnum接口,不用写注解

//实现IEnum接口
public enum  StatusEnum implements IEnum<Integer> {
    //两个状态,0是醒着,1是睡着了
    WORK(0,"醒着"),
    SLEEP(1,"睡着了");

    StatusEnum(Integer code, String msg){
        this.code = code;
        this.msg = msg;
    }

    //不写注解
    private Integer code;
    private String msg;

    @Override
    public Integer getValue() {
        return this.code;
    }
}

@TableLogic

做逻辑删除用的
数据库添加deleted字段,实体类添加对应映射并加上注解

	@TableLogic
    private Integer deleted;

yml里mybatis plus的加上配置,删除和没删除分别是用什么数字表示

global-config:
    db-config:
      logic-delete-value: 0
      logic-not-delete-value: 1

测试,数据库数据还存在但状态被改了,代码进行查询操作时并没有把删了的数据查出来,说明逻辑删除起总用了,看它sql语句,每次都会带上deleted条件。

JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@5ceecfee] will not be managed by Spring
==>  Preparing: UPDATE shop SET deleted=0 WHERE id=? AND deleted=1 
==> Parameters: 1(String)
<==    Updates: 1

查询

selectList
不加任何条件全部查询

shopMapper.selectList(null);

看源码,它参数其实是Wrapper接口
单条件查询

		QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.eq("id","12365");
        System.out.println(shopMapper.selectList(queryWrapper));

多条件等值查询

		QueryWrapper queryWrapper = new QueryWrapper();
        Map<String,Object> map = new HashMap<String, Object>();
        map.put("shopName","面条");
        map.put("inventory",10);
        queryWrapper.allEq(map);
        System.out.println(shopMapper.selectList(queryWrapper));

大于

queryWrapper.gt("inventory",10);

小于

queryWrapper.lt("inventory",10);

不等于

queryWrapper.ne("inventory",10);

大于等于

queryWrapper.ge("inventory",10);

小于等于

queryWrapper.le("inventory",10);

模糊查询

// %面%
 queryWrapper.like("shopName","面");
 //%面
 queryWrapper.likeLeft("shopName","面");
  //面%
 queryWrapper.likeRight("shopName","面");

inSQL

queryWrapper.inSql("id","select id from shop where id < 10");
queryWrapper.inSql("inventory","select inventory from shop where inventory > 10");
SELECT id,shopName,inventory,version,status,deleted FROM shop WHERE deleted=1 AND (id IN (select id from shop where id < 10) AND inventory IN (select inventory from shop where inventory > 10))

排序

//升序
queryWrapper.orderByAsc("inventory");
//降序
queryWrapper.orderByDesc("inventory");

having

queryWrapper.orderByAsc("inventory");
queryWrapper.having("id > 8");

多ID查询

//WHERE id IN ( ? , ? , ? )
shopMapper.selectBatchIds(Arrays.asList(1,3,4));

selectByMap只能做等值判断,相比queryWrapper 就很l了。

count

shopMapper.selectCount(queryWrapper);

分页
首先加个拦截器的配置,不然不起作用

@Bean
    public PaginationInterceptor paginationInterceptor(){
        return new PaginationInterceptor();
    }
 //分页,3是当前第3页,2是每页2条
        Page<Shop> page = new Page<Shop>(3,2);
        Page<Shop> result = shopMapper.selectPage(page,queryWrapper);
        result.getRecords().forEach(System.out::println);

selectObjs
把所有id查出来

shopMapper.selectObjs(queryWrapper);

selectOne
适用于只查出一条数据

shopMapper.selectOne(queryWrapper);

自定义SQL(多表联查)
比如要通过某人id查他名下所有产品
数据库product:
product

数据库user:
user
写个productVo

@Data
public class ProductVo {
    private int category;
    private int count;
    private String shopName;
    private int userId;
    private String name;
}

自定义mapper接口的接口及sql

@Select("select category,count,shopName,userId,name from product ,user where userId = user.id and user.id = #{id}")
List<ProductVo> productList(Integer id);

测试

shopMapper.productList(1).forEach(System.out::println);

结果

ProductVo(category=1, count=10, shopName=手机, userId=1, name=张三)
ProductVo(category=1, count=2, shopName=电脑, userId=1, name=张三)

添加

		Shop shop = new Shop();
        shop.setShopName("包子饺子");
        shopMapper.insert(shop);

删除

//byid删除
        shopMapper.deleteById(1);
        //by好多id删除
        shopMapper.deleteBatchIds(Arrays.asList(11,12,14,19));
        //通过自定义条件删除
        shopMapper.delete(queryWrapper);
        //把条件放到map里,当做条件进行删除

修改

不带条件

		Shop shop = shopMapper.selectById(1);
        shop.setShopName("牛排");
        shopMapper.updateById(shop);

带条件

Shop shop = shopMapper.selectById(1);
        shop.setShopName("牛排");
        shopMapper.update(shop,queryWrapper);
MyBatisPlus快速入门(三)MyBatisPlus配置日志输出 本文是MyBatisPlus入门到实战专栏的第三篇,讲解MyBatisPlus中如何配置日志的输出,介绍了Log4j2、Logback、Slf4j三种日志框架和SpringBoot项目的整合方法。 阅读详情

相关推荐

MobaXterm破解14个会话限制的保姆级教程(附Python环境配置指南)

本文提供了MobaXterm破解14个会话限制的详细教程,并深入讲解了如何配置稳定的Python环境以支持相关脚本运行。通过理解软件授权机制、安全实践步骤以及许可文件的应用,帮助用户解除会话数量限制,实现高效的远程服务器管理与自动化运维。

weixin_29211309的博客 1663

解决jdbc连接mysql报时区错误

连接mysql的时候报了这个错误: java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone 这是mysql的时区和本地不一致 可以这样子解决,在连接url后面添加时区参数serverTimezone spring...

大牛壮壮成长之路 1万+

RAGFlow系列(06):从0.20.0版本升级到最新版的完整指南

本文提供了从RAGFlow 0.20.0版本升级到最新版的完整指南。升级前务必进行数据、配置和状态的三层备份,尤其是智能体配置因版本间存在不兼容风险。指南详细说明了如何优雅停止服务、拉取新代码、检查并调整配置文件(如端口、环境变量),以及最终部署验证的步骤,确保升级过程平滑安全。

weixin_29243279的博客 464

SpringBoot2.x问题记录

@Resource & @Autowired 什么区别? (1):相同点 @Resource的作用相当于@Autowired,均可标注在字段或属性的setter方法上。 (2):不同点 a:提供方 @Autowired是Spring的注解,@Resource是javax.annotation注解,而是来自于JSR-250,J2EE提供,需要JDK1.6及以上。 b :注入方式 @Autowired只按照Type 注入;@Resource默认按Name自动注入,也提供按照Type 注入; c:..

欲望以提升热忱 毅力以磨平高山 1897

数字信号处理实验:信号谱分析与FFT算法的应用

​ (1)给定信号为 ,其中a为42,b为1。理论分析信号 的频率成分。 (2)分别采用采样频率为 , , , 对 进行采样,其中 , , , ,根据是否满足采样定理要求分析四种采样频率下频谱的分布,在满足采样定理情况下做频谱分析。 (3)任意生成两组有限长信号,对信号分别进行直接卷积和FFT算法求卷积,并分析圆周卷积与线性卷积的关系。

m0_56324525的博客 3203

一篇讲透:豆包、元宝、DeepSeek、Kimi、WorkBuddy,职场里到底怎么分工

这篇文章深入分析了当前主流AI工具(WorkBuddy、豆包、腾讯元宝、DeepSeek、Kimi)的特点和使用场景,帮助读者根据不同工作需求选择合适的AI助手。核心观点包括: AI工具各有所长:豆包适合快速创作初稿,元宝擅长信息检索整理,DeepSeek强于逻辑分析,Kimi专精文本处理,WorkBuddy则更适合任务推进和成果交付。 使用前需明确需求:是要创意发散、信息整理,还是任务执行?不同阶段应选用不同工具组合。 提供了6个具体职场场景的解决方案,包括文章创作、课程设计、会议纪要等,并给出详细的操作

weixin_39284145的博客 1万+

JDBC Connection will not be managed by Spring

SQL日志出现这种信息的时候,根据其他博客的说法是,这个JDBC连接没有进行事务控制,所以就没有被Spring管理。

zzd的博客 1万+

APS生产排程系统——ERP、MES、APS系统的关联和区别

APS生产排程系统——ERP、MES、APS系统的关联和区别

这里有一只小马吖 2万+

MySQL报错 Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl

连接池

weixin_42555971的博客 8472

液压轴位置闭环控制(比例伺服阀应用)

液压阀的基础知识请参看下面的博客文章:PLC液压控制系列之比例流量阀结构分析_RXXW_Dor的博客-优快云博客比例流量阀液压同步控制的PID闭环调节可以参看下面这篇博文三菱FX3U-PLC 前馈+PID闭环调节实现液压同步控制(比例换向阀)_RXXW_Dor的博客-优快云博客液压控制系统在工业现场应用非常广泛,这篇博文我们简单分析下液压同步控制。这套系统的液压缸为单液压缸,首先简单介绍下什么是单作用液压缸,液压系统的详细理论分析大家可以找些专业书籍学习。

RXXW_Dor的博客 2264

高通平台开发系列讲解(系统篇)系统关机流程

📢本篇章主要图解高通平台系统关机流程。

内核笔记 3213

SpringBoot+Mybatis Plus项目报错整理

1.token为空900报错:首先验证controller是否能传进来,能传进来就不是login的问题.传得进来就是后台问题,多半是数据库有配置有问题. 2.not found类错误,1.没加注解,参数没传进来,2.注解的继承树不对. 3.JDBC Connection [xxxx] will not be managed by Spring JsqlParserCountOptimize sql=xxxxxxxx 目前来看不算是报错,就是没查到(我写查询,insert造的一堆边界数据,然后那哥..

Galaxy_12138的博客 2259

全桥 LLC 谐振变换器详细解析:结构 + 控制 + 工作原理全搞懂!

在现代高效率电源系统中,LLC 谐振变换器🔥早已成为降损利器。尤其是全桥 LLC 拓扑结构,由于其在、副边整流管的 ZCS(零电流关断),再加上优秀的效率表现,已经成为服务器电源、电动汽车 OBC、光伏逆变等场景的首选。那么,全桥 LLC 到底长啥样?它的控制方式是怎么回事?具体工作波形又是如何呢?今天我们就来一篇讲清楚、讲透彻的文章!🚗💨。

weixin_43199439的博客 3525

mybatisPlus 条件构造器QueryWapper 实操

package com.wego.clouddisk.gallery.mapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomido...

cyn_653620的博客 2817

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

MybatisPlus

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生(提供了快速使用mybatis的方式)。或Redirect/*** 编写接口继承BaseMapper接口,* 其中泛型是是与数据表对应的entity类,会根据泛型类的@TableName注解值获取要操作的数据表*/@Mapper/*** 分页查询id大于id的用户集合。

luosuss的博客 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

MyBatisPlus 用法详解

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。它提供了许多便捷的功能,比如 CRUD 操作的自动实现、分页插件、性能分析插件等,这些功能可以帮助开发者更快速地开发出高质量的应用程序。

2301_80035594的博客 5514

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

全网最强MyBatisPlus教程 | 万字长文爆肝MyBatisPlus

MyBatisPlus是基于MyBatis的增强工具,旨在简化开发和提高效率。文章介绍了基于SpringBoot整合MyBatisPlus的入门案例,包括创建数据库、配置依赖、编写实体类和Dao接口等步骤。MyBatisPlus通过继承BaseMapper接口,无需编写SQL即可实现标准CRUD操作,大幅简化开发流程。同时还介绍了MyBatisPlus的官方文档和定位,强调其作为MyBatis的增强工具而非替代品的角色。文中包含详细的操作步骤和配置示例,适合初学者快速上手使用MyBatisPlus。

qq_45832461的博客 2309

Mybatis-Plus MetaObjectHandler基操及源码解析

在 MyBatis-Plus 中提供了一个便捷的自动填充功能。MetaObjectHandler 是一个用于处理实体对象的元对象的接口。它允许我们在插入、更新、删除等操作之前或之后,对实体对象进行自定义处理。通过 MetaObjectHandler,我们可以实现如自动填充创建时间、更新时间、删除标记等功能。

雨后是冰雹 1936

若依集成MybatisPlus

若依集成MybatisPlus及代码生成

PARADDD的博客 1万+

MyBatisPlus

MyBatisPlus环境搭建的步骤?BaseMapper​​@Mapper​通过入门案例制作,MyBatisPlus的优点有哪些?MyBatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提高效率https有什么简单的办法可以自动生成实体类的GET、SET方法?Lombok,一个Java类库,提供了一组注解,简化POJO实体类开发。

是程序喵呀 1322

SpringBoot与MybatisPlus MybatisPlus

仅为个人学习使用。

,,,,,,, 1万+

深入解析MyBatisPlus 一篇直接让你学会MyBatisPlus

MyBatisPlus环境搭建的步骤?BaseMapper注意:BaseMapper后边必须指定泛型User,以此来确定操作的表MyBatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提高效率https这个统计SQL在企业开发中,一般会使用MyBatis在xml中编写sql//统计//分组//查询总记录数在模型类属性上方,使用注解,通过==exist==属性,设置属性在数据库表字段中是否存在,默认为true。此属性无法与value合并使用。

weixin_73330164的博客 1307
上一篇: MyBatis基操
下一篇: Kettle PDI Linux安装运行
献 丑
博客等级 码龄8年 10粉丝 61原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值