MybatisPlus从入门到精通-基础篇

1.概述

  1. MybatisPlus是一款Mybatis增强工具,用于简化开发,提高效率。 它在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
  2. 官网: [https://mp.baomidou.com/](https://mp.baomidou.com/)

2.快速入门

2.0 准备工作

①准备数据

  1. CREATE TABLE `user` (
  2. `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  3. `user_name` varchar(20) NOT NULL COMMENT '用户名',
  4. `password` varchar(20) NOT NULL COMMENT '密码',
  5. `name` varchar(30) DEFAULT NULL COMMENT '姓名',
  6. `age` int(11) DEFAULT NULL COMMENT '年龄',
  7. `address` varchar(100) DEFAULT NULL COMMENT '地址',
  8. PRIMARY KEY (`id`)
  9. ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
  10. insert into `user`(`id`,`user_name`,`password`,`name`,`age`,`address`) values (1,'ruiwen','123','瑞文',12,'山东'),(2,'gailun','1332','盖伦',13,'平顶山'),(3,'timu','123','提姆',22,'蘑菇石'),(4,'daji','1222','妲己',221,'狐山');

②创建SpringBoot工程

添加依赖
  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.5.0</version>
  5. </parent>
  6. <dependencies>
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-web</artifactId>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.projectlombok</groupId>
  13. <artifactId>lombok</artifactId>
  14. <optional>true</optional>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.springframework.boot</groupId>
  18. <artifactId>spring-boot-starter-test</artifactId>
  19. <scope>test</scope>
  20. </dependency>
  21. </dependencies>

创建启动类
  1. @SpringBootApplication
  2. public class SGApplication {
  3. public static void main(String[] args) {
  4. SpringApplication.run(SGApplication.class);
  5. }
  6. }

③准备实体类

  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. public class User {
  5. private Long id;
  6. private String userName;
  7. private String password;
  8. private String name;
  9. private Integer age;
  10. private String address;
  11. }

2.1 使用MybatisPlus

①添加依赖

  1. <dependency>
  2. <groupId>com.baomidou</groupId>
  3. <artifactId>mybatis-plus-boot-starter</artifactId>
  4. <version>3.4.3</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>mysql</groupId>
  8. <artifactId>mysql-connector-java</artifactId>
  9. </dependency>

②配置数据库信息

  1. spring:
  2. datasource:
  3. url: jdbc:mysql://localhost:3306/mp_db?characterEncoding=utf-8&serverTimezone=UTC
  4. username: root
  5. password: root
  6. driver-class-name: com.mysql.cj.jdbc.Driver

③创建Mapper接口

创建Mapper接口继承BaseMapper接口

  1. public interface UserMapper extends BaseMapper<User> {
  2. }

BaseMapper接口中已经提供了很多常用方法。所以我们只需要直接从容器中获取Mapper就可以进行操作了,不需要自己去编写Sql语句。

④配置Mapper扫描

  1. 在启动类上配置我们的Mapper在哪个包。
  1. @SpringBootApplication
  2. @MapperScan("com.sangeng.mapper")
  3. public class SGApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(SGApplication.class,args);
  6. }
  7. }

⑤获取Mapper进行测试

  1. @SpringBootTest
  2. public class MPTest {
  3. @Autowired
  4. private UserMapper userMapper;
  5. @Test
  6. public void testQueryList(){
  7. System.out.println(userMapper.selectList(null));
  8. }
  9. }

3.常用设置

3.1 设置表映射规则

  1. 默认情况下MP操作的表名就是实体类的类名,但是如果表名和类名不一致就需要我们自己设置映射规则。

3.1.1 单独设置

  1. 可以在实体类的类名上加上@TableName注解进行标识。

例如:

  1. 如果表名是tb_user,而实体类名是User则可以使用以下写法。
  1. @TableName("tb_user")
  2. public class User {
  3. //....
  4. }

3.1.2 全局设置表名前缀

  1. 一般一个项目表名的前缀都是统一风格的,这个时候如果一个个设置就太麻烦了。我们可以通过配置来设置全局的表名前缀。

例如:

  1. 如果一个项目中所有的表名相比于类名都是多了个前缀: `tb_` 。这可以使用如下方式配置
  1. mybatis-plus:
  2. global-config:
  3. db-config:
  4. #表名前缀
  5. table-prefix: tb_

3.2 设置主键生成策略

3.2.0 测试代码

  1. @Test
  2. public void testInsert(){
  3. User user = new User();
  4. user.setUserName("三更草堂222");
  5. user.setPassword("7777");
  6. int r = userMapper.insert(user);
  7. System.out.println(r);
  8. }

3.2.1 单独设置

  1. 默认情况下使用MP插入数据时,如果在我们没有设置主键生成策略的情况下默认的策略是基于雪花算法的自增id
  2. 如果我们需要使用别的策略可以在定义实体类时,在代表主键的字段上加上`@TableId`注解,使用其`type`属性指定主键生成策略。

例如:

  1. 我们要设置主键自动增长则可以设置如下
  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. public class User {
  5. @TableId(type = IdType.AUTO)
  6. private Long id;
  7. //.....
  8. }
  1. 全部主键策略定义在了枚举类`IdType`中,`IdType`有如下的取值
  • AUTO
    数据库ID自增,依赖于数据库。该类型请确保数据库设置了 ID自增 否则无效
  • NONE
    未设置主键类型。若在代码中没有手动设置主键,则会根据主键的全局策略自动生成(默认的主键全局策略是基于雪花算法的自增ID)
  • INPUT
    需要手动设置主键,若不设置。插入操作生成SQL语句时,主键这一列的值会是null
  • ASSIGN_ID
    当没有手动设置主键,即实体类中的主键属性为空时,才会自动填充,使用雪花算法
  • ASSIGN_UUID
    当实体类的主键属性为空时,才会自动填充,使用UUID

3.2.2 全局设置

  1. mybatis-plus:
  2. global-config:
  3. db-config:
  4. # id生成策略 auto为数据库自增
  5. id-type: auto

3.3 设置字段映射关系

  1. 默认情况下MP会根据实体类的属性名去映射表的列名。
  2. 如果数据库的列表和实体类的属性名不一致了我们可以使用`@TableField`注解的`value`属性去设置映射关系。

例如:

  1. 如果表中一个列名叫 address 实体类中的属性名为addressStr则可以使用如下方式进行配置。
  1. @TableField("address")
  2. private String addressStr;

3.4 设置字段和列名的驼峰映射

  1. 默认情况下MP会开启字段名列名的驼峰映射, 即从经典数据库列名 A_COLUMN(下划线命名) 到经典 Java 属性名 aColumn(驼峰命名) 的类似映射
  2. 如果需要关闭我们可以使用如下配置进行关闭。
  1. mybatis-plus:
  2. configuration:
  3. #是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN(下划线命名) 到经典 Java 属性名 aColumn(驼峰命名) 的类似映射
  4. map-underscore-to-camel-case: false

3.5 日志

  1. 如果需要打印MP操作对应的SQL语句等,可以配置日志输出。

配置方式如下:

  1. mybatis-plus:
  2. configuration:
  3. # 日志
  4. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

4.基本使用

4.1 插入数据

  1. 我们可以使用insert方法来实现数据的插入。

示例:

  1. @Test
  2. public void testInsert(){
  3. User user = new User();
  4. user.setUserName("三更草堂333");
  5. user.setPassword("7777888");
  6. int r = userMapper.insert(user);
  7. System.out.println(r);
  8. }

4.2 删除操作

  1. 我们可以使用**deleteXXX**方法来实现数据的删除。

示例:

  1. @Test
  2. public void testDelete(){
  3. List<Integer> ids = new ArrayList<>();
  4. ids.add(5);
  5. ids.add(6);
  6. ids.add(7);
  7. int i = userMapper.deleteBatchIds(ids);
  8. System.out.println(i);
  9. }
  10. @Test
  11. public void testDeleteById(){
  12. int i = userMapper.deleteById(8);
  13. System.out.println(i);
  14. }
  15. @Test
  16. public void testDeleteByMap(){
  17. Map<String, Object> map = new HashMap<>();
  18. map.put("name","提姆");
  19. map.put("age",22);
  20. int i = userMapper.deleteByMap(map);
  21. System.out.println(i);
  22. }

4.3 更新操作

  1. 我们可以使用**updateXXX**方法来实现数据的删除。

示例:

  1. @Test
  2. public void testUpdate(){
  3. //把id为2的用户的年龄改为14
  4. User user = new User();
  5. user.setId(2L);
  6. user.setAge(14);
  7. int i = userMapper.updateById(user);
  8. System.out.println(i);
  9. }

5.条件构造器Wrapper

5.1 概述

  1. 我们在实际操作数据库的时候会涉及到很多的条件。所以MP为我们提供了一个功能强大的条件构造器 `Wrapper` 。使用它可以让我们非常方便的构造条件。
  2. 其继承体系如下:
  3. ![wrapper继承体系图.png](https://cdn.nlark.com/yuque/0/2022/png/25966321/1650038191014-6d582221-fba7-4e74-9558-304a66c21efc.png#clientId=ue2879023-0701-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u4729aafa&margin=%5Bobject%20Object%5D&name=wrapper%E7%BB%A7%E6%89%BF%E4%BD%93%E7%B3%BB%E5%9B%BE.png&originHeight=301&originWidth=483&originalType=binary&ratio=1&rotation=0&showTitle=false&size=10333&status=done&style=none&taskId=ue9f7662e-f8f6-408c-a787-0efc30cf10b&title=)
  4. 在其子类`AbstractWrapper`中提供了很多用于构造Where条件的方法。
  5. `AbstractWrapper`的子类`QueryWrapper`则额外提供了用于针对Select语法的`select`方法。可以用来设置查询哪些列。
  6. `AbstractWrapper`的子类`UpdateWrapper`则额外提供了用于针对SET语法的`set`方法。可以用来设置对哪些列进行更新。
  7. 完整的AbstractWrapper方法可以参照:[https://baomidou.com/guide/wrapper.html#abstractwrapper](https://baomidou.com/guide/wrapper.html#abstractwrapper)

介绍是用来干什么的。它的实现类有哪些

QueryWrapper,UpdateWrapper,【LambdaQueryWrapper】

5.2 常用AbstractWrapper方法

eq:equals,等于
gt:greater than ,大于 >
ge:greater than or equals,大于等于≥
lt:less than,小于<
le:less than or equals,小于等于≤
between:相当于SQL中的BETWEEN
like:模糊匹配。like(“name”,”黄”),相当于SQL的name like ‘%黄%’
likeRight:模糊匹配右半边。likeRight(“name”,”黄”),相当于SQL的name like ‘黄%’
likeLeft:模糊匹配左半边。likeLeft(“name”,”黄”),相当于SQL的name like ‘%黄’
notLike:notLike(“name”,”黄”),相当于SQL的name not like ‘%黄%’
isNull
isNotNull
and:SQL连接符AND
or:SQL连接符OR

in: in(“age”,{1,2,3})相当于 age in(1,2,3)

groupBy: groupBy(“id”,”name”)相当于 group by id,name

orderByAsc :orderByAsc(“id”,”name”)相当于 order by id ASC,name ASC

orderByDesc :orderByDesc (“id”,”name”)相当于 order by id DESC,name DESC

示例一

SQL语句如下:

  1. SELECT
  2. id,user_name,PASSWORD,NAME,age,address
  3. FROM
  4. USER
  5. WHERE
  6. age > 18 AND address = '狐山'

如果用Wrapper写法如下:

  1. @Test
  2. public void testWrapper01(){
  3. QueryWrapper wrapper = new QueryWrapper();
  4. wrapper.gt("age",18);
  5. wrapper.eq("address","狐山");
  6. List<User> users = userMapper.selectList(wrapper);
  7. System.out.println(users);
  8. }

示例二

SQL语句如下:

  1. SELECT
  2. id,user_name,PASSWORD,NAME,age,address
  3. FROM
  4. USER
  5. WHERE
  6. id IN(1,2,3) AND
  7. age BETWEEN 12 AND 29 AND
  8. address LIKE '%山%'

如果用Wrapper写法如下:

  1. @Test
  2. public void testWrapper02(){
  3. QueryWrapper<User> wrapper = new QueryWrapper<>();
  4. wrapper.in("id",1,2,3);
  5. wrapper.between("age",12,29);
  6. wrapper.like("address","山");
  7. List<User> users = userMapper.selectList(wrapper);
  8. System.out.println(users);
  9. }

示例三

SQL语句如下:

  1. SELECT
  2. id,user_name,PASSWORD,NAME,age,address
  3. FROM
  4. USER
  5. WHERE
  6. id IN(1,2,3) AND
  7. age > 10
  8. ORDER BY
  9. age DESC

如果用Wrapper写法如下:

  1. @Test
  2. public void testWrapper03(){
  3. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  4. queryWrapper.in("id",1,2,3);
  5. queryWrapper.gt("age",10);
  6. queryWrapper.orderByDesc("age");
  7. List<User> users = userMapper.selectList(queryWrapper);
  8. System.out.println(users);
  9. }

5.3 常用QueryWrapper方法

  1. QueryWrapper select 可以设置要查询的列。

示例一

select(String… sqlSelect) 方法的测试为要查询的列名

SQL语句如下:

  1. SELECT
  2. id,user_name
  3. FROM
  4. USER

MP写法如下:

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

示例二

select(Class entityClass, Predicate predicate)

方法的第一个参数为实体类的字节码对象,第二个参数为Predicate类型,可以使用lambda的写法,过滤要查询的字段 (主键除外) 。

SQL语句如下:

  1. SELECT
  2. id,user_name
  3. FROM
  4. USER

MP写法如下:

  1. @Test
  2. public void testSelect02(){
  3. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  4. queryWrapper.select(User.class, new Predicate<TableFieldInfo>() {
  5. @Override
  6. public boolean test(TableFieldInfo tableFieldInfo) {
  7. return "user_name".equals(tableFieldInfo.getColumn());
  8. }
  9. });
  10. List<User> users = userMapper.selectList(queryWrapper);
  11. System.out.println(users);
  12. }

示例三

select(Predicate predicate)

方法第一个参数为Predicate类型,可以使用lambda的写法,过滤要查询的字段 (主键除外) 。

SQL语句如下:

  1. SELECT
  2. id,user_name,PASSWORD,NAME,age
  3. FROM
  4. USER

就是不想查询address这列,其他列都查询了

MP写法如下:

  1. @Test
  2. public void testSelect03(){
  3. QueryWrapper<User> queryWrapper = new QueryWrapper<>(new User());
  4. queryWrapper.select(new Predicate<TableFieldInfo>() {
  5. @Override
  6. public boolean test(TableFieldInfo tableFieldInfo) {
  7. return !"address".equals(tableFieldInfo.getColumn());
  8. }
  9. });
  10. List<User> users = userMapper.selectList(queryWrapper);
  11. System.out.println(users);
  12. }

5.4 常用UpdateWrapper方法

  1. 我们前面在使用update方法时需要创建一个实体类对象传入,用来指定要更新的列及对应的值。但是如果需要更新的列比较少时,创建这么一个对象显的有点麻烦和复杂。
  2. 我们可以使用UpdateWrapperset方法来设置要更新的列及其值。同时这种方式也可以使用Wrapper去指定更复杂的更新条件。

示例

SQL语句如下:

  1. UPDATE
  2. USER
  3. SET
  4. age = 99
  5. where
  6. id > 1
  1. 我们想把id大于1的用户的年龄修改为99,则可以使用如下写法:
  1. @Test
  2. public void testUpdateWrapper(){
  3. UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
  4. updateWrapper.gt("id",1);
  5. updateWrapper.set("age",99);
  6. userMapper.update(null,updateWrapper);
  7. }

5.5 Lambda条件构造器

  1. 我们前面在使用条件构造器时列名都是用字符串的形式去指定。这种方式无法在编译期确定列名的合法性。
  2. 所以MP提供了一个Lambda条件构造器可以让我们直接以实体类的方法引用的形式来指定列名。这样就可以弥补上述缺陷。

示例

要执行的查询对应的SQL如下

  1. SELECT
  2. id,user_name,PASSWORD,NAME,age,address
  3. FROM
  4. USER
  5. WHERE
  6. age > 18 AND address = '狐山'

如果使用之前的条件构造器写法如下

  1. @Test
  2. public void testLambdaWrapper(){
  3. QueryWrapper<User> queryWrapper = new QueryWrapper();
  4. queryWrapper.gt("age",18);
  5. queryWrapper.eq("address","狐山");
  6. List<User> users = userMapper.selectList(queryWrapper);
  7. }

如果使用Lambda条件构造器写法如下

  1. @Test
  2. public void testLambdaWrapper2(){
  3. LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
  4. queryWrapper.gt(User::getAge,18);
  5. queryWrapper.eq(User::getAddress,"狐山");
  6. List<User> users = userMapper.selectList(queryWrapper);
  7. }

6.自定义SQL

  1. 虽然MP为我们提供了很多常用的方法,并且也提供了条件构造器。但是如果真的遇到了复制的SQL时,我们还是需要自己去定义方法,自己去写对应的SQL,这样SQL也更有利于后期维护。
  2. 因为MP是对mybatis做了增强,所以还是支持之前Mybatis的方式去自定义方法。
  3. 同时也支持在使用Mybatis的自定义方法时使用MP的条件构造器帮助我们进行条件构造。
  4. 接下去我们分别来讲讲。

6.0 准备工作

①准备数据

  1. CREATE TABLE `orders` (
  2. `id` bigint(20) NOT NULL AUTO_INCREMENT,
  3. `price` int(11) DEFAULT NULL COMMENT '价格',
  4. `remark` varchar(100) DEFAULT NULL COMMENT '备注',
  5. `user_id` int(11) DEFAULT NULL COMMENT '用户id',
  6. `update_time` timestamp NULL DEFAULT NULL COMMENT '更新时间',
  7. `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
  8. `version` int(11) DEFAULT '1' COMMENT '版本',
  9. `del_flag` int(1) DEFAULT '0' COMMENT '逻辑删除标识,0-未删除,1-已删除',
  10. `create_by` varchar(100) DEFAULT NULL COMMENT '创建人',
  11. `update_by` varchar(100) DEFAULT NULL COMMENT '更新人',
  12. PRIMARY KEY (`id`)
  13. ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
  14. /*Data for the table `orders` */
  15. insert into `orders`(`id`,`price`,`remark`,`user_id`,`update_time`,`create_time`,`version`,`del_flag`,`create_by`,`update_by`) values (1,2000,'无',2,'2021-08-24 21:02:43','2021-08-24 21:02:46',1,0,NULL,NULL),(2,3000,'无',3,'2021-08-24 21:03:32','2021-08-24 21:03:35',1,0,NULL,NULL),(3,4000,'无',2,'2021-08-24 21:03:39','2021-08-24 21:03:41',1,0,NULL,NULL);

②创建实体类

  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. public class Orders {
  5. private Long id;
  6. /**
  7. * 价格
  8. */
  9. private Integer price;
  10. /**
  11. * 备注
  12. */
  13. private String remark;
  14. /**
  15. * 用户id
  16. */
  17. private Integer userId;
  18. /**
  19. * 更新时间
  20. */
  21. private LocalDateTime updateTime;
  22. /**
  23. * 创建时间
  24. */
  25. private LocalDateTime createTime;
  26. /**
  27. * 版本
  28. */
  29. private Integer version;
  30. /**
  31. * 逻辑删除标识,0-未删除,1-已删除
  32. */
  33. private Integer delFlag;
  34. }

6.1 Mybatis方式

①定义方法

  1. Mapper接口中定义方法
  1. public interface UserMapper extends BaseMapper<User> {
  2. User findMyUser(Long id);
  3. }

②创建xml

  1. 先配置xml文件的存放目录
  1. mybatis-plus:
  2. mapper-locations: classpath*:/mapper/**/*.xml
  1. 创建对应的xml映射文件

③在xml映射文件中编写SQL

  1. 创建对应的标签,编写对应的SQL语句
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
  3. <mapper namespace="com.sangeng.mapper.UserMapper">
  4. <select id="findMyUser" resultType="com.sangeng.domian.User">
  5. select * from user where id = #{id}
  6. </select>
  7. </mapper>

6.2 Mybatis方式结合条件构造器

  1. 我们在使用上述方式自定义方法时。如果也希望我们的自定义方法能像MP自带方法一样使用条件构造器来进行条件构造的话只需要使用如下方式即可。

①方法定义中添加Warpper类型的参数

添加Warpper类型的参数,并且要注意给其指定参数名。

  1. public interface UserMapper extends BaseMapper<User> {
  2. User findMyUserByWrapper(@Param(Constants.WRAPPER) Wrapper<User> wrapper);
  3. }

②在SQL语句中获取Warpper拼接的SQL片段进行拼接。

  1. <select id="findMyUserByWrapper" resultType="com.sangeng.domian.User">
  2. select * from user ${ew.customSqlSegment}
  3. </select>

注意:不能使用#{}应该用${}

7.分页查询

7.1 基本分页查询

①配置分页查询拦截器

  1. @Configuration
  2. public class PageConfig {
  3. /**
  4. * 3.4.0之前的版本
  5. * @return
  6. */
  7. /* @Bean
  8. public PaginationInterceptor paginationInterceptor(){
  9. return new PaginationInterceptor();
  10. }*/
  11. /**
  12. * 3.4.0之后版本
  13. * @return
  14. */
  15. @Bean
  16. public MybatisPlusInterceptor mybatisPlusInterceptor(){
  17. MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
  18. mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
  19. return mybatisPlusInterceptor;
  20. }
  21. }

②进行分页查询

  1. @Test
  2. public void testPage(){
  3. IPage<User> page = new Page<>();
  4. //设置每页条数
  5. page.setSize(2);
  6. //设置查询第几页
  7. page.setCurrent(1);
  8. userMapper.selectPage(page, null);
  9. System.out.println(page.getRecords());//获取当前页的数据
  10. System.out.println(page.getTotal());//获取总记录数
  11. System.out.println(page.getCurrent());//当前页码
  12. }

7.2 多表分页查询

  1. 如果需要在多表查询时进行分页查询的话,就可以在mapper接口中自定义方法,然后让方法接收Page对象。

示例

需求
  1. 我们需要去查询Orders表,并且要求查询的时候除了要获取到Orders表中的字段,还要获取到每个订单的下单用户的用户名。

准备工作

SQL准备
  1. SELECT
  2. o.*,u.`user_name`
  3. FROM
  4. USER u,orders o
  5. WHERE
  6. o.`user_id` = u.`id`

实体类修改

增加一个userName属性

  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. public class Orders {
  5. //省略无关代码
  6. private String userName;
  7. }

实现

①定义接口,定义方法

方法第一个测试定义成Page类型

  1. public interface OrdersMapper extends BaseMapper<Orders> {
  2. IPage<Orders> findAllOrders(Page<Orders> page);
  3. }

在xml中不需要关心分页操作,MP会帮我们完成。

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
  3. <mapper namespace="com.sangeng.mapper.OrdersMapper">
  4. <select id="findAllOrders" resultType="com.sangeng.domian.Orders">
  5. SELECT
  6. o.*,u.`user_name`
  7. FROM
  8. USER u,orders o
  9. WHERE
  10. o.`user_id` = u.`id`
  11. </select>
  12. </mapper>

然后调用方法测试即可

  1. @Autowired
  2. private OrdersMapper ordersMapper;
  3. @Test
  4. public void testOrdersPage(){
  5. Page<Orders> page = new Page<>();
  6. //设置每页大小
  7. page.setSize(2);
  8. //设置当前页码
  9. page.setCurrent(2);
  10. ordersMapper.findAllOrders(page);
  11. System.out.println(page.getRecords());
  12. System.out.println(page.getTotal());
  13. }

8.Service 层接口

  1. MP也为我们提供了Service层的实现。我们只需要编写一个接口,继承`IService`,并创建一个接口实现类继承`ServiceImpl`,即可使用。
  2. 相比于Mapper接口,Service层主要是支持了更多批量操作的方法。

8.1 基本使用

8.1.1 改造前

定义接口

  1. public interface UserService {
  2. List<User> list();
  3. }

定义实现类

  1. @Service
  2. public class UserServiceImpl implements UserService {
  3. @Autowired
  4. private UserMapper userMapper;
  5. @Override
  6. public List<User> list() {
  7. return userMapper.selectList(null);
  8. }
  9. }

8.1.2 改造后

接口

  1. public interface UserService extends IService<User> {
  2. }

实现类

  1. @Service
  2. public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {
  3. }

测试

  1. @Autowired
  2. private UserService userService;
  3. @Test
  4. public void testSeervice(){
  5. List<User> list = userService.list();
  6. System.out.println(list);
  7. }

8.2自定义方法

  1. public interface UserService extends IService<User> {
  2. User test();
  3. }
  1. @Service
  2. public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {
  3. @Autowired
  4. private OrdersMapper ordersMapper;
  5. @Override
  6. public User test() {
  7. UserMapper userMapper = getBaseMapper();
  8. List<Orders> orders = ordersMapper.selectList(null);
  9. User user = userMapper.selectById(3);
  10. //查询用户对于的订单
  11. QueryWrapper<Orders> wrapper = new QueryWrapper<>();
  12. wrapper.eq("user_id",3);
  13. List<Orders> ordersList = ordersMapper.selectList(wrapper);
  14. return user;
  15. }
  16. }

9.代码生成器

  1. MP提供了一个代码生成器,可以让我们一键生成实体类,Mapper接口,ServiceController等全套代码 。使用方式如下

①添加依赖

  1. <!--mybatisplus代码生成器-->
  2. <dependency>
  3. <groupId>com.baomidou</groupId>
  4. <artifactId>mybatis-plus-generator</artifactId>
  5. <version>3.4.1</version>
  6. </dependency>
  7. <!--模板引擎-->
  8. <dependency>
  9. <groupId>org.freemarker</groupId>
  10. <artifactId>freemarker</artifactId>
  11. </dependency>

②生成

  1. 修改相应配置后执行以下代码即可
  1. public class GeneratorTest {
  2. @Test
  3. public void generate() {
  4. AutoGenerator generator = new AutoGenerator();
  5. // 全局配置
  6. GlobalConfig config = new GlobalConfig();
  7. String projectPath = System.getProperty("user.dir");
  8. // 设置输出到的目录
  9. config.setOutputDir(projectPath + "/src/main/java");
  10. config.setAuthor("sangeng");
  11. // 生成结束后是否打开文件夹
  12. config.setOpen(false);
  13. // 全局配置添加到 generator 上
  14. generator.setGlobalConfig(config);
  15. // 数据源配置
  16. DataSourceConfig dataSourceConfig = new DataSourceConfig();
  17. dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/mp_db?characterEncoding=utf-8&serverTimezone=UTC");
  18. dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");
  19. dataSourceConfig.setUsername("root");
  20. dataSourceConfig.setPassword("root");
  21. // 数据源配置添加到 generator
  22. generator.setDataSource(dataSourceConfig);
  23. // 包配置, 生成的代码放在哪个包下
  24. PackageConfig packageConfig = new PackageConfig();
  25. packageConfig.setParent("com.sangeng.mp.generator");
  26. // 包配置添加到 generator
  27. generator.setPackageInfo(packageConfig);
  28. // 策略配置
  29. StrategyConfig strategyConfig = new StrategyConfig();
  30. // 下划线驼峰命名转换
  31. strategyConfig.setNaming(NamingStrategy.underline_to_camel);
  32. strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);
  33. // 开启lombok
  34. strategyConfig.setEntityLombokModel(true);
  35. // 开启RestController
  36. strategyConfig.setRestControllerStyle(true);
  37. generator.setStrategy(strategyConfig);
  38. generator.setTemplateEngine(new FreemarkerTemplateEngine());
  39. // 开始生成
  40. generator.execute();
  41. }
  42. }