MybatisPlus框架入门级理解

这篇具有很好参考价值的文章主要介绍了MybatisPlus框架入门级理解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

快速入门

入门案例

使用MybatisPlus的基本步骤:
1.引入MybatisPlus的起步依赖
MybatisPlus官方提供了starter,其中集成了Mybatis和MybatisPlus的所有功能,并且实现了自动装配效果。因此,可以使用MybatisPlus的starter代替Mybatis的starter。
pom.xml

<!--mybatisplus依赖-->
<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>mybatis-plus-boot-starter</artifactId>
	<version>3.5.3.1</version>
</dependency>

2.自定义的Mapper继承MybatisPlus提供的BaseMapper接口

public interface UserMapper extends BaseMapper<User> {
}

MybatisPlus框架入门级理解,JavaWeb学习日志,数据库
3.在实体类上添加注解声明表信息
4.在application.yml中根据需要添加配置

注:如果application.yml没有显示绿叶,可以按照以下步骤进行添加:
File --> Project Structure --> Facets --> “+” Spring --> 右上角小绿叶 Customize Spring Boot --> 将项目中的application.yml添加进去即可

常见注解

MybatisPlus是如何获取实现CRUD的数据库信息的?

  • 默认以类名驼峰转下划线作为表名
  • 默认把名为id的字段作为主键
  • 默认把变量名驼峰转下划线作为表的字段名

MybatisPlus通过扫描实体类,并基于反射获取实体类信息作为数据库表信息。
MybatisPlus中比较常用的几个注解如下:

  • @TableName:用来指定表名

  • @TableId:用来指定表中的主键字段信息
    IdType枚举:
    AUTO:数据库自增长
    INPUT:通过set方法自行输入
    ASSIGN_ID:分配ID,接口IdentifierGenerator的方法nextId来生成id

  • @TableField:用来指定表中的普通字段信息
    使用场景:
    ①成员变量名与数据库字段名不一致
    ②成员变量名以is开头,且是布尔值
    ③成员变量名与数据库关键字冲突,如“order”,在@TableField中要用转义字符括起来
    ⑩成员变量不是数据库字段,@TableField(exist = false)

常用配置

MyBatisPlus的配置项继承了MyBatis原生配置和一些自己特有的配置。
application.yml

mybatis-plus:
	type-aliases-package: com.wmy.mp.domain.po  # 别名扫描包
	mapper-locations: "classpath*:/mapper/**/*.xml"  # Mapper.xml文件地址 默认值
	configuration:
		map-underscore-to-camel-case: true  # 是否开启下划线和驼峰的映射
		cache-enabled: false  # 是否开启二级缓存
	global-config:  # 全局配置 优先级低于局部的配置
		db-config:
			id-type: assign_id  # id为雪花算法生成
			update-strategy: not_null  # 更新策略:只更新非空字段

MybatisPlus官方文档

核心功能

条件构造器

MybatisPlus支持各种复杂的where条件,可以满足日常开发的所有需求。在MybatisPlus中BaseMapper接口是用来提供增删改查功能的,其中一些比较特殊的方法的参数都不再是简单的id,而是一个Wrapper类型的参数,所谓的Wrapper就是条件构造器,用以构造复杂的sql语句。Wrapper并不是一个简单的类,而是类似于Collection,具备一个复杂的继承体系。
MybatisPlus框架入门级理解,JavaWeb学习日志,数据库
比如说:
QueryWrapper就是在父类基础上拓展了select相关的功能,允许构造SQL语句时能指定select哪些字段;
UpdateWrapper就是在父类基础上拓展了set相关的功能,它的setSql(boolean , String ) : UpdateWrapper<T>方法允许将set部分的字符串当做参数传递进去,后边可以拼接到SQL语句中。
基于QueryWrapper的查询案例
需求
①查询出名字中带"o"的,存款大于等于1000元的人的id、username、info、balance字段。
SQL语句

SELECT id,username,info,balance
FROM user
WHERE username LIKE ? AND balance >= ?

QueryWrapper查询:UserMapperTest.java

@Test
void testQueryWrapper(){
	//1.构件查询条件
	QueryWrapper<User> wrapper = new QueryWrapper<User>()
		.select("id", "username", "info", "balance")
		.like("username", "o")
		.ge("balance", 1000);
	//2.查询
	List<User> users = userMapper.selectList(wrapper);
	users.forEach(System.out::println);
}

//或者
@Test
void testLambdaQueryWrapper(){
	//1.构件查询条件
	LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>()
		.select(User::getId, User::getUsername, User::getInfo, User::getBalance)
		.like(User::getUsername, "o")
		.ge(User::getBalance, 1000);
	//2.查询
	List<User> users = userMapper.selectList(wrapper);
	users.forEach(System.out::println);
}

加粗样式
②更新用户名为jack的用户的余额为2000。
SQL语句

UPDATE user
	SET balance = 2000
	WHERE (username = "jack")

QueryWrapper查询

@Test
void testUpdateByQueryWrapper() {
	//1.要更新的数据
	User user = new User();
	user.setBalance(2000);
	//2.更新的条件
	QueryWrapper<User> wrapper = new QueryWrapper<User>().eq("username", "jack");
	//3.执行更新
	userMapper.update(user, wrapper);
}

基于UpdateWrapper的更新案例
需求
更新id为1,2,4的用户的余额,扣200
SQL语句

UPDATE user
	SET balance = balance - 200
	WHERE id in (1, 2, 4)

UpdateWrapper查询:UserMapperTest.java

@Test
void testUpdateWrapper(){
	List<Long> ids = List.of(1L ,2L ,4L);
	UpdateWrapper<User> wrapper = new UpdateWrapper<User>()
		.setSql("balance = balance - 200")
		.in("id" , ids);
	userMapper.update(null , wrapper);
}

小结

  • QueryWrapper和LambdaQueryWrapper通常用来构建select、delete、update的where条件部分
  • UpdateWrapper和LambdaUpdateWrapper通常只有在set语句比较特殊才使用
  • 尽量使用LambdaQueryWrapper和LambdaUpdateWrapper,避免硬编码

自定义SQL

从条件构造器的学习中可以看出,虽然MybatisPlus提供了非常灵活的关于Where条件的SQL语句拼接方式,但是它是在业务逻辑层完成的,违背了企业开发的一些规范,如果不使用的话自己在xml文件中编写完整的SQL语句又会很麻烦。因此,我们可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,然后自定义SQL语句中剩下的部分。我们需要想一种办法把mp构建好的条件往下传递给mapper层,在xml中最终实现SQL语句的组装。
步骤
1.基于Wrapper构建where条件
UserMapperTest.java

@Test
void testCustomSqlUpdate() {
	//1.更新条件
	List<Long> ids = List.of(1L , 2L , 4l);
	int amount = 200;
	//2.定义条件
	QueryWrapper<User> wrapper = new QueryWrapper<User>().in("id" , ids);
	//3.调用自定义SQL方法
	userMapper.updateBalanceByIds(wrapper, amount);
}

2.在mapper方法参数中用Param注解声明wrapper变量名称,必须是ew
UserMapper.java

void updateBalanceByIds(@Param("ew") QueryWrapper<User> wrapper, @Param("amount") int amount);

3.自定义SQL,并使用Wrapper条件
UserMapper.xml

<update id="updateBalanceByIds">
	UPDATE tb_user SET balance = balance - #{amount} ${ew.customSqlSegment}
</update>

Service接口

Service接口类似于BaseMapper接口,包含了一些基本的增删改查的代码,跟BaseMapper相比,只多不少。
基本用法
MybatisPlus框架入门级理解,JavaWeb学习日志,数据库
自定义接口需要实现IService接口,自定义实现类需要继承IService的实现类ServiceImpl
IUserService.java

public interface IUserService extends IService<User>{
}

UserServiceImpl.java

@Service
public class UserServiceImpl extends IServiceImpl<UserMapper, User> implements IUserService {
}

批量新增
IUserServiceTest.java

//方式一:普通for循环插入 提交了100000次网络请求
@Test
void testSaveOneByOne(){
	long b = System.currentTimeMillis();
	for(int i = 1; i <= 100000 ; i++ ){
		userService.save(builderUser(i));
	}
	long e = System.currentTimeMillis();
	System.out.println("耗时:" + (e - b));
}

//方式二:IService的批量插入 每次批量插入1000条数据 插入100次即10万条数据
@Test
void testSaveBatch(){
	//1.准备一个容量为1000的集合
	List<User> list = new ArrayList<>(1000);
	long b = System.currentTimeMillis();
	for (int i = 1; i <= 100000 ; i++){
		//2.添加一个user
		list.add(buildUser(i));
		//3.每1000条批量插入一次
		if (i % 1000 == 0){
			userService.saveBatch(list);
			//4.清空集合 准备下一批数据
			list.clear();	
		}
	}
}

方式二相较于方式一,采用的是批处理的方式,速度快了近十倍,方拾贰需要向网络请求100次,但是由于在预编译的过程中,每次的1000条数据是被编译成了1000条SQL语句,所以MySQL在执行的过程中就是逐条执行的,所以方式二仍然有改进空间,可以通过配置jdbc参数,在application.yaml的url后面拼接上一个参数rewriteBatchedStatements=true,开启该参数之后,相当于把100000条插入语句变成了一个包含了100000条插入值的语句,只需要执行一次,速度上会快很多,这才是真正意义上的批处理。文章来源地址https://www.toymoban.com/news/detail-806816.html

到了这里,关于MybatisPlus框架入门级理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 详细理解(学习笔记) | DETR(整合了Transformer的目标检测框架) DETR入门解读以及Transformer的实操实现

    DETR ,全称 DEtection TRansformer,是Facebook提出的基于Transformer的端到端目标检测网络,发表于ECCV2020。 原文: 链接 源码: 链接 DETR 端到端目标检测网络模型,是第一个将 Transformer 成功整合为检测pipline中心构建块的目标检测框架模型。基于Transformers的端到端目标检测,没有NMS后

    2024年02月04日
    浏览(56)
  • Java框架学习(二)SSM体系:Spring、SpringMVC、MybatisPlus

    在原始的分层架构实现中,负责响应请求的Controller层依赖于业务逻辑处理的Service层,而业务逻辑处理的service层又依赖与数据访问Dao层。上下层间相互依赖耦合,耦合的缺陷在于牵一发而动全身,不利于后期维护拓展。 为了分层解耦,Spring采用IoC控制反转和DI依赖注入,来解

    2024年02月11日
    浏览(51)
  • 课程《JavaWeb基础框架程序设计》考试题下篇——数据库与表单操作用题(人事管理平台的添加员工档案信息的操作题)

    这篇文章是大学课程《JavaWeb基础框架程序设计》考试题目的内容,包括了原题和答案。题目只包括了三道编程题,分值为30分、30分和40分,这篇文章继上一篇(课程《JavaWeb基础框架程序设计》考试题上篇——基础应用题(计算应用、水仙花数)),介绍40分的那题,以及代码

    2024年02月04日
    浏览(62)
  • 狂神Javaweb完整版基础入门(IDEA版)值得学习的JavaWeb教程

    Java web web开发: web,网页的意思,www.baidu.com 静态web html,css 提供给所有人看的数据始终不会发生变化! 动态web 淘宝,几乎是所有的网站 提供给所有的人看的数据始终会变化,每个人在不同的时间,不同的地点看到不同的信息 技术栈:Servlet/Jsp,ASP,PHP 在Java中,动态web资

    2024年02月06日
    浏览(55)
  • Spring日志完结篇,MyBatis操作数据库(入门)

    目录 Spring可以对日志进行分目录打印 日志持久化(让日志进行长期的保存) MyBatis操作数据库(优秀的持久层框架) MyBatis的写法 开发规范: 单元测试的写法 传递参数 他的意思是说spring相关只打印INFO级别的标准,但是他也能获取到debug级别的日志 日志设置颜色(只能控制控制

    2024年02月04日
    浏览(38)
  • 【JavaWeb】入门一篇就够了—学习笔记整理

    ⭐⭐⭐⭐⭐⭐ Github主页👉https://github.com/A-BigTree 笔记链接👉https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以,麻烦各位看官顺手点个star~😊 如果文章对你有所帮助,可以点赞👍收藏⭐支持一下博主~😆 顺着尚硅谷的资料一路学习过来的,整理了JavaWeb基础篇的内容,

    2023年04月10日
    浏览(59)
  • Logback是最好用的日志框架吗?Logback快速入门

    日志技术可以将系统执行的信息选择性的记录到指定的位置(控制台、文件中、数据库中)。随时以开关的形式控制是否记录日志,无需修改源代码,就可以取消或者记录信息。并且牛人或者第三方公司已经做好的日志记录实现代码,开发者可以直接拿来使用。 常见的日志框架

    2024年02月07日
    浏览(45)
  • 【javaweb】学习日记Day4 - Maven 依赖管理 Web入门

    目录 一、Maven入门 - 管理和构建java项目的工具 1、IDEA如何构建Maven项目 2、Maven 坐标 (1)定义 (2)主要组成 3、IDEA如何导入和删除项目 二、Maven - 依赖管理 1、依赖配置 2、依赖传递 (1)查看依赖  (2)排除依赖 3、依赖范围 三、Web 入门 1、Springboot web入门体验 2、HTTP简述

    2024年02月11日
    浏览(53)
  • 【javaweb】学习日记Day3 - Ajax 前后端分离开发 入门

    目录 一、Ajax 1、简介 2、Axios (没懂 暂留) (1)请求方式别名 (2)发送get请求 (3)发送post请求 (4)案例 二、前端工程化 1、Vue项目-目录结构 2、Vue项目-启动 (1)vscode页面启动 (2)cmd命令框启动 3、配置Vue端口号 4、Vue项目开发流程 三、Vue组件库 - Element  1、快速入门

    2024年02月12日
    浏览(37)
  • JavaWeb登录注册系统/界面(邮箱验证码,数据库连接,详细注释,可作结课作业,可用于学习,可接入其他主系统)

    目录 1、致谢 2、前言 3、系统实机演示 4、系统分析与设计 (1)主要软件与工具 (2)系统分析 (3)系统规划 5、系统设计与构建 (1)JavaWeb创建 (2)JavaWeb运行 (3)先期依赖准备: 6、代码与关键注释、文件简析 (1)数据库 (2)前端 index.jsp和styleIndex.css: forgetPassword

    2024年02月08日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包