MyBatis-Plus的简单使用

时间:2022-11-04 05:13:31

  mybatis-plus也只是听过,可是终究没有使用过。于是自己花几天晚上的时间研究mybatis-plus的使用。

  下面的研究也是基于其官网:http://mp.baomidou.com/guide/  。官网的介绍非常详细。

  官网有基于springboot,也有基于spring的原始方式。下面基于原始的spring配置方式进行使用。如果有时间,将来会将自己的SSM项目转为springboot项目,并且整合MP与Redis缓存等操作。。。。。。。

 

  MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

 

0.pom.xml配置:

引入下面maven依赖之后会自动引入mybatis与mybats-spring,所以需要把原来的删掉

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>2.0.1</version>
        </dependency>

 

 

1.前期的环境搭建工作

参考:https://baomidou.gitee.io/mybatis-plus-doc/#/install

1.1我先附上原声的mybatis整合spring以及整合pagehelper插件的xml中的配置,然后两个做对比。

    <!-- 0.连接池属性设置读取指定的properties文件 -->
    <context:property-placeholder location="classpath:db.properties" ignore-unresolvable="true"/>

    <!-- 1.将连接池放入spring容器 -->
    <bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="jdbcUrl" value="${jdbc.url}"></property>
        <property name="driverClass" value="${jdbc.driver}"></property>
        <property name="user" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>

    <!--2. 配置 Mybatis的会话工厂 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 数据源 -->
        <property name="dataSource" ref="dataSource" />
        <!-- 配置Mybatis的核心 配置文件所在位置 -->
        <property name="configLocation" value="classpath:SqlMapConfig.xml" />
        <!-- 注意其他配置 -->
        <property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <!--使用下面的方式配置参数,一行配置一个 -->
                        <value>
                                helperDialect=mysql
                             reasonable=true
                        </value>
                    </property>
                </bean>
            </array>
        </property>
    </bean>


    
     <!-- 3.2通过MapperScannerConfigurer扫描进行批量生成代理对象
         遵循规范:mapper.java和mapper.xml名字一样且在同一个目录下
        自动扫描出来的代理对象的id为mapper类类名(首字母小写)     
     -->
     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
         <!-- 指定扫描的包名,如果有多个,用半角逗号分隔 -->
         <property name="basePackage" value="cn.xm.jwxt.mapper"></property>
         <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
     </bean>

 

 

1.2    MP整合的配置

下面配置可以上面1.1中的配置。但是需要注意分页由于是引用了MP的分页插件,所以会导致原来pagehelper的分页插件不生效。但是原来手写的mapper.xml是生效的,可以说是整合成功。

    <!-- 0.连接池属性设置读取指定的properties文件 -->
    <context:property-placeholder location="classpath:db.properties" ignore-unresolvable="true"/>
    
    <!-- 1.将连接池放入spring容器 -->
    <bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="jdbcUrl" value="${jdbc.url}"></property>
        <property name="driverClass" value="${jdbc.driver}"></property>
        <property name="user" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>

    <bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!-- 配置实体扫描路径,多个package可以用分号; 逗号, 分隔, 支持通配符*-->
        <!-- com.a.b.entity;com.a.c.entity;com.d.*.entity-->
        <property name="typeAliasesPackage" value="cn.xm.jwxt.bean.*"/>
        <property name="configuration" ref="mybatisConfig"/>
        <!-- MP 全局配置注入 -->
        <property name="globalConfig" ref="globalConfig"/>
        <property name="plugins">
            <array>
                <!-- 分页插件配置 -->
                <bean id="paginationInterceptor"
                      class="com.baomidou.mybatisplus.plugins.PaginationInterceptor"/>
                <!-- 性能拦截器,兼打印sql,不建议生产环境配置-->
                <bean id="performanceInterceptor"
                      class="com.baomidou.mybatisplus.plugins.PerformanceInterceptor"/>
            </array>
        </property>
    </bean>

    <bean id="mybatisConfig" class="com.baomidou.mybatisplus.MybatisConfiguration">
        <property name="mapUnderscoreToCamelCase" value="true"/>
    </bean>

    <!-- 定义 MP 全局策略 -->
    <bean id="globalConfig" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
        <!-- 主键策略配置 -->
        <!-- 可选参数
            AUTO->`0`("数据库ID自增")
            INPUT->`1`(用户输入ID")
            ID_WORKER->`2`("全局唯一ID")
            UUID->`3`("全局唯一ID")
        -->
        <property name="idType" value="2"/>

        <!-- 数据库类型配置 -->
        <!-- 可选参数(默认mysql)
            MYSQL->`mysql`
            ORACLE->`oracle`
            DB2->`db2`
            H2->`h2`
            HSQL->`hsql`
            SQLITE->`sqlite`
            POSTGRE->`postgresql`
            SQLSERVER2005->`sqlserver2005`
            SQLSERVER->`sqlserver`
        -->
        <property name="dbType" value="mysql"/>

        <!-- 全局表为下划线命名设置 true -->
        <property name="dbColumnUnderline" value="true"/>
    </bean>

    <!-- 配置mybatis 扫描mapper接口的路径, 相当于注解@MapperScan,@MapperScan("com.baomidou.mybatisplus.test.h2.entity.mapper")-->
    <bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="cn.xm.jwxt.mapper"/>
    </bean>

 

 

为了使用pageHelper的分页插件,我们尝试将pageHelper的分页插件加入上面sqlsessionfactory中

    <bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!-- 配置实体扫描路径,多个package可以用分号; 逗号, 分隔, 支持通配符*-->
        <!-- com.a.b.entity;com.a.c.entity;com.d.*.entity-->
        <property name="typeAliasesPackage" value="cn.xm.jwxt.bean.*"/>
        <property name="configuration" ref="mybatisConfig"/>
        <!-- MP 全局配置注入 -->
        <property name="globalConfig" ref="globalConfig"/>
        <property name="plugins">
            <array>
                <!-- pageHelper的分页插件配置 -->
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <!--使用下面的方式配置参数,一行配置一个 -->
                        <value>
                            helperDialect=mysql
                            reasonable=true
                        </value>
                    </property>
                </bean>
                <!--MP自带的分页插件-->
                <bean id="paginationInterceptor"
                      class="com.baomidou.mybatisplus.plugins.PaginationInterceptor"/>
                <!-- 性能拦截器,兼打印sql,不建议生产环境配置-->
                <bean id="performanceInterceptor"
                      class="com.baomidou.mybatisplus.plugins.PerformanceInterceptor"/>
            </array>
        </property>
    </bean>

 

经过证明上面的配置是可以的。也就是我们可以用原来的pagehelper插件。

 

而且SQL性能拦截器也生效,如下:

MyBatis-Plus的简单使用

 

虽然mybatis的日志功能也可以打出SQL以及参数,但是没有这个强大,下面是mybatis整合slf4j打出的SQL:

MyBatis-Plus的简单使用

 

 

 2.主要常见的功能简单使用

2.1代码生成器----逆向工程,类似于mybatis的generator

package cn.xm.jwxt.utils;

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.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DbType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.HashMap;
import java.util.Map;

/**
 * <p>
 * 代码生成器演示
 * </p>
 */
public class MpGenerator {

    /**
     * <p>
     * MySQL 生成演示
     * </p>
     */
    public static void main(String[] args) {
        AutoGenerator mpg = new AutoGenerator();
        // 选择 freemarker 引擎,默认 Veloctiy
        // mpg.setTemplateEngine(new FreemarkerTemplateEngine());

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        gc.setOutputDir("G://MP");
        gc.setFileOverride(true);
        gc.setActiveRecord(false);// 不需要ActiveRecord特性的请改为false
        gc.setEnableCache(false);// XML 二级缓存
        gc.setBaseResultMap(true);// XML ResultMap
        gc.setBaseColumnList(false);// XML columList
        // .setKotlin(true) 是否生成 kotlin 代码
        gc.setAuthor("qlq");

        // 自定义文件命名,注意 %s 会自动填充表实体属性!
        // gc.setMapperName("%sDao");
        // gc.setXmlName("%sDao");
        // gc.setServiceName("MP%sService");
        // gc.setServiceImplName("%sServiceDiy");
        // gc.setControllerName("%sAction");
        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setDbType(DbType.MYSQL);
        dsc.setDriverName("com.mysql.jdbc.Driver");
        dsc.setUsername("sa");
        dsc.setPassword("123456");
        dsc.setUrl("jdbc:mysql://localhost:3306/jwxt");
        mpg.setDataSource(dsc);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        // strategy.setCapitalMode(true);// 全局大写命名 ORACLE 注意
        strategy.setTablePrefix(new String[] { "tlog_", "tsys_" });// 此处可以修改为您的表前缀
        strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
        // strategy.setInclude(new String[] { "user" }); // 需要生成的表
        // strategy.setExclude(new String[]{"test"}); // 排除生成的表
        // 自定义实体父类
        // strategy.setSuperEntityClass("com.baomidou.demo.TestEntity");
        // 自定义实体,公共字段
        // strategy.setSuperEntityColumns(new String[] { "test_id", "age" });
        // 自定义 mapper 父类
        // strategy.setSuperMapperClass("com.baomidou.demo.TestMapper");
        // 自定义 service 父类
        // strategy.setSuperServiceClass("com.baomidou.demo.TestService");
        // 自定义 service 实现类父类
        // strategy.setSuperServiceImplClass("com.baomidou.demo.TestServiceImpl");
        // 自定义 controller 父类
        // strategy.setSuperControllerClass("com.baomidou.demo.TestController");
        // 【实体】是否生成字段常量(默认 false)
        // public static final String ID = "test_id";
        // strategy.setEntityColumnConstant(true);
        // 【实体】是否为构建者模型(默认 false)
        // public User setName(String name) {this.name = name; return this;}
        // strategy.setEntityBuilderModel(true);
        mpg.setStrategy(strategy);

        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent("cn.xm.mapper");
        pc.setModuleName("module");
        mpg.setPackageInfo(pc);

        // 注入自定义配置,可以在 VM 中使用 cfg.abc 【可无】
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                Map<String, Object> map = new HashMap<String, Object>();
                map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
                this.setMap(map);
            }
        };
        mpg.setCfg(cfg);

        // 自定义模板配置,可以 copy 源码 mybatis-plus/src/main/resources/templates 下面内容修改,
        // 放置自己项目的 src/main/resources/templates 目录下, 默认名称一下可以不配置,也可以自定义模板名称
        // TemplateConfig tc = new TemplateConfig();
        // tc.setController("...");
        // tc.setEntity("...");
        // tc.setMapper("...");
        // tc.setXml("...");
        // tc.setService("...");
        // tc.setServiceImpl("...");
        // 如上任何一个模块如果设置 空 OR Null 将不生成该模块。
        // mpg.setTemplate(tc);

        // 执行生成
        mpg.execute();

        // 打印注入设置【可无】
        System.err.println(mpg.getCfg().getMap().get("abc"));
    }

}

 

  下面贴出生成的代码的结构:看的出来MP导出的时候是以模块进行分隔的,也就是先模块后三层架构,我习惯是先三层架构后模块(看目录名称就知道对应目录的东西),比mybatis的generator强大的是生成了对应的service目录和web目录,同时生成了对应的文件,都省下我们手写了。

MyBatis-Plus的简单使用

 

 

 我们查看mapper和一个文件:(没有任何抽象方法,XML也没有任何SQL)

MyBatis-Plus的简单使用

  

package cn.xm.mapper.module.mapper;

import cn.xm.mapper.module.entity.ApArrangeCourseAudit;
import com.baomidou.mybatisplus.mapper.BaseMapper;

/**
 * <p>
  *  Mapper 接口
 * </p>
 *
 * @author qlq
 * @since 2018-11-20
 */
public interface ApArrangeCourseAuditMapper extends BaseMapper<ApArrangeCourseAudit> {

}

 

 

<?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="cn.xm.mapper.module.mapper.ApArrangeCourseAuditMapper">

    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="cn.xm.mapper.module.entity.ApArrangeCourseAudit">
        <id column="audit_id" property="audit_id" />
        <result column="arrange_task_id" property="arrange_task_id" />
        <result column="auditor_name" property="auditor_name" />
        <result column="auditor_id" property="auditor_id" />
        <result column="audit_time" property="audit_time" />
        <result column="audit_suggestion" property="audit_suggestion" />
        <result column="audit_result" property="audit_result" />
        <result column="remark" property="remark" />
    </resultMap>

</mapper>

 

 

 

查看service目录和一个文件

 MyBatis-Plus的简单使用

 

package cn.xm.mapper.module.service;

import cn.xm.mapper.module.entity.ApArrangeCourseAudit;
import com.baomidou.mybatisplus.service.IService;

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author qlq
 * @since 2018-11-20
 */
public interface IApArrangeCourseAuditService extends IService<ApArrangeCourseAudit> {
    
}

 

package cn.xm.mapper.module.service.impl;

import cn.xm.mapper.module.entity.ApArrangeCourseAudit;
import cn.xm.mapper.module.mapper.ApArrangeCourseAuditMapper;
import cn.xm.mapper.module.service.IApArrangeCourseAuditService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author qlq
 * @since 2018-11-20
 */
@Service
public class ApArrangeCourseAuditServiceImpl extends ServiceImpl<ApArrangeCourseAuditMapper, ApArrangeCourseAudit> implements IApArrangeCourseAuditService {
    
}

 

 

 查看web目录以及查看文件:

MyBatis-Plus的简单使用

 

package cn.xm.mapper.module.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author qlq
 * @since 2018-11-20
 */
@Controller
@RequestMapping("/module/apArrangeCourseAudit")
public class ApArrangeCourseAuditController {
    
} 

 发现上面的控制层模板默认是SpringMVC。

 

上面Generator中可以设置这些的默认模板,我们可以拷贝一个出来然后进行修改

        // 自定义模板配置,可以 copy 源码 mybatis-plus/src/main/resources/templates 下面内容修改,
        // 放置自己项目的 src/main/resources/templates 目录下, 默认名称一下可以不配置,也可以自定义模板名称
        // TemplateConfig tc = new TemplateConfig();
        // tc.setController("...");
        // tc.setEntity("...");
        // tc.setMapper("...");
        // tc.setXml("...");
        // tc.setService("...");
        // tc.setServiceImpl("...");
        // 如上任何一个模块如果设置 空 OR Null 将不生成该模块。
        // mpg.setTemplate(tc);

 

查看  TemplateConfig 类:

MyBatis-Plus的简单使用

 

我们再查看/template/controller.java.vm内容: 

package ${package.Controller};

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
#if(${superControllerClassPackage})
import ${superControllerClassPackage};
#end

/**
 * <p>
 * ${table.comment} 前端控制器
 * </p>
 *
 * @author ${author}
 * @since ${date}
 */
@Controller
@RequestMapping("#if(${package.ModuleName})/${package.ModuleName}#end/${table.entityPath}")
#if(${superControllerClass})
public class ${table.controllerName} extends ${superControllerClass} {
#else
public class ${table.controllerName} {
#end
    
}

 

 

看了上面源码之后如果想修改模板就很简单了。

 

接下来会继续研究MP的其他使用,上面导出的mapper没有任何方法,明天会继续研究其单表操作以及其他分页等操作。