SpringBoot 里MybatisPlus使用

mybatis plus 是mybatis 的增强版,在 MyBatis 的基础上只做增强不做改变,可以简化非常多增删改查的操作,并且让代码更易于维护。

一、引入MybatisPlus

这里使用的是MybatisPlus 3 和 SpringBoot 2.2.5.RELEASE 。

 <!--mybatis plus-->
<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.0.3</version>
</dependency>

application.yml 里的配置

mybatis-plus:
  # 如果是放在src/main/java目录下 classpath:/com/yourpackage/*/mapper/*Mapper.xml
  # 如果是放在resource目录 classpath:/mapper/*Mapper.xml
  mapper-locations: classpath:/mybatis/**/*Mapper.xml
  #实体扫描,多个package用逗号或者分号分隔
  typeAliasesPackage: com.jing.h5.domain.po
  global-config:
    #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
    id-type: 0
    #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
    field-strategy: 1
    logic-delete-value: 1 # 逻辑已删除值(默认为 1)
    logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
  configuration:
    map-underscore-to-camel-case: true
    cache-enabled: false
    #配置JdbcTypeForNull
    jdbc-type-for-null: 'null'

mybatis plus 的配置文件(插件可以按需引入)

package com.jing.common.plus;


import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/**
 * @author jing
 * @version 1.0
 * @desc mybatis-plus配置类
 * @date 2020/5/25 0025 10:55
 **/
@Configuration
@EnableTransactionManagement
public class MybatisPlusConfiguration {

    /**
     * 分页插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }

    /**
     * 逻辑删除插件
     */
    @Bean
    public ISqlInjector logicSqlInjector() {
        return new LogicSqlInjector();
    }

    /**
     * 乐观锁 插件
     */
    @Bean
    public OptimisticLockerInterceptor optimisticLocker() {
        return new OptimisticLockerInterceptor();
    }


}

二、生成代码

修改配置即可生成对应的代码,可以替代mybatis-generator 方案,生成数据库的增删改查。

package com.jing.common.plus;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
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.rules.NamingStrategy;

/**
 * @author jing
 * @version 1.0
 * @desc 自动生成表结构
 * @date 2020/5/25 0025 11:01
 **/
public class MybatisPlusGenerator1 {


    // 数据库ip地址
    private static final String HOST = "127.0.0.1";
    //数据库端口
    private static final String PORT = "3306";
    // 数据库用户名
    private static final String USERNAME = "user";
    // 数据库密码
    private static final String PASSWORD = "pwd";
    // 数据库
    private static final String DATABASENAME = "dbName";
    // 表名列表
    private static final String[] TABLENAMES = {"table_name"};
    // 项目地址,你要生成的位置地址
    private static final String PATH = "D:\\Project\\src\\main\\java";
    // 设置表名前缀
    private static final String TABLE_PREFIX = "";
    // 设置文件生成包名
    private static final String PARENT = "com.jing.app.h5";
    private static final String CONTROLLER = "controller";
    private static final String SERVICE = "service";
    private static final String MAPPER = "mapper";
    private static final String SERVICE_IMPL = "service.impl";
    private static final String DOMAIN = "domain.po";
    private static final String AUTHOR = "jing";

    public static void main(String[] args) {
        generateByTables();
    }

    private static void generateByTables() {
        GlobalConfig config = new GlobalConfig();
        config.setIdType(IdType.AUTO).setFileOverride(true).setServiceName("%sService")
                .setControllerName("%sController")
                .setMapperName("%sMapper")
                .setServiceImplName("%sServiceImpl")
                .setXmlName("%sMapper")
                .setAuthor(AUTHOR).setBaseColumnList(true);
        // 数据库连接地址
        String dbUrl = String.format("jdbc:mysql://%s:%s/%s", HOST, PORT, DATABASENAME) + "?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false";
        // 数据库配置
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setDbType(DbType.MYSQL).setUrl(dbUrl).setUsername(USERNAME).setPassword(PASSWORD).setDriverName("com.mysql.cj.jdbc.Driver");
        // 表结构配置,可以设置是否支持 lombok
        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig.setCapitalMode(true).setEntityLombokModel(true).setNaming(NamingStrategy.underline_to_camel).setInclude(TABLENAMES).setTablePrefix(TABLE_PREFIX);
        config.setActiveRecord(false).setFileOverride(true).setEnableCache(false).setOutputDir(PATH);

        // 包名配置
        PackageConfig packageConfig = new PackageConfig();
        packageConfig.setParent(PARENT).setController(CONTROLLER).setEntity(DOMAIN).setService(SERVICE).setMapper(MAPPER).setServiceImpl(SERVICE_IMPL).setXml(MAPPER);
        // 集成
        new AutoGenerator().setGlobalConfig(config).setDataSource(dataSourceConfig).setStrategy(strategyConfig).setPackageInfo(packageConfig).execute();
    }
}

如果在已有项目里使用的话,也可以直接改造现有代码,在不改变现有功能的情况下。

需要在对应的数据库对象上加上@TableName("table_name"),在主键上增加@TableId。

然后对应的mapper ,service ,serviceImpl 里分别继承BaseMapper,ServiceImpl,IService类。

最后在对应的xml 文件里增加 

<sql id="Base_Column_List">
    `id`, `field_name`,  `create_time`, `update_time`    
</sql>

详情看下方的使用说明。

三、简单使用

1、数据库对象 domain

package com.jing.back.domain;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.time.LocalDateTime;

/**
 * @desc 数据库对象,建议搭配 lombok 使用,这样表里新增字段会非常方便
 *
 * @author jing
 * @date 2021-07-19
 */
// table_name 表名
@TableName("table_name")
@Data
public class TableName {

    /**
     *  主键,IdType.AUTO 表示自增主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    /**
     *  名称
     */
    private String name;

    /**
     *  值
     */
    private Integer value;

    /**
     *  创建时间,mybatis plus 的日期格式用的是 LocalDateTime
     */
    private LocalDateTime createTime;

    /**
     *  是否删除,TableLogic 标明是逻辑删除字段,可以在配置文件里配置哪个值表示删除,
     *  哪个值表示正常。注意还需要在配置类里引入逻辑删除的插件。
     */
    @TableLogic
    private Integer deleted;
    
    /**
     *  乐观锁,新增的时候需要设置初始值,修改的时候会自动加一,并且修改的时候会返回是否修改成功
     */
    @Version
    private Integer version;
    

}

2、业务类 service 和 serviceImpl

package com.jing.h5.service;

import com.jing.h5.domain.po.TableName;
import com.baomidou.mybatisplus.extension.service.IService;

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author jing
 * @since 2021-07-20
 */
public interface TableNameService extends IService<TableName> {

}
package com.jing.h5.service.impl;

import com.jing.domain.po.TableName;
import com.jing.h5.mapper.TableNameMapper;
import com.jing.h5.service.TableNameService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author jing
 * @since 2021-07-20
 */
@Service
public class TableNameServiceImpl extends ServiceImpl<TableNameMapper, TableName> implements TableNameService {

}

3、mapper 和 mapper.xml

package com.jing.h5.mapper;

import com.jing.h5.domain.po.TableName;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

/**
 * <p>
 *  Mapper 接口
 * </p>
 *
 * @author jing
 * @since 2021-07-20
 */
public interface TableNameMapper extends BaseMapper<TableName> {

}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jing.h5.mapper.TableNameMapper">

    <!-- 通用查询结果列,注意如果有新增字段,这里也要补上 -->
    <sql id="Base_Column_List">
        id, name, value, deleted, version, create_time, update_time
    </sql>

</mapper>

到此你就可以通过

@Resource
private TableNameService tableNameService;

来通过 service 调用里面增删改查的方法了。 

基础方法包括:

增加: save, saveBatch, saveOrUpdate, saveOrUpdateBatch

修改:update, updateById, updateBatchById

删除:remove, removeById, removeByMap, removeByIds

查询:getById, listByIds, listByMap, getOne, getMap, getObj, count,  list,  page, listMaps, listObjs, pageMaps 

基本支持常见的单表操作。 目前版本不支持多表联查。如果上面的不满足需求,也可以自己写sql 语句实现,mybatis plus 完全兼容 mybatis。

大多数业务里,需要通过条件筛选进行增删改查。 mybatis plus 里可以通过 QueryWrapper 来实现复杂的条件查询,详情如下。

package com.jing.h5.service.impl;

import com.jing.domain.po.TableName;
import com.jing.h5.mapper.TableNameMapper;
import com.jing.h5.service.TableNameService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author jing
 * @since 2021-07-20
 */
@Service
public class TableNameServiceImpl extends ServiceImpl<TableNameMapper, TableName> implements TableNameService {

     /**
     * 查询列表
     *
     * @return 列表
     */
    @Override
    public List<TableName> getList(String name,List<Interge> ids) {
        QueryWrapper<ActivityConfig> wrapper = new QueryWrapper<>();
        wrapper.lambda().eq(TableName::getName, name);
        wrapper.lambda().in(TableName::getId, ids)
        wrapper.lambda().orderByAsc(TableName:getCreateTime);
        List<ActivityConfig> list = this.list(wrapper);
        return list;
    }
    
    /**
     * 分页查询,注意如果引入了 pageHelper, 那么mybatis plus 返回的总条数是有问题的,需要重新查
一下总条数
     *
     * @return 列表
     */
    @Override
    public List<TableName> getList(String name,List<Interge> ids, int pageNum, int pageSize) {
        QueryWrapper<ActivityConfig> wrapper = new QueryWrapper<>();
        wrapper.lambda().eq(TableName::getName, name);
        wrapper.lambda().in(TableName::getId, ids)
        // 由于mysql 在排序条件相同时会随机排序,所以在分页的情况下,排序条件需要再加上id,避免随机排序导致的数据重复。
        wrapper.lambda().orderByAsc(TableName:getCreateTime, TableName::getId);
        IPage<ActivityConfig> page = this.page(new Page<>(pageNum, pageSize), wrapper);
        return page.getRecords();
    }


}

附上mybatis plus 官方文档 https://baomidou.com/guide/

到此结束,感谢观看。

猜你喜欢

转载自blog.csdn.net/socct_yj/article/details/118942772