目录

一简介

1、什么是Mybatis-plus

2、特性

二、SpringBoot与Mybatis-plus整合之入门demo

1、引入pom

2、application.yml配置

3、主启动类

 4、测试

entity层

Mapper层

Service和ServiceImpl层

controller测试

三、Mybatis-plus核心注解

@TableName

@TableId

@TableField

@KeySequence  

 四、Mybatis-Plus之分页插件

1、config配置

2、 分页的使用

2.1、mybaits-plus自带的分页查询

2.2、自定义分页

2.2.1、自定义mapper接口

2.2.2、service实现自定义分页

五、Mybatis-plus逆向工程


一简介

1、什么是Mybatis-plus

Mybatis-Plus(简称MP)是一个Mybatis的增强工具,只是在Mybatis的基础上做了增强却不做改变,MyBatis-Plus支持所有Mybatis原生的特性,所以引入Mybatis-Plus不会对现有的Mybatis构架产生任何影响。MyBatis 增强工具包,简化 CRUD 操作。启动加载 XML 配置时注入单表 SQL 操作 ,为简化开发工作、提高生产率而生。

官网:https://baomidou.com

2、特性

  • 无侵入: 只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小: 启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防误操作

二、SpringBoot与Mybatis-plus整合之入门demo

依赖>配置>代码

1、引入pom

<!--        引入mybatisPlus 包含了 jdbc -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
<!--        mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--        引入durid數據源-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.18</version>
        </dependency>

 

2、application.yml配置

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  #日志
    map-underscore-to-camel-case: true  #开启驼峰命名
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    username: 自己的用户名
    password: 自己的密码
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost/cardmanager

3、主启动类

@SpringBootApplication
//注意:扫描包路径必须要精确到Mapper包,否则报异常
@MapperScan(basePackages = "扫描自己的mapper路径")
public class SpringBootThree {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootThree.class,args);
    }
}

 4、测试

entity层


public class User {
    @TableId(type = IdType.AUTO)
    private Long id;

    private String name;

    private String password;

    private String username;

    public User() {
    }

    public User(Long id, String name, String password, String username) {
        this.id = id;
        this.name = name;
        this.password = password;
        this.username = username;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", password='" + password + '\'' +
                ", username='" + username + '\'' +
                '}';
    }
}

Mapper层

BaseMapper<T>是mybatis-plus设计的一个接口,里面包含了单表的CRUD,用起来非常方便.

<T>表示实体类

@Repository
public interface UserMapper  extends BaseMapper<User>{

}

Service和ServiceImpl层

IService<T>和ServiceIMpl<M extends BaseMapper<T>,T> 是对BaseMapper的进一步封装,一般很少用。但是很方便。

public interface UserService extends IService<User>{

}

 


//impl层
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    @Autowired
    UserMapper userMapper;

}

controller测试


@Controller

public class UserController {

 @Autowired
    UserService userService;

@RequestMapping("/test")
    public String TestUser(@RequestParam("id") Long id){

     
        User user = userService.getById(id);
           System.out.print(user)

    }
}

好!到上述是一个SpringBoot整合Myabtisplus的入门小案例。接下来才是主要的部分

三、Mybatis-plus核心注解

@TableName

  • 描述:表名注解,标识实体类对应的表
  • 使用位置:实体类
@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;

    private String name;

    private String password;

    private String username;
}
属性描述
value表名
keepGlobalPrefix是否保持使用全局的 tablePrefix 的值(当全局 tablePrefix 生效时)
resultMapxml 中 resultMap 的 id(用于满足特定类型的实体类对象绑定)

以上的属性,只有value比较常用,其他的看看就行

@TableId

  • 描述:主键注解
  • 使用位置:实体类主键字段
@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;

    private String name;

    private String password;

    private String username;
}
属性默认值描述
value""主键字段名
typeIdType.NONE制定主键类型

IdType    

  一般都是数据库自增,或者就是自己设置主键id

描述
AUTO数据库 ID 自增
NONE无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
ASSIGN_ID分配 ID(主键类型为 Number(Long 和 Integer)或 String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法)
ASSIGN_UUID分配 UUID,主键类型为 String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认 default 方法)

@TableField

  • 描述:字段注解(非主键)
@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;

    @TableField("t_name")
    private String name;

    @TableField("t_pwd")
    private String password;

     @TableField("t_username")
    private String username;
        
//表示是否为数据库字段,在进行mybatis-plus封装的CRUD时,不会携带这个字段进行数据库的查询
    @TableField(exist=false)
       //自定义类型
        private Dept dept;
}
属性默认值描述
value""数据库字段名
existtrue是否为数据库表字段
condition""字段 where 实体查询比较条件,有值设置则按设置的值为准,没有则为默认全局的 %s=#{%s}
update""字段 update set 部分注入,例如:当在version字段上注解update="%s+1" 表示更新时会 set version=version+1 (该属性优先级高于 el 属性)

上述表格中,只有前两个最常用,其他的看看就行,一般不用

@KeySequence  

  • 描述:序列主键策略 oracle
  • 属性:value、dbType
属性默认值描述
value""序列名
dbTypeDbType数据库类型,未配置默认使用注入 IKeyGenerator 实现,多个实现必须指定

好了,上述就是最常用的注解,如果想看更多前往官网地址:注解 | MyBatis-Plus (baomidou.com)

 四、Mybatis-Plus之分页插件

1、config配置

使用mybatis-plus的分页时,必须配置config,否者分页插件不生效

@Configuration
public class MyBaitsPlusConfig {

        //配置分页插件
        @Bean
        public MybatisPlusInterceptor mybatisPlusInterceptor() {
            MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
            //数据库类型是MySql,因此参数填写DbType.MYSQL
            interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
            return interceptor;
        }
}

2、 分页的使用

2.1、mybaits-plus自带的分页查询

@Service
public class UserServiceImpl extends UserImpl<UserMapper,User> implements UserService {
    @Autowired
    UserMapper userMapper;

    @Override
    public Page<User> memberList(Integer pageNum, User user) {
        /**
            在查询之前实例化Page<T>(当前页,每页显示的个数) 
            page实体类创建完成之后,会将你查询出来的结果封装到里边的records属性中
                使用getRecords()方法调用
           */
        Page<User> page = new Page<>(pageNum,5);

            //mybatis-plus自带的单表分页查询
            /**

            selectPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper)
                参数1:一个分页对象
                参数2:表示分页查询的条件,如果没有可以为null
        */
         userMapper.selectPage(page, null);

        /**-------带条件的分页查询-----
         QueryWrapper<User> queryWrapper =   new QueryWrapper<User>();
                queryWrapper.eq("数据库字段名称",对应传过来的实体类字段名称) //精准查询
                                //模糊查询
                            .like("数据库字段名称",对应传过来的实体类字段名称);
          userMapper.selectPage(page, queryWrapper);

            */
        return page;
    }
}

2.2、自定义分页

自定义分页的时候就涉及到了连表的查询,这个时候我们就要自己自定义分页!

2.2.1、自定义mapper接口

@Repository
public interface UserMapper extends BaseMapper<User> {
    //注意分页参数的分页,一定要在第一个参数
    Page<User> userList(IPage<User> page, @Param("user")User user);
}

//对应的xml文件自己写

2.2.2、service实现自定义分页

@Service
public class UserServiceImpl extends UserImpl<UserMapper,User> implements UserService {
    @Autowired
    UserMapper userMapper;

    @Override
    public Page<User> memberList(Integer pageNum, User user) {
        /**
            在查询之前实例化Page<T>(当前页,每页显示的个数) 
            page实体类创建完成之后,会将你查询出来的结果封装到里边的records属性中
                使用getRecords()方法调用
           */
        Page<User> page = new Page<>(pageNum,5);

         memberBrMapper.memberList(page, user);
        return page;
    }
}

五、Mybatis-plus逆向工程

#联合mybatisplus使用
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.1</version>
</dependency>
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.31</version>
</dependency>
public class FastAutoGeneratorTest {
public static void main(String[] args){

    FastAutoGenerator.create("jdbc:mysql://localhost:3306/自己的表名", 用户名, 密码)
            .globalConfig(builder -> {
                builder.author("wdc") // 设置作者
//                        .enableSwagger() // 开启 swagger 模式
                        .fileOverride() // 覆盖已生成文件
                        
                        .outputDir("D://springbootcards"); // 指定输出目录
            })

            .packageConfig(builder -> {
                builder.parent("com.atdession") // 设置父包名
                        .moduleName("springbootcards") // 设置父包模块名
                            .entity("entity") //都是设置名称的
                            .service("service")
                            .serviceImpl("service.impl")
                            .controller("controller")
                            .mapper("mapper")
                            .xml("mapper")
                        .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D://springbootcards")); // 设置mapperXml生成路径
            })
            .strategyConfig(builder -> {
                builder.addInclude("user","dept"); // 设置需要生成的表名
                     .serviceBuilder().formatServiceFileName("%sService");//设置去掉Service的前缀I
//                        .addTablePrefix("t_", "c_"); // 设置过滤表前缀
            })
            .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
            .execute();
}
}

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐