当前位置:   article > 正文

三阶段--day03 SpringBoot整合Mybatis说明、mybatisplus及其用法_详细描述一下项目中,mybatis-plus、springboot、activiti工作流等技术框架

详细描述一下项目中,mybatis-plus、springboot、activiti工作流等技术框架的使用

目录

一、SpringBoot整合Mybatis说明

1、Mybatis介绍

2、ORM思想

3、SpringBoot整合Mybatis流程

4、 @SpringBootTest

 5、 Mybatis调用流程

二、MyBatisPlus

1、MP介绍

1.1 概念

 1.2 MP的特点

2、MP单表操作入门案例

2.1 导入jar包

2.2 在pojo类中配置对象关系映射(ORM)

 2.3 继承公共API接口

2.4 编辑YML配置文件

2.5 工具API测试 

2.6  配置文件application.yml中打印日志设置

3、MP实现原理

4、MP用法练习

4.1 根据ID查询

4.2 指定属性值查询--对象封装,条件构造器

4.3 特殊字符查询

4.4 like关键字模糊查询

4.5 order by排序查询

4.6 in关键字两种查询方式

4.7 字符串判断的API:StringUtils--org.springframework.util

4.8 MP的更新操作


一、SpringBoot整合Mybatis说明

1、Mybatis介绍

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
概括: MyBatis 是一款优秀的持久层框架,并且在内部整合的了JDBC,简化了用户操作数据库的过程.
Mybatis是一个半自动化的ORM映射框架,是因为mybatis只完成了要求查询的结果集可以自动的封装为对象 (读)这一步。

2、ORM思想


对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。如今已有很多免费和付费的ORM产品,而有些程序员更倾向于创建自己的ORM工具。
核心知识:
宗旨: 以对象的方式操作数据库
1. 要求查询的结果集可以自动的封装为对象 (读)
2. 利用对象封装数据,之后(自动)动态的生成Sql语句执行相关操作. (更新)

3、SpringBoot整合Mybatis流程


导入依赖jar包 数据库驱动/JDBC包/Spring整合Mybatis包
编辑application.yml文件 配置数据源/配置Spring整合Mybatis
编辑Mybatis 接口文件/编辑xxx.xml映射文件
通过@MapperScan为接口创建代理对象.


4、 @SpringBootTest


说明: 该注解是SpringBoot程序 为了简化后端代码测试 提供了专门的测试API.
关键点: 测试时需要Spring容器管理对象,同时将测试的对象获取 之后进行测试.
注意事项: 测试注解只能在测试包中运行.

在这里插入图片描述

 5、 Mybatis调用流程


1、Spring容器为接口创建代理对象. Spring容器启动对象立即创建

2、根据 @Autowired 注解动态注入Mapper接口的代理对象
3、用户通过Mapper接口调用方法.(执行业务操作)
4、Mybatis根据接口方法动态匹配xml的映射文件

  1. 根据Mapper的接口路径匹配xml映射文件中的 com.jt.mapper.UserMapper
  2. 根据接口的方法 匹配xml映射文件中的Sql ID 之后执行Sql语句

5、Mybatis将结果集封装为对象 之后返回.
 

二、MyBatisPlus

1、MP介绍

1.1 概念见百度百科

 1.2 MP的特点

  1. 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  2. 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  3. 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  4. 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  5. 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  6. 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  7. 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  8. 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  9. 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  10. 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  11. 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  12. 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
     

2、MP单表操作入门案例

核心思想: 利用对象操作数据库 单表查询几乎不写Sql

基于springboot整合mybatis案例进行Mp增强测试

2.1 导入jar包

说明:MybatisPlus对mybatis的增强(包含),所有jar包只需要导入MP的即可.原有的Mybatis需要删除.

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.5.2</version>
  5. <relativePath/>
  6. </parent>
  7. <properties>
  8. <java.version>1.8</java.version>
  9. <!--跳过测试类打包-->
  10. <skipTests>true</skipTests>
  11. </properties>
  12. <!--原则: 按需导入 -->
  13. <dependencies>
  14. <dependency>
  15. <groupId>org.springframework.boot</groupId>
  16. <!--springboot启动项(器)在包的内部SpringBoot
  17. 已经完成了项目的"整合"(配置) 用户拿来就用
  18. web导入SpringMVC
  19. -->
  20. <artifactId>spring-boot-starter-web</artifactId>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.springframework.boot</groupId>
  24. <artifactId>spring-boot-starter-test</artifactId>
  25. <scope>test</scope>
  26. </dependency>
  27. <!--支持热部署 -->
  28. <dependency>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-devtools</artifactId>
  31. </dependency>
  32. <!--添加lombok依赖-->
  33. <dependency>
  34. <groupId>org.projectlombok</groupId>
  35. <artifactId>lombok</artifactId>
  36. </dependency>
  37. <!--引入数据库驱动 有时要指定版本 -->
  38. <dependency>
  39. <groupId>mysql</groupId>
  40. <artifactId>mysql-connector-java</artifactId>
  41. <version>5.1.48</version>
  42. <scope>runtime</scope>
  43. </dependency>
  44. <!--springBoot数据库连接 -->
  45. <dependency>
  46. <groupId>org.springframework.boot</groupId>
  47. <artifactId>spring-boot-starter-jdbc</artifactId>
  48. </dependency>
  49. <!--导入MP包之后,删除原有的Mybatis的包 -->
  50. <dependency>
  51. <groupId>com.baomidou</groupId>
  52. <artifactId>mybatis-plus-boot-starter</artifactId>
  53. <version>3.4.3</version>
  54. </dependency>
  55. </dependencies>
  56. <build>
  57. <plugins>
  58. <plugin>
  59. <groupId>org.springframework.boot</groupId>
  60. <artifactId>spring-boot-maven-plugin</artifactId>
  61. <version>2.5.2</version>
  62. </plugin>
  63. </plugins>
  64. </build>

2.2 在pojo类中配置对象关系映射(ORM)

  1. package com.jt.pojo;
  2. import com.baomidou.mybatisplus.annotation.IdType;
  3. import com.baomidou.mybatisplus.annotation.TableField;
  4. import com.baomidou.mybatisplus.annotation.TableId;
  5. import com.baomidou.mybatisplus.annotation.TableName;
  6. import lombok.Data;
  7. import lombok.experimental.Accessors;
  8. import java.io.Serializable;
  9. /**对象关系映射配置:
  10. * 1、User对象需要与demo_user表绑定
  11. * 2、User对象中的属性与表中的字段一一绑定,@TableName,@TableId,@TableField*/
  12. @Data
  13. @Accessors(chain = true)
  14. @TableName(value = "demo_user")//相当于key=value,表名以表为准,严格区分大小写
  15. public class User implements Serializable {
  16. /*主键自增*/
  17. @TableId(type = IdType.AUTO)
  18. private Integer id;
  19. //如果属性名与字段同名(包括驼峰规则)可省略@TableField注解,不一样时一定要写
  20. //@TableField("name")
  21. private String name;
  22. //@TableField("age")
  23. private Integer age;
  24. //@TableField("sex")
  25. private String sex;
  26. }

 2.3 继承公共API接口

加泛型对象是为了使用泛型对象的类型User

在这里插入图片描述

2.4 编辑YML配置文件

找不到映射文件时进行强制加载全部映射文件:classpath*:/mybatis/*.xml 

在这里插入图片描述

2.5 工具API测试 

测试类执行增删改时,不需要在接口中和映射文件中写方法了,直接在测试类创建对象,用对象操作

  1. @SpringBootTest
  2. public class TestSpringBoot {
  3. @Autowired
  4. private UserMapper userMapper; //代理对象
  5. /**
  6. * 新增用户
  7. * Mybatis: 1.mapper接口 2.xml映射 Sql
  8. * MP: 调用接口方法
  9. */
  10. @Test
  11. public void testInsert(){
  12. User user = new User();
  13. user.setName("吴亦凡").setAge(30).setSex("男");
  14. //单表操作几乎不写Sql
  15. userMapper.insert(user);
  16. //UserMapper.insert(user);报错,类型调用只能调用静态方法
  17. }
  18. }

2.6  配置文件application.yml中打印日志设置

  1. server:
  2. port: 8090
  3. spring:
  4. datasource:
  5. driver-class-name: com.mysql.cj.jdbc.Driver
  6. url: jdbc:mysql://127.0.0.1:3306/jt?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
  7. username: root
  8. password: root
  9. #SpringBoot整合MP
  10. mybatis-plus:
  11. type-aliases-package: com.jt.pojo
  12. mapper-locations: classpath:/mybatis/*.xml
  13. configuration:
  14. map-underscore-to-camel-case: true
  15. # Mapper接口执行 打印Sql日志
  16. logging:
  17. level:
  18. com.jt.mapper: debug

控制台显示日志:

3、MP实现原理

1)用户执行User对象入库操作,userMapper.insert(user)

2)由于接口方法中需要传递泛型对象,则根据用户配置查找对应的泛型对象

3)根据用户的接口获取Mapper接口的父级接口BaseMapper<User>,根据BaseMapper中的泛型对象,获取信息User.calss类型

4)根据User.class动态获取@TableName(“demo_user”)获取对象对应的表名,之后通过@TableField(“name”)绑定与之对应的字段,至此对象与表完成了映射

5)根据上述的映射关系,动态的拼接SQL语句

例子: userMapper.insert(user对象) 如何转化Sql?
**insert into 表名(字段名…) values (属性值…)
insert into demo_user(id,name,age,sex) values (“吴xx”,xx,xx,xx)
**

6)MP将动态生成的Sql交给Mybatis执行最终实现数据入库操作!!!

4、MP用法练习

4.1 根据ID查询

  1. //1:根据id=1查询数据,id=主键
  2. @Test
  3. public void getUserById(){
  4. User user = userMapper.selectById(1);
  5. System.out.println(user);
  6. }

4.2 指定属性值查询--对象封装,条件构造器

配置文件中配置日志以便查看控制台sql语句:

在这里插入图片描述

  1. //2.name=“王昭君” 和sex=“女” 查询数据.
  2. @Test
  3. public void getUserByAS(){
  4. /*构造条件构造器,动态拼接where条件*/
  5. //1.先封装属性
  6. User user = new User();
  7. user.setName("王昭君").setSex("女");
  8. //2.根据对象中不为null的属性生成where条件,默认都是and 连接
  9. QueryWrapper queryWrapper = new QueryWrapper(user);
  10. List<User> list = userMapper.selectList(queryWrapper);
  11. System.out.println(list);
  12. }

4.3 特殊字符查询gt,lt,eq,ge,le

> gt,< lt, = eq
 >= ge,<= le

  1. /**3.根据age>18岁 or sex=“女” 查询数据
  2. * SQL语句:select * from demo_user where age>18 or sex="女"
  3. * 特殊字符包括:> gt,< lt, = eq
  4. * >= ge,<= le
  5. **/
  6. @Test
  7. public void getUserAS(){
  8. QueryWrapper<User> queryWrapper = new QueryWrapper();//加泛型可以连续.sql语句
  9. // queryWrapper.gt("age", 18)
  10. // .eq("sex", "女");
  11. //默认是and,如果是age>18 或者 sex="女",使用.or()
  12. queryWrapper.gt("age", 18)
  13. .or()
  14. .eq("sex", "女");
  15. List<User> userList = userMapper.selectList(queryWrapper);
  16. System.out.println(userList);
  17. }

4.4 like关键字模糊查询

  1. /**4.查询name中包含“君”字的数据
  2. * sql语句:select * from demo_user where name="%君%"*/
  3. @Test
  4. public void testLike(){
  5. QueryWrapper<User> queryWrapper = new QueryWrapper();
  6. //包含“君”,like
  7. queryWrapper.like("name", "君");
  8. //以“君”结尾likeleft,以“君”开头likeright
  9. //queryWrapper.likeLeft("name","君");
  10. //不包含“君”notlike
  11. //queryWrapper.notLike("name", "君");
  12. List<User> userList = userMapper.selectList(queryWrapper);
  13. System.out.println(userList);
  14. }

4.5 order by排序查询

orderByASc()升序,orderByDesc()降序

  1. /**5.查询age>18 的用户,按照年龄降序排列,如果年龄相同按照sex排列*/
  2. @Test
  3. public void testOrderBy(){
  4. QueryWrapper<User> queryWrapper = new QueryWrapper();
  5. queryWrapper.gt("age",18)
  6. .orderByDesc("age", "sex");
  7. List<User> userList = userMapper.selectList(queryWrapper);
  8. System.out.println(userList);
  9. }

4.6 in关键字两种查询方式

注意:
1)单表查询时,in和or效率相差不大         
2)多表查询时,建议使用or,性能更快
3)Object...叫作可变参数类型:
           1.可变参数类型的数据结构实质是一个数组
           2.定义可变参数类型时,必须位于方法参数的最后

方法1:条件构造器

  1. @Test
  2. public void getIn1(){
  3. QueryWrapper<User> queryWrapper = new QueryWrapper();
  4. queryWrapper.in("id",1,3,5,6,7);
  5. List<User> userList = userMapper.selectList(queryWrapper);
  6. System.out.println(userList);
  7. }

方法2:MP特殊方法调用,尽量使用对象类型,因为对象有方法可以被使用

  1. @Test
  2. public void getIn2(){
  3. Integer[] ids=new Integer[]{1,3,5,6,7};
  4. //将数组转为集合
  5. List<Integer> idsList = Arrays.asList(ids);
  6. List<User> userList = userMapper.selectBatchIds(idsList);
  7. System.out.println(userList);
  8. }

4.7 字符串判断的API:StringUtils--org.springframework.util

正常情况下where条件有多个条件时,如果第一条件为空,就不会执行整个where条件,现在加入字符串判断API,目的是where多条件有一个为空时能保证另外一个条件也能执行拼接where条件

1)不加判断时:

  1. @Test
  2. public void testSelectNS(){
  3. String name =null;
  4. String sex = "女";
  5. QueryWrapper<User> queryWrapper = new QueryWrapper();
  6. //判断是否有值
  7. // boolean nameFlag = StringUtils.hasLength(name);
  8. // boolean sexFlag = StringUtils.hasLength(sex);
  9. queryWrapper.eq("name","name")
  10. .eq("sex", sex);
  11. List<User> userList = userMapper.selectList(queryWrapper);
  12. System.out.println(userList);
  13. }

控制台的sql语句:结果是一个空数组

2)当加入字符串判断API时:

  1. /**7.根据name和sex 动态查询数据库
  2. * 动态sql实现:condition 参数
  3. * boolean类型 true:拼接where条件
  4. * false:不拼接整个where条件,但条件之前的sql语句还是执行
  5. *加入字符串判断的API:StringUtils--org.springframework.util
  6. *目的是where多条件有一个为空时能保证另外一个条件也能执行拼接where条件*/
  7. @Test
  8. public void testSelectNS(){
  9. String name =null;
  10. String sex = "女";
  11. QueryWrapper<User> queryWrapper = new QueryWrapper();
  12. //判断是否有值
  13. boolean nameFlag = StringUtils.hasLength(name);
  14. boolean sexFlag = StringUtils.hasLength(sex);
  15. queryWrapper.eq(nameFlag,"name",name)
  16. .eq(sexFlag,"sex", sex);
  17. List<User> userList = userMapper.selectList(queryWrapper);
  18. System.out.println(userList);
  19. }

控制台的sql语句:拼接有值的where条件进行查询

但是,当name和sex值都为空时,控制台的sql语句是:查询整个demo_user表

4.8 MP的更新操作

  1. @Test
  2. public void testUpdate(){
  3. User user = new User();
  4. user.setName("祝君好运").setAge(100);
  5. UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
  6. updateWrapper.eq("name","吴亦凡");
  7. int row = userMapper.update(user,updateWrapper);
  8. System.out.println(row);
  9. }
  10. // name="云英" sex="男" age="16"
  11. @Test
  12. public void testUpdateById(){
  13. User user = new User();
  14. user.setId(246).setName("云英").setSex("男").setAge(16);
  15. //where id=xxx, 其他不为null的属性当作set条件.
  16. userMapper.updateById(user);
  17. }
  18. //修改Id=x的数据,name=“云缨”,sex=“男”
  19. @Test
  20. public void testUpdateId(){
  21. User user = new User();
  22. user.setName("云缨").setSex("男").setAge(16);
  23. UpdateWrapper<User> updateWrapper = new UpdateWrapper();
  24. updateWrapper.eq("id", 235);
  25. userMapper.update(user, updateWrapper);
  26. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/41991
推荐阅读
相关标签
  

闽ICP备14008679号