java学习笔记----Mybatis-Plus
Mybatis-Plus
Mybatis-Plus是一个Mybatis的增强工具,在Mybatis的基础上只做增强不做改变,为了简化开发,提高效率而生
特性
重点说明:MP适用于单表操作,如果遇到多表操作,则手写SQL会效率更高
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
- 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
- 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
- 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
- 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
- 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
- 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
- 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
- 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
- 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
- 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
MP入门案例
注意事项
1.编辑pojo 添加注解 @tableName @tableId
2.实现接口继承BaseMapper
3.编辑YML文件配置信息 将mybatis改为mybatis-plus
导入jar包
说明:由于MP内部兼容了Mybatis则引入MP之后将原来的mybatis的依赖包删除。
删除mybatis的依赖包
<!--spring整合mybatis 暂时 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.4</version></dependency>
导入MP的依赖包
<!--spring整合mybatis-plus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis0plus-boot-starter</artifactId><version>3.4.2</version></dependency>
对象与表映射
继承公共的Mapper接口
修改YML配置文件
说明:springBoot应该由原来的Mybatis数据库连接转换成MP的数据库连接
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hRy9ylT6-1622599384584)(C:\Users\MTA\AppData\Roaming\Typora\typora-user-images\image-20210528113405293.png)]
编辑MP入门案例
对比Sql写法/MP写法的区别…
@SpringBootTest
public class TestMybatis {// sprign容器 <userMapper,代理对象>// 面向接口编程 扩展性好@Autowiredprivate UserMapper userMapper;//JDK动态代理//报错说明:com.jt.mapper.UserMapper.findAll 不匹配!!!!//关于测试类代码说明: 要求: public 返回值void 方法名称不能叫test@Testpublic void test01(){System.out.println(userMapper.getClass());List<User> userList = userMapper.findAll(); //接口的方法 数据库只能识别Sql语句System.out.println(userList);}//查询 用户的全部记录 面向对象的方式操作数据库.//只能用于单表查询@Testpublic void testFind(){//暂时不需要任何where条件 查询的是全部记录.List<User> userList = userMapper.selectList(null);System.out.println(userList);}
}
Mybatis CURD操作练习
编辑测试代码
@Testpublic void insert(){User user = new User();user.setName("星期五").setAge(18).setSex("男");userMapper.insertUser(user);System.out.println("新增用户成功");}//根据name="星期五",将name="星期六"@Testpublic void update(){String oldName = "星期五";String newName = "星期六";userMapper.updateByName(oldName,newName);System.out.println("更新用户成功");}//删除用户信息 根据name属性删除数据@Testpublic void delete(){String name = "星期六";userMapper.deleteByName(name);System.out.println("删除用户成功");}
编辑Mapper接口
@Insert("insert into demo_user(id,name,age,sex) " +"value (null,#{name},#{age},#{sex})")void insertUser(User user);@Update("update demo_user set name = #{newName} where name=#{oldName}")void updateByName(String oldName, String newName);//Mybatis中如果传递的参数只有一个,则名称任意 一般不用.@Delete("delete from demo_user where name=#{name}")void deleteByName(String name);
MP工作原理
1)通过注解 实现对象与表一一映射
2)通过属性注解 实现对象的属性与表中的字段一一映射
3)将公共的方法进行抽取,抽取到BaseMapper接口中
4)将用户操作的方法对象,转换为数据库能够识别的SQL语句
demo1:userMapper.insert(user对象)
SQL1:insert into 表名(字段名…) value(属性值…)
拼接过程:
insert into 表名(字段名…) value(属性值…)
1)通过userMapper 查找父级接口BaseMapper
2)根据BaseMapper 查找泛型对象 User对象
3)根据user对象 查找指定的注解 @TableName 获取表名
4)根据user对象 动态获取表中的字段 @TableField
5)在获取字段的同时 获取属性的值,最后进行SQL拼接
6)MP将拼接的SQL交给Mybaits框架处理执行
insert into demo|_user(id,name…) value(value1,value2…)
MP练习
根据ID查询
/*** 1.根据Id=23数据*/@Testpublic void select01(){User user = userMapper.selectById(23);System.out.println(user);}
对象查询
配置日志
/*** 查询 name="潘凤" sex="男"* 结果: 1项 userMapper.selectOne()* 多项 userMapper.selectList()* Sql: where name="xxx" and sex="xxx"* queryWrapper: 条件构造器 拼接where条件* 如果遇到多条件查询,则默认的连接符and* 方式1: 可以通过对象的方式进行控制*/@Testpublic void select02(){User user = new User();user.setName("潘凤").setSex("男");QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);//根据对象中不为null的属性 拼接where条件List<User> userList = userMapper.selectList(queryWrapper);System.out.println(userList);}
特殊字符练习
/*** 要求: age>18岁 or sex=男的用户* 转义字符: > gt, < lt , = eq* >= ge , <= le*/@Testpublic void select03(){QueryWrapper<User> queryWrapper = new QueryWrapper<>();//编辑的是数据库字段信息queryWrapper.gt("age", 18).or().eq("sex","男");//根据对象中不为null的属性 拼接where条件List<User> userList = userMapper.selectList(queryWrapper);System.out.println(userList);}
linke关键字
/*** 要求: 查询name中包含"精" 并且按照age 降序排列* Sql: like "%精%" 包含精* like "精%" 以精开头* like "%精" 以精结尾*/@Testpublic void select04(){QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.likeRight("name","精").orderByDesc("age");//根据对象中不为null的属性 拼接where条件List<User> userList = userMapper.selectList(queryWrapper);System.out.println(userList);}
In关键字
/*** 要求: 查询name中包含"精" 并且按照age 降序排列* Sql: like "%精%" 包含精* like "精%" 以精开头* like "%精" 以精结尾*/@Testpublic void select04(){QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.likeRight("name","精").orderByDesc("age");//根据对象中不为null的属性 拼接where条件List<User> userList = userMapper.selectList(queryWrapper);System.out.println(userList);}
不为Null查询
/*** 要求: 查询name中包含"精" 并且按照age 降序排列* Sql: like "%精%" 包含精* like "精%" 以精开头* like "%精" 以精结尾*/@Testpublic void select04(){QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.likeRight("name","精").orderByDesc("age");//根据对象中不为null的属性 拼接where条件List<User> userList = userMapper.selectList(queryWrapper);System.out.println(userList);}
动态SQL语句查询
/*** 要求: 查询name中包含"精" 并且按照age 降序排列* Sql: like "%精%" 包含精* like "精%" 以精开头* like "%精" 以精结尾*/@Testpublic void select04(){QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.likeRight("name","精").orderByDesc("age");//根据对象中不为null的属性 拼接where条件List<User> userList = userMapper.selectList(queryWrapper);System.out.println(userList);}
挑选字段查询
/*** 要求: 查询name中包含"精" 并且按照age 降序排列* Sql: like "%精%" 包含精* like "精%" 以精开头* like "%精" 以精结尾*/@Testpublic void select04(){QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.likeRight("name","精").orderByDesc("age");//根据对象中不为null的属性 拼接where条件List<User> userList = userMapper.selectList(queryWrapper);System.out.println(userList);}
MP更新操作
更新操作
@SpringBootTest
public class TestMP2 {@Autowiredprivate UserMapper userMapper;/*** 将ID=229的用户名称 改为六一儿童节*/@Testpublic void updateUser(){User user = new User();user.setId(229).setName("六一儿童节");//set name="xxx" where id = 229userMapper.updateById(user);}/*** 更新操作2* 将name="六一儿童节" 改为"端午节"* 参数说明:* 1.实体对象 封装修改后的数据 set结构* 2.UpdateWrapper 修改的条件构造器* Sql: update demo_user set name="端午节" where name="61"*/@Testpublic void updateUser2(){User user = new User();user.setName("端午节");UpdateWrapper updateWrapper = new UpdateWrapper();updateWrapper.eq("name", "六一儿童节");userMapper.update(user,updateWrapper);}
}
java学习笔记----Mybatis-Plus相关推荐
- 拉勾教育Java训练营学习感受/学习笔记--MyBatis
拉勾教育Java训练营学习感受/学习笔记–MyBatis 文章目录 拉勾教育Java训练营学习感受/学习笔记--MyBatis 1.普通jdbc操作流程以及问题 1.1 流程 1.2 问题 2.自定义 ...
- 初级Java学习笔记总结
java高并发解决方案: 1.页面静态:静态访问消耗的资源少 信息录入然后生成静态页面以供访问 2.数据库集群和库表散列 主-从数据库关 ...
- JAVA学习笔记(1)【基础知识】
JAVA学习笔记DAY_1 提示:关于java系列的内容只是本人在老师的指导下和自学过程中的一些学习笔记,如果存在错误敬请批评指正! 文章目录 JAVA学习笔记DAY_1 前言 一.Java语言未来的 ...
- java学习笔记11--Annotation
java学习笔记11--Annotation Annotation:在JDK1.5之后增加的一个新特性,这种特性被称为元数据特性,在JDK1.5之后称为注释,即:使用注释的方式加入一些程序的信息. j ...
- java学习笔记13--反射机制与动态代理
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...
- 准备写java学习笔记
准备写java学习笔记 java int 转载于:https://blog.51cto.com/cryingcloud/1975267
- Java学习笔记--StringTokenizer的使用
2019独角兽企业重金招聘Python工程师标准>>> Java Tips: 使用Pattern.split替代String.split String.split方法很常用,用于切割 ...
- java学习笔记12--异常处理
java学习笔记系列: java学习笔记11--集合总结 java学习笔记10--泛型总结 java学习笔记9--内部类总结 java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 j ...
- Java学习笔记(十)--控制台输入输出
输入输出 一.控制台输入 在程序运行中要获取用户的输入数据来控制程序,我们要使用到 java.util 包中的 Scanner 类.当然 Java 中还可以使用其他的输入方式,但这里主要讲解 Scan ...
- java学习笔记16--I/O流和文件
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input Output)流 IO流用来处理 ...
最新文章
- 【ES6】JS类的用法class
- [转]pragma comment的使用
- ASP.NET验证控件详细使用解释
- 减法公式运算法则_人教版数学七年级上册1.3.2有理数的减法视频讲解+知识点+同步练习...
- vue 动态添加class_前端开发:Vue项目实战-Music
- python开发自己的工具包_爬虫开发python工具包介绍 (4)
- java stringbuffer长度限制_Java中的String、StringBuffer和StringBuilder
- JavaScript实现 页面滚动图片加载
- word正在等候其他应用程序完成OLE操作
- php为首字母的词语,PHP提取中英文词语及数字首字母的简单示例
- 如何在WP模拟器中启动、暂停、重启应用
- tensorflow手动实现算法之二多元线性回归
- 通过串口波特率计算bit时间
- 微服务之核心架构思维
- 【计算机组成与系统结构】电子计算机的诞生
- 腾讯云云直播、云点播
- python修改像素
- CTFmisc图像题(zsteg取zip、压缩包重组、IDAT数据隐写、Markdown编写LaTeX、零宽字节隐写)
- Windows 修改hosts过滤小游戏
- 重新定义公司-谷歌是如何运营的 读书笔记+读后感
热门文章
- UnityEditor三自定义窗口 案例2
- 小米的新logo与戴森的吹风机
- 【js高级 Day3】深入理解原型的方式继承,借用构造函数继承,组合继承,拷贝继承
- VS2017报错 class “Cxxxx“没有成员“GetContextMenuManager“ “GetContextMenuManager“:不是“Cxxxx“的成员
- Nginx跳转到用户首页
- 天涯上拣来的爱情哲学
- 【C语言】 C 语言 关键字分析 ( 属性关键字 | 常量关键字 | 结构体关键字 | 联合体关键字 | 枚举关键字 | 命名关键字 | 杂项关键字)
- 2022-2027年中国缝制机械行业市场全景评估及发展战略规划报告
- oracle中常使用到的函数,Oracle经常使用到的函数
- 笔记本连不上路由器WiFi,可以连接手机热点,手机可以连接WiFi