Mybatis—Plus (2)—配置、条件构造器

2023-10-27

目录

一、配置

1.1 基本配置

1.1.1 configLocation

1.1.2 mapperLocations

1.1.3 typeAliasesPackage

1.2 进阶配置

1.2.1 mapUnderscoreToCamelCase

1.2.2 cacheEnabled

二、条件构造器

2.1 allEq

2.1.1 说明

2.1.2 测试用例

2.2 基本比较操作

2.3 模糊查询

2.4 排序

2.5 逻辑查询

2.6 select

三、ActiveRecord

3.1 快速开始AR

3.2 根据主键查询

3.3 新增数据

3.4 更新操作

3.5 删除操作

3.6 根据条件查询

四、插件

4.1 mybatis的插件机制

4.2 执行分析插件

4.3 性能分析插件

4.4 乐观锁插件

4.4.1 主要使用场景

4.4.2 插件配置

4.4.3 注解实体字段

4.4.4 测试

4.4.5 特别说明

五、Sql注入器

5.1 编写BaseMapper

5.2 编写MySqlInjector

5.3 编写FindAll

5.4 注册到Spring容器

5.5 测试

六、自动填充功能

6.1 添加@TableField注解

6.2 编写MyMetaObjectHandler

七、逻辑删除

7.1 修改表结构

7.2 配置

7.3 测试

八、通用枚举

8.1 修改表结构

8.2 定义枚举

8.3 配置

8.4 修改实体

8.5 测试

九、代码生成器

9.1 创建工程

9.2 代码

十、MybatisX快速开发插件


一、配置

在MP中有大量的配置,其中有一部分是Mybatis原生的配置,另一部分是MP的配置,详情:https://mybatis.plus/c onfig/

1.1 基本配置

1.1.1 configLocation

MyBatis 配置文件位置,如果您有单独的 MyBatis 配置,请将其路径配置到 configLocation 中。 MyBatis Configuration 的具体内容请参考MyBatis 官方文档

Spring Boot:

mybatis-plus.config-location = classpath:mybatis-config.xml

Spring MVC:

<bean id="sqlSessionFactory"
class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>

1.1.2 mapperLocations

MyBatis Mapper 所对应的 XML 文件位置,如果您在 Mapper 中有自定义方法(XML 中有自定义实现),需要进行该配置,告诉 Mapper 所对应的 XML 文件位置

Spring Boot:

 mybatis-plus.mapper-locations = classpath*:mybatis/*.xml

Spring MVC:

<bean id="sqlSessionFactory"
class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
    <property name="mapperLocations" value="classpath*:mybatis/*.xml"/>
</bean>

Maven 多模块项目的扫描路径需以 classpath*: 开头 (即加载多个 jar 包下的 XML 文件)

1.1.3 typeAliasesPackage

MyBaits 别名包扫描路径,通过该属性可以给包中的类注册别名,注册后在 Mapper 对应的 XML 文件中可以直接使 用类名,而不用使用全限定的类名(即 XML 中调用的时候不用包含包名)

 Spring Boot:

mybatis-plus.type-aliases-package = cn.itcast.mp.pojo

Spring MVC:

<bean id="sqlSessionFactory"
class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
    <property name="typeAliasesPackage"
value="com.baomidou.mybatisplus.samples.quickstart.entity"/>
</bean>

1.2 进阶配置

本部分(Configuration)的配置大都为 MyBatis 原生支持的配置,这意味着可以通过 MyBatis XML 配置文件的形式进行配置。

1.2.1 mapUnderscoreToCamelCase

  • 类型: boolean
  • 默认值: true

是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN(下划线命名) 到经典 Java 属 性名 aColumn(驼峰命名) 的类似映射

注意: 此属性在 MyBatis 中原默认值为 false,在 MyBatis-Plus 中,此属性也将用于生成最终的 SQL 的 select body 如果您的数据库命名符合规则无需使用 @TableField 注解指定数据库字段名

示例(SpringBoot):

#关闭自动驼峰映射,该参数不能和mybatis-plus.config-location同时存在
mybatis-plus.configuration.map-underscore-to-camel-case=false

1.2.2 cacheEnabled

  • 类型: boolean
  • 默认值: true

全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存,默认为 true

示例:

mybatis-plus.configuration.cache-enabled=false

二、条件构造器

在MP中,Wrapper接口的实现类关系如下:

 AbstractWrapper和AbstractChainWrapper是重点实现

说明: QueryWrapper(LambdaQueryWrapper) 和 UpdateWrapper(LambdaUpdateWrapper) 的父类 用于生成 sql 的 where 条件, entity 属性也用于生成 sql 的 where 条件 注意: entity 生成的 where 条件与 使用各个 api 生成 的 where 条件没有任何关联行为

2.1 allEq

2.1.1 说明

2.1.2 测试用例

    @Test
    public void testAllEq() {
        Map<String, Object> params = new HashMap<>();
        params.put("name", "李四");
        params.put("age", "20");
        params.put("password", null);


        QueryWrapper<User> wrapper = new QueryWrapper<>();
//        wrapper.allEq(params);
//        wrapper.allEq(params,false);
        wrapper.allEq((k, v) -> (k.equals("age") || k.equals("id")), params);

        List<User> users = this.userMapper.selectList(wrapper);
        for (User user : users) {
            System.out.println(user);
        }
    }

2.2 基本比较操作

  • eq: 等于 =
  • ne: 不等于 <>
  • gt: 大于 >
  • ge: 大于等于 >=
  • lt: 小于 <
  • le: 小于等于 <=
  • between: BETWEEN 值1 AND 值2
  • notBetween: NOT BETWEEN 值1 AND 值2
  • in: 字段 IN (value.get(0), value.get(1), ...)
  • notIn: 字段 NOT IN (v0, v1, ...)

测试用例:

    @Test
    public void testEq() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
//SELECT id,user_name,password,name,age,email FROM tb_user WHERE password = ? AND age >= ? AND name IN (?,?,?)
        wrapper.eq("password", "123456")
                .ge("age", 20)
                .in("name", "李四", "王五", "赵六");
        List<User> users = this.userMapper.selectList(wrapper);
        for (User user : users) {
            System.out.println(user);
        }
    }

2.3 模糊查询

  • like

        ○LIKE '%值%'

        ○例: like("name", "王") ---> name like '%王%'

  • notLike

        ○NOT LIKE '%值%'

        ○例: notLike("name", "王") ---> name not like '%王%'

  • likeLeft

        ○LIKE '%值'

        ○例: likeLeft("name", "王") ---> name like '%王'

  • likeRight

        ○LIKE '值%'

        ○例: likeRight("name", "王") ---> name like '王%'

测试用例:

    @Test
    public void testLike(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        //SELECT id,user_name,name,age,email AS mail FROM tb_user WHERE name LIKE ?
        //参数:%五(String)
        wrapper.likeLeft("name","五");
        List<User> users = this.userMapper.selectList(wrapper);
        for (User user : users) {
            System.out.println(user);
        }
    }

2.4 排序

  • orderBy

        ○排序:ORDER BY 字段, ...

        ○例: orderBy(true, true, "id", "name") ---> order by id ASC,name ASC

  • orderByAsc

        ○排序:ORDER BY 字段, ... ASC

        ○例: orderByAsc("id", "name") ---> order by id ASC,name ASC

  • orderByDesc

        ○排序:ORDER BY 字段, ... DESC

        ○例: orderByDesc("id", "name") ---> order by id DESC,name DESC

测试用例:

    @Test
    public void testOrderByAgeDesc() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        //按照年龄倒序排序
        //SELECT id,user_name,name,age,email AS mail FROM tb_user ORDER BY age DESC
        wrapper.orderByDesc("age");

        List<User> users = this.userMapper.selectList(wrapper);
        for (User user : users) {
            System.out.println(user);
        }
    }

2.5 逻辑查询

  • or

        ○拼接 OR

        ○主动调用 or 表示紧接着下一个方法不是用 and 连接!(不调用 or 则默认为使用 and 连接)

  • and

        ○AND 嵌套

        ○例: and(i -> i.eq("name", "李白").ne("status", "活着")) ---> and (name = '李白' and status <> '活着')

测试用例:

    @Test
    public void testOr() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        // SELECT id,user_name,name,age,email AS mail FROM tb_user WHERE name = ? OR age = ?
        wrapper.eq("name","王五").or().eq("age",21);

        List<User> users = this.userMapper.selectList(wrapper);
        for (User user : users) {
            System.out.println(user);
        }
    }

2.6 select

在MP查询中,默认查询所有的字段,如果有需要也可以通过select方法进行指定字段

    @Test
    public void testSelect() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        //SELECT id,name,age FROM tb_user WHERE name = ? OR age >= ?
        wrapper.eq("name", "王五")
                .or()
                .ge("age", 21)
                .select("id","name","age"); //指定查询的字段

        List<User> users = this.userMapper.selectList(wrapper);
        for (User user : users) {
            System.out.println(user);
        }
    }

三、ActiveRecord

什么是ActiveRecord?

        ActiveRecord也属于ORM(对象关系映射)层,由Rails最早提出,遵循标准的ORM模型:表映射到记录,记 录映射到对象,字段映射到对象属性。配合遵循的命名和配置惯例,能够很大程度的快速实现模型的操作,而 且简洁易懂。

ActiveRecord的主要思想是:

  • 每一个数据库表对应创建一个类,类的每一个对象实例对应于数据库中表的一行记录;通常表的每个字段 在类中都有相应的Field;
  • ActiveRecord同时负责把自己持久化,在ActiveRecord中封装了对数据库的访问,即CURD;
  • ActiveRecord是一种领域模型(Domain Model),封装了部分业务逻辑;

3.1 快速开始AR

在MP中,开启AR非常简单,只需要将实体对象继承Model即可

package com.learn.mp.pojo;

import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author 咕咕猫
 * @version 1.0
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User extends Model<User> {

    private Long id;
    private String userName;
    private String password;
    private String name;
    private Integer age;
    private String email;

}

3.2 根据主键查询

@RunWith(SpringRunner.class)
@SpringBootTest
public class TestUserMapper2 {

    @Test
    public void selectById(){
        User user = new User();
        user.setId(2L);
        User user1 = user.selectById();
        System.out.println(user1);
    }
}

3.3 新增数据

    @Test
    public void testInsert(){
        User user = new User();
        user.setUserName("liubei");
        user.setPassword("123456");
        user.setAge(30);
        user.setName("刘备");
        user.setMail("liubei@123.com");

        //调用AR的insert方法进行插入数据
        boolean result = user.insert();
        System.out.println("result -》" + result);
    }

3.4 更新操作

    @Test
    public void testUpdate(){
        User user = new User();
        user.setId(7L); //查询条件
        user.setAge(31);//更新数据

        boolean result = user.updateById();
        System.out.println("result -》" + result);
    }

3.5 删除操作

    @Test
    public void testDelete(){
        User user = new User();
        user.setId(6L);

        boolean delete = user.deleteById();
        System.out.println("result -》" + delete);
    }

3.6 根据条件查询

    @Test
    public void testSelect(){
        User user = new User();

        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.ge("age",25); //大于等于25岁的用户


        List<User> users = user.selectList(wrapper);
        for (User user1 : users) {
            System.out.println(user1);
        }
    }

四、插件

4.1 mybatis的插件机制

        MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法 调用包括:

1. Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)

2. ParameterHandler (getParameterObject, setParameters)

3. ResultSetHandler (handleResultSets, handleOutputParameters)

4. StatementHandler (prepare, parameterize, batch, update, query)

        我们看到了可以拦截Executor接口的部分方法,比如update,query,commit,rollback等方法,还要其他接口的一些方法等。

总体概括为:

  • 拦截执行器的方法
  • 拦截参数的处理
  • 拦截结果集的处理
  • 拦截Sql语法构建的处理

拦截器示例:

package com.learn.mp.plugins;

import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;

import java.util.Properties;

/**
 * @author 咕咕猫
 * @version 1.0
 */
@Intercepts({@Signature(
        type= Executor.class,
        method = "update",
        args = {MappedStatement.class,Object.class})})
public class MyInterceptor implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        //拦截方法,具体业务逻辑编写的位置
        return invocation.proceed();
    }

    @Override
    public Object plugin(Object target) {
        //创建target对象的代理对象,目的是将当前拦截器加入到该对象中
        return Plugin.wrap(target, this);
    }
    @Override
    public void setProperties(Properties properties) {
        //属性设置
    }

}

注入到Spring容器:

/**
* 自定义拦截器
*/
@Bean
public MyInterceptor myInterceptor(){
    return new MyInterceptor();
}

或者通过xml配置,mybatis-config.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <plugins>
        <plugin interceptor="com.learn.mp.plugins.MyInterceptorr"></plugin>
    </plugins>

</configuration>

4.2 执行分析插件

在MP中提供了对SQL执行的分析的插件,可用作阻断全表更新、删除的操作,注意:该插件仅适用于开发环境,不适用于生产环境

SpringBoot配置:

    @Bean //SQL分析插件
    public SqlExplainInterceptor sqlExplainInterceptor(){

        SqlExplainInterceptor sqlExplainInterceptor = new SqlExplainInterceptor();
        List<ISqlParser> list = new ArrayList<>();
        list.add(new BlockAttackSqlParser()); //全表更新、删除的阻断器

        sqlExplainInterceptor.setSqlParserList(list);

        return sqlExplainInterceptor;
    }

测试:

   /**
     * 测试全表更新,SQL分析器的阻断效果
     */
    @Test
    public void testUpdateAll(){
        User user = new User();
        user.setAge(31);//更新数据

        boolean result = user.update(null); //全表更新
        System.out.println("result -》" + result);
    }

4.3 性能分析插件

性能分析拦截器,用于输出每条SQL语句及其执行时间,可以设置最大执行时间,超过时间会抛出异常。该插件仅适用于开发环境,不适用于生产环境

配置:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <plugins>
        <!--性能分析插件-->
        <plugin interceptor="com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor">
            <!--最大的执行时间,单位为毫秒-->
            <property name="maxTime" value="100"/>
            <!--对输出的SQL做格式化,默认为false-->
            <property name="format" value="true"/>
        </plugin>


</configuration>

4.4 乐观锁插件

4.4.1 主要使用场景

意图:当要更新一条记录的时候,希望这条记录没有被别人更新

乐观锁的实现方式:

  • 取出记录时,获取当前version
  • 更新时,带上这个version
  • 执行更新时,set version = newVersion where version = oldVersion
  • 如果version不对,就更新失败

4.4.2 插件配置

spring xml:

 <bean class="com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor"/>

spring boot:

@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}

4.4.3 注解实体字段

需要为实体字段添加@Version注解

第一步,为表添加version字段,并且设置初始值为1

ALTER TABLE `tb_user`
ADD COLUMN `version` int(10) NULL AFTER `email`;

UPDATE `tb_user` SET `version`='1';

第二步,为User实体对象添加version字段,并且添加@Version注解:

@Version
private Integer version;

4.4.4 测试

    /**
     * 测试乐观锁
     */
    @Test
    public void testUpdateVersion(){
        User user = new User();
        user.setId(2L); //查询条件

        User userVersion = user.selectById();

        user.setAge(23);//更新数据
        user.setVersion(userVersion.getVersion());//当前的版本信息

        boolean result = user.updateById();
        System.out.println("result -》" + result);

4.4.5 特别说明

  • 支持的数据类型只有:int,Interge,long,Long,Date,Timestamp,LocalDateTime
  • 整数类型下 newVersion = oldVersion + 1
  • newVersion会会写到 entity 中
  • 仅支持 updateById(id) 与 updateById(entity,wrapper) 方法
  • 在update(entity,wrapper) 方法下,wrapper不能复用!!!

五、Sql注入器

5.1 编写BaseMapper

package com.learn.mp.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.learn.mp.pojo.User;

import java.util.List;

/**
 * @author 咕咕猫
 * @version 1.0
 */
public interface MyBaseMapper<T> extends BaseMapper<T> {

    List<T> findAll();

    //可以扩展其他方法

}

其他的Mapper都可以继承该Mapper,这样实现了统一的扩展。 如:

package com.learn.mp.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.learn.mp.pojo.User;

import java.util.List;

/**
 * @author 咕咕猫
 * @version 1.0
 */
public interface UserMapper extends MyBaseMapper<User> {

    void selectList(long l);

    User findById(Long id);

}

5.2 编写MySqlInjector

如果直接继承AbstractSqlInjector的话,原有的BaseMapper中的方法将失效,所以我们选择继承DefaultSqlInjector进行扩展

package com.learn.mp.injector;

import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.AbstractSqlInjector;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;

import java.sql.Array;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 咕咕猫
 * @version 1.0
 */
public class MySqlInjector extends DefaultSqlInjector {

    @Override
    public List<AbstractMethod> getMethodList() {
        List<AbstractMethod> list  = new ArrayList<>();

        //获取父类中的集合
        list.addAll(super.getMethodList());

        //再扩充自定义的方法
        list.add(new FindAll());

        return list;
    }
}

5.3 编写FindAll

package com.learn.mp.injector;

import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.AbstractSqlInjector;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlSource;

/**
 * @author 咕咕猫
 * @version 1.0
 */
public class FindAll extends AbstractMethod {

    @Override
    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {

        String sql = "select * from " + tableInfo.getTableName();
        SqlSource sqlSource = languageDriver.createSqlSource(configuration,sql,modelClass);

        return this.addSelectMappedStatement(mapperClass, "findAll", sqlSource, modelClass, tableInfo);
    }
}

5.4 注册到Spring容器

    /**
     * 注入自定义的SQL注入器
     * @return
     */
    @Bean
    public MySqlInjector mySqlInjector() {
        return new MySqlInjector();
    }

5.5 测试

    @Test
    public void testFindAll(){
        List<User> users = this.userMapper.findAll();
        for (User user : users) {
            System.out.println(user);
        }
    }

输出的SQL:

 至此,我们实现了全局扩展SQL注入器。

六、自动填充功能

有时候在插入或者更新数据时,希望有些字段可以自动填充数据,比如面膜、version等。在MP中提供了这样的功能,可实现自动填充

6.1 添加@TableField注解

@TableField(fill = FieldFill.INSERT) //插入数据时进行填充
private String password;

为password添加自动填充功能,在新增数据时有效。

FieldFill提供了多种模式选择:

public enum FieldFill {
    /**
    * 默认不处理
    */
    DEFAULT,
    /**
    * 插入时填充字段
    */
    INSERT,
    /**
    * 更新时填充字段
    */
    UPDATE,
    /**    
    * 插入和更新时填充字段
    */
    INSERT_UPDATE
}

6.2 编写MyMetaObjectHandler

package com.learn.mp.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

/**
 * @author 咕咕猫
 * @version 1.0
 */
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {


    /**
     * 在插入数据时填充
     *
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        //先获取到password的值,再进行判断,如果为空,就进行填充,如果不为空,就不做处理
        Object password = getFieldValByName("password", metaObject);
        if (null == password) {
            setFieldValByName("password", "888888", metaObject);
        }

    }

    /**
     * 在更新数据时填充
     *
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {

    }
}

七、逻辑删除

        开发系统时,有时候在实现功能时,删除操作需要实现逻辑删除,所谓逻辑删除就是将数据标记为删除,而并非真正的物理删除(非DELETE操作),查询时需要携带状态条件,却表被标记的数据不被查询到。这样做的目的就是避免数据被真正的删除

7.1 修改表结构

为tb_user表增加deleted字段,用于表示数据是否被删除,1代表删除,0代表未删除

ALTER TABLE `tb_user`
ADD COLUMN `deleted` int(1) NULL DEFAULT 0 COMMENT '1代表删除,0代表未删除' AFTER
`version`;

同时,也修改User实体,增加deleted属性并且添加@TableLogic注解:

@TableLogic
private Integer deleted;

7.2 配置

application.properties:

# 逻辑已删除值(默认为 1)
mybatis-plus.global-config.db-config.logic-delete-value=1
# 逻辑未删除值(默认为 0)
mybatis-plus.global-config.db-config.logic-not-delete-value=0

7.3 测试

@Test
public void testDeleteById(){
    this.userMapper.deleteById(2L);
}

八、通用枚举

解决了繁琐的配置,让mybaits优雅的使用枚举属性

8.1 修改表结构

ALTER TABLE `tb_user`
ADD COLUMN `sex` int(1) NULL DEFAULT 1 COMMENT '1-男,2-女' AFTER `deleted`;

8.2 定义枚举

package com.learn.mp.enums;

import com.baomidou.mybatisplus.core.enums.IEnum;

public enum SexEnum implements IEnum<Integer> {
    MAN(1, "男"),
    WOMAN(2, "女");
    private int value;
    private String desc;

    SexEnum(int value, String desc) {
        this.value = value;
        this.desc = desc;
    }

    @Override
    public Integer getValue() {
        return this.value;
    }

    @Override
    public String toString() {
        return this.desc;
    }
}

8.3 配置

# 枚举包扫描
mybatis-plus.type-enums-package=cn.itcast.mp.enums

8.4 修改实体

private SexEnum sex;

8.5 测试

测试插入数据:

    @Test
    public void testInsert(){
        User user = new User();
        user.setUserName("diaochan");
        user.setPassword("123456");
        user.setAge(20);
        user.setName("貂蝉");
        user.setMail("diaochan@123.com");
        user.setVersion(1);
        user.setSex(SexEnum.WOMAN);

        //调用AR的insert方法进行插入数据
        boolean result = user.insert();
        System.out.println("result -》" + result);
    }

九、代码生成器

AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。

9.1 创建工程

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
    </parent>
    <groupId>cn.itcast.mp</groupId>
    <artifactId>itcast-mp-generator</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--mybatis-plus的springboot支持-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.1</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

9.2 代码

package com.learn.mp;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.FileOutConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.TemplateConfig;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

/**
 * <p>
 * mysql 代码生成器演示例子
 * </p>
 */
public class MysqlGenerator {
    /**
     * <p>
     * 读取控制台内容
     * </p>
     */
    public static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("请输入" + tip + ":");
        System.out.println(help.toString());
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (StringUtils.isNotEmpty(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "!");
    }

    /**
     * RUN THIS
     */
    public static void main(String[] args) {
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();
        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath + "/src/main/java");
        gc.setAuthor("gugumao");
        gc.setOpen(false);
        mpg.setGlobalConfig(gc);
        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://127.0.0.1:3306/mp? useUnicode = true & useSSL = false & characterEncoding = utf8");
        // dsc.setSchemaName("public");
        dsc.setDriverName("com.mysql.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("root");
        mpg.setDataSource(dsc);
        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName(scanner("模块名"));
        pc.setParent("cn.itcast.mp.generator");
        mpg.setPackageInfo(pc);
        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };
        List<FileOutConfig> focList = new ArrayList<>();
        focList.add(new FileOutConfig("/templates/mapper.xml.ftl") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输入文件名称
                return projectPath + "/itcast-mpgenerator/src/main/resources/mapper/" + pc.getModuleName()
                        + "/" + tableInfo.getEntityName() + "Mapper" +
                        StringPool.DOT_XML;
            }
        });
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);
        mpg.setTemplate(new TemplateConfig().setXml(null));
        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        //strategy.setSuperEntityClass("com.baomidou.mybatisplus.samples.generator.common.BaseEntity");
        strategy.setEntityLombokModel(true);
        //strategy.setSuperControllerClass("com.baomidou.mybatisplus.samples.generator.common.BaseController");
        strategy.setInclude(scanner("表名"));
        strategy.setSuperEntityColumns("id");
        strategy.setControllerMappingHyphenStyle(true);
        strategy.setTablePrefix(pc.getModuleName() + "_");
        mpg.setStrategy(strategy);
        // 选择 freemarker 引擎需要指定如下加,注意 pom 依赖必须有!
        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        mpg.execute();
    }
}

十、MybatisX快速开发插件

MybatisX 是一款基于 IDEA 的快速开发插件,为效率而生。 安装方法:打开 IDEA,进入 File -> Settings -> Plugins -> Browse Repositories,输入 mybatisx 搜索并安装。

功能:

  • Java与XML调回跳转
  • Mapper方法自动生成XML

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mybatis—Plus (2)—配置、条件构造器 的相关文章

随机推荐

  • 《软件测试的艺术》第九章 敏捷开发模式下的测试

    软件测试的艺术 第九章 敏捷开发模式下的测试 9 0 前言 9 1 敏捷开发的特征 9 2 敏捷测试 9 3 极限编程 XP 与测试 9 3 1 极限编程基础 9 3 1 1 XP计划 9 3 1 2 XP测试 9 3 2 极限测试 概念
  • 理解innodb的锁(record,gap,Next-Key lock)

    Record lock 单条索引记录上加锁 record lock锁住的永远是索引 而非记录本身 即使该表上没有任何索引 那么innodb会在后台创建一个隐藏的聚集主键索引 那么锁住的就是这个隐藏的聚集主键索引 所以说当一条sql没有走任何
  • 算法系列-leetcode-20.有效的括号

    20 有效的括号 简单 给定一个只包括 的字符串 s 判断字符串是否有效 有效字符串需满足 左括号必须用相同类型的右括号闭合 左括号必须以正确的顺序闭合 示例 1 输入 s 输出 true 示例 2 输入 s 输出 true 栈 遇到左括号
  • 科普:手机电池的保护电路

    转自 http www elecfans com yuanqijian dianchi dianchijichu 20120905287417 html 此篇文章主要介绍手机电池的保护电路 我们大家在使用电池的时候总会发生各种误操作 而手机
  • 【图像隐藏】基于DWT与SVD算法实现数字水印嵌入提取附matlab代码

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab仿真内容点击 智能优化算法 神经网络预测 雷达通信 无线传感器 电力系统 信号
  • Spring State Machine

    Spring 状态机初探 一 spring statemachine 1 枚举定义 public enum OrderStatus WAIT PAYMENT 等待支付 WAIT RECEIVE 等待收货 FINISH 完成 public e
  • Javascript中获取数组最大值和最小值以及最大值和最小值的下标 没学对象前的最简单最基本的方法

    用for循环和if 为什么不用对象 因为这是还没学对象的时候留的作业 这个写法 数组里有重复值也可以识别 var arr 20 5 16 80 60 5 80 80 80 var max arr 0 var min arr 0 for va
  • python报错

    一 TypeError list indices must be integers or slices not str 暂无影响 未解决 二 Keyerror 解决方案 https blog csdn net jacke121 articl
  • C—数据的储存(下)

    文章目录 前言 一 练习一下 1 例一 2 例二 3 例三 4 例四 二 浮点型在内存中的储存 1 浮点数 2 浮点数存储 1 二进制浮点数 2 浮点数的存储规定 3 浮点数的取出规定 3 例题 总结 前言 个人主页 小沈熬夜秃头中 小编介
  • OCR技术原理

    OCR技术原理 文档识别技术功能特点图像输入 读取不同图像格式文件的算法 图像预处理 主要包括图像二值化 噪声去除 倾斜较正等算法 版面分析 将文档图片分段落 分行的算法就叫版面分析算法 字符切割 字符切割算法主要处理因字符粘连 断笔造成字
  • CCS6 配置工程头文件路径方法

    软件版本 Code Composer Studio Version 6 1 3 00034 配置头文件 给工程配置 右键工程名字没然后选择Properties 选择CCS Build gt Cxxxx Compiler gt Include
  • 【硬件设计】基于K78系列芯片的电源板电路

    文章目录 1 电源板介绍 1 1 电源板作用 1 2 电源板基本原理和类型 1 3 电源板应用场景 2 K78系列的线性稳压芯片介绍 2 1 K78系列线性稳压芯片的特点和基本参数 2 2 K78系列线性稳压芯片的工作原理 2 3 K78系
  • 《尚硅谷Redis7教程》笔记(大厂篇)

    1 Redis单线程 vs 多线程 How can Redis use multiple CPUs or cores Redis如何使用多个CPU或内核 https redis io docs getting started faq how
  • Python第四课

    枭 Python第四课 今天讲解了Python的 元组 字典 元组 性质 元组是有序不可变的 也就是只支持查 不支持增删改 元组是放在 中的 元组访问速度比列表更快 元组支持切片操作来访问元素 创建删除 在创建元组时 字符后面的逗号不能扔
  • Practical Programming in C

    本文转载至 http ocw mit edu courses electrical engineering and computer science 6 087 practical programming in c january iap
  • oauth2.0--基础--01--理论

    oauth3 0 基础 01 理论 1 快递员问题 1 1 问题描述 我经常点外卖 每天都有外卖员来送餐 我必须找到一个办法 让快递员通过门禁系统 进入小区 如果我把自己的密码 告诉快递员 他就拥有了与我同样的权限 就可以自由的出入小区 这
  • mybatis-一对多分页查询

    问题 在用mybatis做一对多查询时候 常用collection配合完成结果查询 在不涉及分页查询情况下 查询结果是没有问题的 但当涉及分页查询时 就会出现问题 即结果总数量total多于实际数量 演示示例如下 实体类 Data publ
  • Android 下配置一个 /dev/fb0 节点出来

    2019 07 24 关键字 dev fb0 与 dev graphics fb0 fb 即 framebuffer 的简称 framebuffer 是 Linux 设备上的概念 从软件层面来理解 framebuffer 它就是一段内存空间
  • 华为Kirin985是哪些手机在用?

    华为Kirin985是哪些手机在用 https www ebaina com questions 100000032252
  • Mybatis—Plus (2)—配置、条件构造器

    目录 一 配置 1 1 基本配置 1 1 1 configLocation 1 1 2 mapperLocations 1 1 3 typeAliasesPackage 1 2 进阶配置 1 2 1 mapUnderscoreToCamel