当前位置: 首页 > news >正文

【热门框架】Mybatis-Plus入门介绍看这一篇文章就足够了

MyBatis-Plus 是在 MyBatis 的基础上进行了封装,提供了更加便捷的开发方式,具有简化开发、提高效率等优点。以下是 MyBatis-Plus 的一些特点和用法:

  1. 通用 CRUD 操作:MyBatis-Plus 提供了通用的 CRUD 接口,可以直接调用,无需再编写 SQL 语句。例如,可以通过继承 BaseMapper 接口来实现对数据表的增删改查操作。

  2. 支持 Lambda 表达式:MyBatis-Plus 除了提供常规的 CRUD 接口,还支持使用 Lambda 表达式进行条件构造,使用更加简单,代码更加易读。例如:

    List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getName, "Jack").or().like(User::getEmail, "test")
    );
    
  3. 支持分页查询:MyBatis-Plus 提供了 Page 类用于分页查询,可以轻松地进行分页查询操作,例如:

    Page<User> page = new Page<>(1, 10);
    IPage<User> userPage = userMapper.selectPage(page, new QueryWrapper<User>().eq("status", 1).like("name", "Jack")
    );
    List<User> userList = userPage.getRecords();
    
  4. 代码生成器:MyBatis-Plus 提供了代码生成器,可以快速生成实体类、Mapper 接口以及 XML 映射文件,大大提高了开发效率。

  5. 支持注解方式配置:MyBatis-Plus 支持使用注解来配置 SQL 语句,例如可以使用 @TableName 注解来指定实体类对应的数据表,使用 @TableId 注解来指定主键字段。

以下是 MyBatis-Plus 的一些配置示例:

  1. 配置 XML 映射文件:

    <mapper namespace="com.example.mapper.UserMapper"><resultMap id="BaseResultMap" type="com.example.entity.User"><id column="id" property="id" jdbcType="BIGINT"/><result column="name" property="name" jdbcType="VARCHAR"/><result column="age" property="age" jdbcType="INTEGER"/><result column="email" property="email" jdbcType="VARCHAR"/></resultMap><select id="selectById" resultMap="BaseResultMap">select id, name, age, email from user where id=#{id}</select>
    </mapper>
    
  2. 配置注解方式:

    @TableName("user")
    public class User {@TableId(type = IdType.AUTO)private Long id;private String name;private Integer age;private String email;// ...
    }
    
  3. 使用 Lambda 表达式:

    List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getName, "Jack").or().like(User::getEmail, "test")
    );
    

以上就是 MyBatis-Plus 的一些特点和用法,接下来可以更深入地了解 MyBatis-Plus 的一些重要功能和用法:

  1. 实体类的代码生成:MyBatis-Plus 提供了代码生成器,可以根据数据库表结构自动生成实体类、Mapper 接口以及 XML 配置文件。使用代码生成器可以极大地提高开发效率,并且减少出错的可能性。以下是代码生成器的使用示例:
public class CodeGenerator {public static void main(String[] args) {// 数据源配置DataSourceConfig dataSourceConfig = new DataSourceConfig();dataSourceConfig.setDbType(DbType.MYSQL);dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8");dataSourceConfig.setUsername("root");dataSourceConfig.setPassword("root");// 全局配置GlobalConfig globalConfig = new GlobalConfig();globalConfig.setOutputDir(System.getProperty("user.dir") + "/src/main/java");globalConfig.setAuthor("test");globalConfig.setOpen(false);globalConfig.setServiceName("%sService");globalConfig.setMapperName("%sMapper");globalConfig.setXmlName("%sMapper");// 策略配置StrategyConfig strategyConfig = new StrategyConfig();strategyConfig.setNaming(NamingStrategy.underline_to_camel);strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);strategyConfig.setSuperEntityClass("com.baomidou.mybatisplus.extension.activerecord.Model");strategyConfig.setEntityLombokModel(true);strategyConfig.setRestControllerStyle(true);strategyConfig.setInclude("user"); // 需要生成的表名strategyConfig.setControllerMappingHyphenStyle(true);// 包配置PackageConfig packageConfig = new PackageConfig();packageConfig.setParent("com.example.demo");packageConfig.setEntity("entity");packageConfig.setService("service");packageConfig.setServiceImpl("service.impl");packageConfig.setMapper("mapper");packageConfig.setXml("mapper.xml");packageConfig.setController("controller");// 代码生成器AutoGenerator generator = new AutoGenerator();generator.setDataSource(dataSourceConfig);generator.setGlobalConfig(globalConfig);generator.setStrategy(strategyConfig);generator.setPackageInfo(packageConfig);// 执行生成代码generator.execute();}
}

上述代码会根据指定的数据库表生成对应的实体类、Mapper 接口以及 XML 配置文件,并且可以自定义配置生成的代码的包路径、作者名等信息。

  1. 分页查询:MyBatis-Plus 提供了一个非常方便的分页查询 API,可以通过 Page 对象来实现分页查询,例如:
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {@Overridepublic Page<User> listUsersByPage(int pageNum, int pageSize) {Page<User> page = new Page<>(pageNum, pageSize);QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.lambda().eq(User::getIsDeleted, false);return this.page(page, wrapper);}
}

上述代码会根据传入的 pageNum 和 pageSize 参数,查询对应的分页数据,并且使用 QueryWrapper 来构造查询条件。

  1. 条件构造器:MyBatis-Plus 提供条件构造器是 MyBatis-Plus 中的一个重要特性,它可以帮助我们在使用 MyBatis 进行数据库操作时更加方便地进行条件组合和查询。MyBatis-Plus 提供了三种类型的条件构造器:Wrapper、QueryWrapper 和 UpdateWrapper。

  2. Wrapper

Wrapper 是最基本的条件构造器,它提供了 where、and、or、in、notIn、eq、ne、gt、lt、ge、le、groupBy、orderBy 等方法,可以方便地构造查询条件,示例代码如下:

Wrapper<User> wrapper = new Wrapper<User>() {@Overridepublic String getSqlSegment() {return "where age > 18 and sex = 1 order by create_time desc";}
};
List<User> userList = userMapper.selectList(wrapper);
  1. QueryWrapper

QueryWrapper 继承自 Wrapper,增加了一些更加方便的方法,如 eq、ne、gt、ge、lt、le 等方法,可以更加方便地进行条件组合,示例代码如下:

QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
queryWrapper.gt("age", 18).eq("sex", 1).orderByDesc("create_time");
List<User> userList = userMapper.selectList(queryWrapper);
  1. UpdateWrapper

UpdateWrapper 也是继承自 Wrapper,它提供了一些更新操作的方法,如 set、setSql、inc、mul、like 等方法,可以方便地构造更新条件,示例代码如下:

UpdateWrapper<User> updateWrapper = new UpdateWrapper<User>();
updateWrapper.set("name", "Tom").eq("age", 20);
int count = userMapper.update(null, updateWrapper);

除了以上三种条件构造器,MyBatis-Plus 还提供了 LambdaQueryWrapper 和 LambdaUpdateWrapper 两种条件构造器,它们采用 Lambda 表达式的方式构造查询和更新条件,可以使代码更加简洁和易读。例如:

LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<User>();
lambdaQueryWrapper.gt(User::getAge, 18).eq(User::getSex, 1).orderByDesc(User::getCreateTime);
List<User> userList = userMapper.selectList(lambdaQueryWrapper);LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<User>();
lambdaUpdateWrapper.set(User::getName, "Tom").eq(User::getAge, 20);
int count = userMapper.update(null, lambdaUpdateWrapper);

总之,MyBatis-Plus 提供了强大的条件构造器功能,可以帮助我们更加方便地进行条件组合和查询操作,提高开发效率。

相关文章:

【热门框架】Mybatis-Plus入门介绍看这一篇文章就足够了

MyBatis-Plus 是在 MyBatis 的基础上进行了封装&#xff0c;提供了更加便捷的开发方式&#xff0c;具有简化开发、提高效率等优点。以下是 MyBatis-Plus 的一些特点和用法&#xff1a; 通用 CRUD 操作&#xff1a;MyBatis-Plus 提供了通用的 CRUD 接口&#xff0c;可以直接调用…...

Node【Node.js 20】新特性

文章目录 &#x1f31f;前言&#x1f31f;Node.js 20: 一次重要的升级和改进&#x1f31f;Internationalization API Update&#x1f31f;端口管理器&#x1f31f;字符串处理&#x1f31f; 更好的调试工具&#x1f31f; Crypto模块的更新&#x1f31f;总结&#x1f31f;写在最后…...

前端程序员的职业发展规划与路线——ChatGPT的回答

文章目录 一、前端程序员的职业规划是&#xff1f;回答1&#xff1a; 作为一个前端开发程序员&#xff0c;您的职业发展路线可能如下&#xff1a;回答2&#xff1a;作为前端开发程序员&#xff0c;您的职业发展路线可能如下&#xff1a;回答3&#xff1a; 你的职业发展路线可能…...

AlgoC++第八课:手写BP

目录 手写BP前言1. 数据加载2. 前向传播3. 反向传播总结 手写BP 前言 手写AI推出的全新面向AI算法的C课程 Algo C&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考。 本次课程主要是手写 BP 代码 课程大纲可看下面的思维导图 1. 数据加载 我们首先来实现下MNIST…...

【Java笔试强训 27】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525; 不用加…...

java紫砂壶交易购物系统 mysql

网络紫砂壶可充通过色彩、图片、说明、设置动画加强了产品了宣传&#xff0c;大大达到了陶瓷业的“色型”要求。实现产品管理方便&#xff0c;起到立竿见影的效果&#xff0c;不用因为更改菜色而重新印刷。只要在后台鼠标轻轻一点&#xff0c;全线马上更新。采用B/S模式&#x…...

7-4 多态练习-计算面积

定义三个类&#xff0c;父类(抽象类)GeometricObject代表几何形状&#xff0c;子类Circle代表圆形&#xff0c;子类Rectangle代表矩形。具体属性和方法如下&#xff1a; 父类 &#xff08;抽象类&#xff09;GeometricObject 属性&#xff1a; private String color; private S…...

很佩服的一个Google大佬,离职了。。

这两天&#xff0c;科技圈又有一个突发的爆款新闻相信不少同学都已经看到了。 那就是75岁的计算机科学家Geoffrey Hinton从谷歌离职了&#xff0c;从而引起了科技界的广泛关注和讨论。 而Hinton自己也证实了这一消息。 提到Geoffrey Hinton这个名字&#xff0c;对于一些了解过…...

【Python习题集1】Python 语言基础知识

python习题 一、实验内容二、实验总结 一、实验内容 1、运用输入输出函数编写程序&#xff0c;将华氏温度转换成摄氏温度。换算公式&#xff1a;C(F-32)*5/9,其中C为摄氏温度&#xff0c;F为华氏温度。 &#xff08;1&#xff09;源代码&#xff1a; ffloat(input(输入华氏温…...

C语言进阶——数据在内存中的存储,你知道吗?

今天我们深度剖析数据在内存中的存储&#xff1a; 重点知识&#xff1a; 1、数据类型详细介绍 2、整形在内存中的存储&#xff1a;原码、反码、补码 3、大小端字节序介绍及判断 4、浮点型在内存中的存储解析 之前我们涉及关于这一部分的知识只是大致的进行讲解&#xff0…...

规则引擎----easy rules

一、规则引擎的作用 将复杂的if else判断剥离出来 二、使用 2.1、引入POM <!--easy rules核心库--><dependency><groupId>org.jeasy</groupId><artifactId>easy-rules-core</artifactId><version>3.3.0</version></depe…...

你手写过一把锁吗?你对轮询缓存怎么看?

当多个线程同时去操作一块内存的数据时如果不做一些限制&#xff0c;极其可能出现数据一致性问题。这时候&#xff0c;我们用一把锁锁住这块数据&#xff0c;持有钥匙者可以进入&#xff0c;不持有者等待钥匙用完再分配。所以在我看来啊&#xff0c;锁的本质就是一个标志位&…...

深入理解 spring-boot-starter-parent

目录 一、前言二、Maven继承三、分析spring-boot-starter-parent四、Maven单继承问题五、不继承spring-boot-starter-parent需要注意的 一、前言 在idea当中创建springboot项目的时候都会继承一个spring-boot-starter-parent作为父类&#xff0c;假如不继承我们的项目就不能使…...

基于SpringBoot的线上日志阅读器

软件特点 部署后能通过浏览器查看线上日志。支持Linux、Windows服务器。采用随机读取的方式&#xff0c;支持大文件的读取。支持实时打印新增的日志&#xff08;类终端&#xff09;。支持日志搜索。 使用手册 基本页面 配置路径 配置日志所在的目录&#xff0c;配置后按回车…...

【Leetcode -405.数字转换为十六进制数 - 409.最长回文串】

Leetcode Leetcode -405.数字转换为十六进制数Leetcode - 409.最长回文串 Leetcode -405.数字转换为十六进制数 题目&#xff1a;给定一个整数&#xff0c;编写一个算法将这个数转换为十六进制数。对于负整数&#xff0c;我们通常使用 补码运算 方法。 注意 : 十六进制中所有…...

剑指 Offer:003 前 n 个数字二进制中 1 的个数

题目&#xff1a; 给定一个非负整数 n&#xff0c;请计算 0 到 n 之间的每个数字的二进制表示中 1 的个数&#xff0c;并输出一个数组 示例&#xff1a; 1、 输入: n 2 输出: [0,1,1] 解释: 0 --> 0 1 --> 1 2 --> 10 2、 输入: n 5 输出: [0,1,1,2,1,2] 解释: 0 …...

DDD系列:二、应用架构设计演变

作用: ​ 通过规定一个固定的架构设计&#xff0c;可以让团队内有一个统一的开发规范&#xff0c;降低沟通成本&#xff0c;提升效率和代码质量。 目标&#xff1a; ​ 在做架构设计时&#xff0c;一个好的架构应该需要实现以下几个目标&#xff1a; 独立于UI&#xff1a;前…...

Spring-IOC

IOC概念和原理 什么是IOC 控制反转&#xff0c;为了将系统的耦合度降低&#xff0c;把对象的创建和对象直接的调用过程权限交给Spring进行管理。 IOC底层原理 XML解析 ​ 通过Java代码解析XML配置文件或者注解得到对应的类的全路径&#xff0c;获取对应的Class类 Class clazz …...

基于Java语言开发B/S架构实现的云HIS

一、云HIS系统框架简介 1、技术框架 &#xff08;1&#xff09;总体框架&#xff1a; SaaS应用&#xff0c;全浏览器访问 前后端分离&#xff0c;多服务协同 服务可拆分&#xff0c;功能易扩展 &#xff08;2&#xff09;技术细节&#xff1a; 前端&#xff1a;AngularNg…...

清洁赛道新势力,米博凭“减法”突围?

在五四青年节这个特殊的日子&#xff0c;方太旗下的高端智能清洁品牌“米博”发布了新一代无滚布洗地机7系列。 5月4日晚&#xff0c;米博以“减法生活&#xff0c;净请7代”为主题&#xff0c;举办了新品发布会。在发布会上&#xff0c;从小红书翻红的董洁作为方太集团米博产…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...