有天上飞的概念, 就要有落地的实现
概念十遍不如代码一遍, 朋友, 希望你把文中所有的代码案例都敲一遍
先赞后看, 养成习惯
SpringBoot 图文教程系列文章目录
SpringBoot 图文教程 1「概念 + 案例 思维导图」「基础篇上」 https://mp.weixin.qq.com/s/phk6j3ChBP-kPtS2xZeEZg
SpringBoot 图文教程 2 - 日志的使用「logback」「log4j」 https://mp.weixin.qq.com/s/7Mw_xhFF4Q5NtdtcsHc67Q
SpringBoot 图文教程 3-「'初恋'情结」集成 Jsp https://mp.weixin.qq.com/s/BYzVg5NBcF_ou_PyX8ygag
SpringBoot 图文教程 4-SpringBoot 实现文件上传下载 https://mp.weixin.qq.com/s/6ctykPo3eDBEB7YsC0PAZw
SpringBoot 图文教程 5-SpringBoot 中使用 Aop https://mp.weixin.qq.com/s/17qMRlv_mUfwkcVD05Bh2g
SpringBoot 图文教程 6-SpringBoot 中过滤器的使用 https://mp.weixin.qq.com/s/r2BO4UMNRAw_REA6nNFLKw
SpringBoot 图文教程 7-SpringBoot 拦截器的使用姿势这都有 https://mp.weixin.qq.com/s/YpDhuOTpt1vjYjnhnK8YdQ
SpringBoot 图文教程 8 - SpringBoot 集成 MBG「代码生成器」 https://mp.weixin.qq.com/s/uGYO4fkw03Kxpfp_PIA8rQ
SpringBoot 图文教程 9-SpringBoot 导入导出 Excel 「Apache Poi」 https://mp.weixin.qq.com/s/BXfxhO5rFFg6XZQ0rZgGMg
SpringBoot 图文教程 10 - 模板导出 | 百万数据 Excel 导出 | 图片导出「easypoi」 https://mp.weixin.qq.com/s/8Yqfn27UCFP2lU3_IYb5AQ
前言
在使用 Mybatis 进行项目开发的时候, 最繁琐的事情就是实体类, dao 接口, mapper.xml 文件的编写, 几乎每个表都需要对应写一套, 并且大部分的工作量都在最基本的增删改查上. 如果表中的字段进行了修改, 那么实体类, mapper 文件甚至 dao 接口都要进行修改.
在之前的文章中介绍了 MBG(Mybatis 代码生成器) 的使用, 今天带来更进一步的简化 Mybatis 开发的工具 MybatisPlus, 后续还会有 通用 Mapper, 总有一款适合你.
MybatisPlus
MybatisPlus 可以认为一个 Mybatis 的外挂, 用了这个技术之后 可以不写 mapper 文件 可以不写 dao 接口中的方法 然后实现增删改查 分页查询 条件查询 等等
什么是 Mybatis Plus
MyBatis-Plus https://github.com/baomidou/mybatis-plus (简称 MP) 是一个 MyBatis http://www.mybatis.org/mybatis-3/ 的增强工具, 在 MyBatis 的基础上只做增强不做改变, 为简化开发, 提高效率而生.
在 MyBatis 的基础上只做增强不做改变
意味着 如果你导入了 Mybatisplus 的依赖 但是不想用 Mybatisplus 的方法 , 那么 不会影响到 Mybatis 的正常使用
官方文档: https://mp.baomidou.com/guide/crud-interface.html#page
MybatisPlus 的使用
集成项目
导入 Mybatisplus 的依赖
注意: 要首先删除 Mybatis 的依赖, 因为 Mybatisplus 中包含有 Mybatis 的依赖 不需要独立导入 容易 jar 包冲突
- <dependency>
- <groupId>com.baomidou</groupId>
- <artifactId>mybatis-plus-boot-starter</artifactId>
- <version>3.3.1.tmp</version>
- </dependency>
修改配置文件
通过 MybatisPlus 实现增删改查
教程新手向, 只讲解 Mybatis 最常用, 最基本的 API, 更多的操作请参考官方文档
demo 使用到的数据库库表如下
给要数据库操作的实体类加 Mybatisplus 的注解
因为 Mybatisplus 不需要写 mapper 文件 不需要写 sql 那么 Mybatisplus 怎么知道实体类和数据库表映射关系 (ORM) 通过注解表明这种关系
- /**
- * @TableName("cmfz_admin") 将当前的实体类和数据库的表建立联系
- * 注解参数: 表名
- */
- @TableName("cmfz_admin")
- @Data
- public class CmfzAdmin implements Serializable {
- /**
- * 主键属性 @TableId
- *
- * value 该属性对应的数据库表中的字段名
- * type 主键自增的类型 AUTO 代表自动递增
- */
- @TableId(value = "id",type = IdType.AUTO)
- private Integer id;
- /**
- * 非主键属性 @TableField
- * @TableField("username") 参数为该属性对应的数据库表中的字段名
- *
- */
- @TableField("username")
- private String username;
- @TableField("password")
- private String password;
- }
创建 dao 接口
- import com.baizhi.entity.CmfzAdmin;
- import com.baomidou.mybatisplus.core.mapper.BaseMapper;
- /**
- * 注意:
- * 1. 接口中不需要写方法
- * 2. 接口需要继承 MybatisPlus 中的类 BaseMapper 泛型为 当前 dao 对应的实体类
- */
- public interface CmfzAdminDao extends BaseMapper<CmfzAdmin> {
- }
直接使用 Mybatisplus 的方法 开始增删改查
- @Test
- public void contextLoads() {
- // 根据 id 查询
- CmfzAdmin cmfzAdmin = cmfzAdminDao.selectById(1);
- // System.out.println(cmfzAdmin);
- // 查询所有 selectList(null);
- List<CmfzAdmin> cmfzAdmins = cmfzAdminDao.selectList(null);
- for (CmfzAdmin admin : cmfzAdmins) {
- System.out.println(admin);
- }
- }
- /**
- * 添加
- */
- @Test
- public void test1(){
- // 创建一个对象
- CmfzAdmin cmfzAdmin = new CmfzAdmin();
- cmfzAdmin.setUsername("hhhh");
- cmfzAdmin.setPassword("123456");
- // 添加 返回值是成功的条数
- int insert = cmfzAdminDao.insert(cmfzAdmin);
- System.out.println(insert);
- }
- /**
- * 将 id 为 5 的管理员名字修改为 lisi
- */
- @Test
- public void test2(){
- CmfzAdmin cmfzAdmin = new CmfzAdmin();
- cmfzAdmin.setId(5);
- cmfzAdmin.setUsername("lisi");
- // 根据 id 更新数据
- int i = cmfzAdminDao.updateById(cmfzAdmin);
- // 删除
- /**
- * deleteById() 根据 id 删除
- * deleteBatchIds() 批量删除 参数是要删除的 id 的集合
- */
- }
实现条件查询 (条件构造器的使用)
- /**
- * 要查询名字有 zhangsan 的管理员的信息
- */
- @Test
- public void test4(){
- /**
- * selectOne 查询一个方法
- *
- * selectOne 需要一个 Wrapper 对象 实际上是需要一个条件
- *
- * 条件是 查询名字为 zhangsan 管理员
- * sql where username = zhangsan
- * 需要 把 sql 的条件 封装到 Wrapper 对象 对象中
- * 将封装了条件的对象 给 selectOne
- *
- * Wrapper 对象 条件构造器 将 sql 的条件 写入到 Java 对象中
- * QueryWrapper 查询条件构造器
- * UpdateWrapper 更新的条件构造器
- */
- // 1. 创建一个条件构造器 泛型 为要查询数据的实体类类型
- QueryWrapper<CmfzAdmin> queryWrapper = new QueryWrapper<>();
- // 2. 将 where username = zhangsan 等值查询 这个条件封装到 条件构造器
- // username = zhangsan ---》 eq("username","zhangsan") 参数 1 字段名 参数 2 要查询的值
- queryWrapper.eq("username","zhangsan");
- // 3. 通过条件构造器 查询
- CmfzAdmin cmfzAdmin = cmfzAdminDao.selectOne(queryWrapper);
- System.out.println(cmfzAdmin);
- }
- /**
- * 查询 名字为 lisi 或者 密码为 123456 的管理员
- *
- * sql username = lisi or password = 123456
- *
- * or 和 and 怎么构建?
- * eq("id",1).or().eq("name","老王")--->id = 1 or name = '老王'
- */
- @Test
- public void test5(){
- // 1. 创建条件构造器
- QueryWrapper<CmfzAdmin> queryWrapper = new QueryWrapper<>();
- // 2. 构造条件 条件构造器的方法的第一个参数基本上都是字段名
- queryWrapper.eq("username","lisi").or().eq("password","123456");
- // 3. 查询
- /**
- * 批量查询 selectList() 方法中如果参数是 null 就是查询所有
- */
- List<CmfzAdmin> cmfzAdmins = cmfzAdminDao.selectList(queryWrapper);
- for (CmfzAdmin cmfzAdmin : cmfzAdmins) {
- System.out.println(cmfzAdmin);
- }
- }
条件修改: 把用户名为 zhangsan 的管理员密码修改为 123456
- /**
- * 用法和查询类似
- * 把用户名为 zhangsan 的管理员密码修改为 123456
- *
- */
- @Test
- public void test6(){
- // 1. 创建条件构造器
- UpdateWrapper<CmfzAdmin> updateWrapper = new UpdateWrapper<>();
- // 2. 构造条件
- // where username = zhangsan
- // set password = 123456
- updateWrapper.set("password","123123");
- updateWrapper.eq("username","zhangsan");
- // 3. 使用方法修改
- /**
- * update
- * 参数 1 一个管理员对象 可以直接写 null
- * 参数 2 条件构造器
- */
- cmfzAdminDao.update(null,updateWrapper);
- }
实现分页查询
配置分页插件 配置在启动类中即可
- @Bean
- public PaginationInterceptor paginationInterceptor() {
- PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
- // 设置请求的页面大于最大页后操作, true 调回到首页, false 继续请求 默认 false
- // paginationInterceptor.setOverflow(false);
- // 设置最大单页限制数量, 默认 500 条,-1 不受限制
- // paginationInterceptor.setLimit(500);
- // 开启 count 的 join 优化, 只针对部分 left join
- paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
- return paginationInterceptor;
- }
直接在代码可以使用分页查询
- /**
- * 测试分页查询
- *
- * 获取第二页的数据 (页码) 每页显示两条 (size)
- */
- @Test
- public void test7(){
- // 1. 创建一个 page 对象 封装分页数据
- /**
- * 创建对象的时候 直接写入分页数据
- * 参数 1 页码
- * 参数 2 每页条数
- */
- Page<CmfzAdmin> adminPage = new Page<>(2,2);
- // 2. 使用分页查询的方法
- /**
- * 分页查询的方法 selectPage()
- * 参数 1 IPage 分页对象 封装分页信息 封装获取第二页的数据 (页码) 每页显示两条 (size)
- * 参数 2 条件构造器 可以直接写 null
- */
- Page<CmfzAdmin> cmfzAdminPage = cmfzAdminDao.selectPage(adminPage, null);
- // 3. 从 Page 对象中获取查询到的数据
- /**
- * getRecords() 获取查询结果
- * getTotal() 总条数
- */
- System.out.println("总条数:"+cmfzAdminPage.getTotal());
- List<CmfzAdmin> adminList = cmfzAdminPage.getRecords();
- for (CmfzAdmin cmfzAdmin : adminList) {
- System.out.println(cmfzAdmin);
- }
- }
总结
Tips: 关于在 SpringBoot 项目中简化 Mybatis 的开发, 本教程提供三个技术 MBG,MybatisPlus, 通用 Mapper, 总有一款适合你.
恭喜你完成了本章的学习, 为你鼓掌! 如果本文对你有帮助, 请帮忙点赞, 评论, 转发, 这对作者很重要, 谢谢.
让我们再次回顾本文的学习目标
掌握 SpringBoot 中 MybatisPlus 的使用
要掌握 SpringBoot 更多的用法, 请持续关注本系列教程.
求关注, 求点赞, 求转发
来源: https://www.cnblogs.com/bingyang-py/p/12422725.html