Skip to content

16 Mybatis-PLUS MP

16.1 官网

https://baomidou.com/

16.2 代码生成器

  • 添加依赖

    • 单元测试
    • 生成器 依赖
    • Freemarker
    • 数据库的驱动
    • lombok
    • 日志
    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">
        <parent>
            <artifactId>mybatis-parent-java1</artifactId>
            <groupId>com.neuedu.mybatis</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>09-mybatis-plus-generator</artifactId>
        <packaging>war</packaging>
    
        <name>09-mybatis-plus-generator Maven Webapp</name>
        <!-- FIXME change it to the project's website -->
        <url>http://www.example.com</url>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <maven.compiler.source>1.7</maven.compiler.source>
            <maven.compiler.target>1.7</maven.compiler.target>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-generator</artifactId>
                <version>3.3.2</version>
            </dependency>
    
            <dependency>
                <groupId>org.freemarker</groupId>
                <artifactId>freemarker</artifactId>
                <version>2.3.30</version>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.49</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>1.8.0-beta4</version>
            </dependency>
    
    
            <!-- https://mvnrepository.com/artifact/log4j/log4j -->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>
    
    
    
        </dependencies>
    
        <build>
            <finalName>09-mybatis-plus-generator</finalName>
            <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
                <plugins>
                    <plugin>
                        <artifactId>maven-clean-plugin</artifactId>
                        <version>3.1.0</version>
                    </plugin>
                    <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
                    <plugin>
                        <artifactId>maven-resources-plugin</artifactId>
                        <version>3.0.2</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <version>3.8.0</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-surefire-plugin</artifactId>
                        <version>2.22.1</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-war-plugin</artifactId>
                        <version>3.2.2</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-install-plugin</artifactId>
                        <version>2.5.2</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-deploy-plugin</artifactId>
                        <version>2.8.2</version>
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
    </project>
  • 设置log4j的配置文件

    properties
    log4j.rootLogger=DEBUG, stdout  
    
    
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
    log4j.appender.stdout.layout.ConversionPattern=[%p]\:%d{HH:mm:ss} %c(%L\u884C) %m%n

    自定义以生成逻辑

    java
    package com.neuedu.mp.generator;
    
    
    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.*;
    import com.baomidou.mybatisplus.generator.config.po.TableInfo;
    import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
    import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;
    import java.util.logging.Logger;
    
    // 演示例子,执行 main 方法控制台输入模块表名回车自动生成对应项目目录中
    public class CodeGenerator {
    
        /**
         * <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.isNotBlank(ipt)) {
                    return ipt;
                }
            }
            throw new MybatisPlusException("请输入正确的" + tip + "!");
        }
    
        public static void main(String[] args) {
            // 代码生成器
            AutoGenerator mpg = new AutoGenerator();
    
            // 全局配置
            GlobalConfig gc = new GlobalConfig();
    //        String projectPath = System.getProperty("user.dir");
            final String projectPath ="C:\\Users\\Administrator\\Desktop\\mp";
            gc.setOutputDir(projectPath + "/src/main/java");
            gc.setAuthor("金山");
            gc.setOpen(false);
            // gc.setSwagger2(true); 实体属性 Swagger2 注解
            mpg.setGlobalConfig(gc);
    
            // 数据源配置
            DataSourceConfig dsc = new DataSourceConfig();
            dsc.setUrl("jdbc:mysql://localhost:3306/ssm-java1?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();
            final String pack = "com.neuedu.his";
    //        pc.setModuleName(scanner("模块名"));
            pc.setParent(pack);
            mpg.setPackageInfo(pc);
    
            // 自定义配置
            InjectionConfig cfg = new InjectionConfig() {
                @Override
                public void initMap() {
                    // to do nothing
                }
            };
    
    //         如果模板引擎是 freemarker
            String templatePath = "/templates/mapper.xml.ftl";
            // 如果模板引擎是 velocity
            // String templatePath = "/templates/mapper.xml.vm";
    
            // 自定义输出配置
            List<FileOutConfig> focList = new ArrayList<>();
            // 自定义配置会被优先输出
            focList.add(new FileOutConfig(templatePath) {
                @Override
                public String outputFile(TableInfo tableInfo) {
                    // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
                    return projectPath + "/src/main/resources/mapper/"+pack.replace(".","/") +"/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
                }
            });
            /*
            cfg.setFileCreate(new IFileCreate() {
                @Override
                public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {
                    // 判断自定义文件夹是否需要创建
                    checkDir("调用默认方法创建的目录,自定义目录用");
                    if (fileType == FileType.MAPPER) {
                        // 已经生成 mapper 文件判断存在,不想重新生成返回 false
                        return !new File(filePath).exists();
                    }
                    // 允许生成模板文件
                    return true;
                }
            });
            */
            cfg.setFileOutConfigList(focList);
            mpg.setCfg(cfg);
    
            // 配置模板
            TemplateConfig templateConfig = new TemplateConfig();
    
            // 配置自定义输出模板
            //指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
            // templateConfig.setEntity("templates/entity2.java");
            // templateConfig.setService();
            // templateConfig.setController();
    
            templateConfig.setXml(null);
            mpg.setTemplate(templateConfig);
    
            // 策略配置
            StrategyConfig strategy = new StrategyConfig();
            strategy.setNaming(NamingStrategy.underline_to_camel);
            strategy.setColumnNaming(NamingStrategy.underline_to_camel);
    //        strategy.setSuperEntityClass("你自己的父类实体,没有就不用设置!");
            strategy.setEntityLombokModel(true);
    //        strategy.setRestControllerStyle(true);
            // 公共父类
    //        strategy.setSuperControllerClass("你自己的父类控制器,没有就不用设置!");
            // 写于父类中的公共字段
    //        strategy.setSuperEntityColumns("id");
    //        strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));  //默认生成所有表的
            strategy.setControllerMappingHyphenStyle(true);
    //        strategy.setTablePrefix(pc.getModuleName() + "_");
            mpg.setStrategy(strategy);
            mpg.setTemplateEngine(new FreemarkerTemplateEngine());
            mpg.execute();
        }
    
    }

16.3 在Sringmvc中使用 MP

使用ssm集成 MP

  • ssm

  • 将mybaits调换为 MP(Mybatis-PLUS)

    • 将mybatis的依赖替换成 MP的依赖
    • 删除mybatis、mybatis-spring pagehelper
    xml
    <!--mybatis-plus -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus</artifactId>
        <version>3.4.2</version>
    </dependency>
    
    <!-- 日志 -->
     <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>1.8.0-beta4</version>
            </dependency>
    
    
            <!-- https://mvnrepository.com/artifact/log4j/log4j -->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>
    • 修改SQLSessionFactory
    xml
    <bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource"/>
            <property name="mapperLocations" value="classpath:com/neuedu/his/mapper/*.xml"/>
            <property name="typeAliasesPackage" value="com.neuedu.his.entity"/>
        </bean>

    修改MapperScannerConfigurer扫描的Mapper包

    xml
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="com.neuedu.his.mapper"/>
        </bean>
    • 单元测试
    package com.neuedu.his.controller;
    
    
    import com.neuedu.his.service.IMenuService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.List;
    
    /**
     * <p>
     * 菜单 前端控制器
     * </p>
     *
     * @author 金山
     * @since 2021-03-30
     */
    @RestController
    @RequestMapping("/menu")
    public class MenuController {
    
        @Autowired
        IMenuService menuService;
    
    
        /**
         *  http://127.0.0.1:8080/mp/menu/list
         * @return
         */
        @RequestMapping("list")
        List list(){
            return menuService.list();
        }
    
    
    }

16.4 自定义sql

MP是对mybatis无侵入是的封装,自定义sql与mybatis原生的sql用法一样,定义Mapper.java、定义Mapper.java

16.5 分页

在IOC容器中给SQLSessionFactory 注入分页插件

xml
 <bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="mapperLocations" value="classpath:com/neuedu/his/mapper/*.xml"/>
        <property name="typeAliasesPackage" value="com.neuedu.his.entity"/>

        <property name="plugins">
            <array>
                <ref bean="mybatisPlusInterceptor"/>
            </array>
        </property>
    </bean>
    
    <bean id="mybatisPlusInterceptor" class="com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor">
        <property name="interceptors">
            <list>
                <ref bean="paginationInnerInterceptor"/>
            </list>
        </property>
    </bean>
    <!--分页插件-->
    <bean id="paginationInnerInterceptor" class="com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor">
        <constructor-arg name="dbType" value="MYSQL"/>
    </bean>
  • 测试代码
java
@Test
    public void page(){

        Integer pageNum = 2;
        Integer pageSize = 5;
        IPage<Menu> page = new Page(pageNum,pageSize);

        page = menuService.page(page);
        List<Menu>  list = page.getRecords();
        for (Menu menu : list) {
            System.out.println(menu);
        }
    }

16.7 自定义sql的分页

  • 在Mapper.xml 自定义sql。

    xml
        <select id="userSelectListPage" resultMap="resultMap">
            select * from menu 
        </select>
  • 在Mapper.java

    java
    Page<Menu> userSelectListPage(Page page);
  • 在service中使用

    java
    getBaseMapper().userSelectListPage(page);

    如果想在自定义sql中使用QueryWrapper封装的 where条件则代码如下:

    • Mapper.xml
    xml
      <select id="userSelectListPage" resultMap="resultMap">
            select * from menu ${ew.customSqlSegment}
        </select>
    • Mapper.java
    java
        Page<Menu> userSelectListPage(Page page, @Param(Constants.WRAPPER) Wrapper wrapper);
    • Service
     @Override
        public Page<Menu> userSelectListPage(Page page, Wrapper wrapper) {
            return getBaseMapper().userSelectListPage(page,wrapper);
        }
    • 测试代码
@Test
    public void userSelectListPage(){

        Integer pageNum = 1;
        Integer pageSize = 5;
        Page<Menu> page = new Page(pageNum,pageSize);

        QueryWrapper wrapper = new QueryWrapper();
        wrapper.like("menu_name","管理");
        page = menuService.userSelectListPage(page, wrapper);

        List<Menu>  list = page.getRecords();
        for (Menu menu : list) {
            System.out.println(menu);
        }
    }

17 日志

日志:可以按需的打印日志

常见的日志类库:

  • log4j
  • log4j2
  • logback
  • common-logging
  • jdk-log
  • Slf4J :日志的框架,抽象的,跟不同的日志的组件整合(log4j、logback)

17.1 SLF4J 整合log4j

  • 添加依赖
xml
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.21</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.7.21</version>
</dependency>
<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.17</version>
</dependency>
properties



> 总的配置开关,级别 trace  debug info warn  error falat
log4j.rootLogger=INFO, stdout  

>设置不同包的打印之日的 级别
log4j.logger.com.neuedu.his.service=ALL

>打印的外观
log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
log4j.appender.stdout.layout.ConversionPattern=[%p]\:%d{HH:mm:ss} %c(%L\u884C) %m%n
  • 程序中使用日志框架
java
package com.neuedu.his.service;

import lombok.extern.slf4j.Slf4j;

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Slf4j
public class Log4jTest {

    Logger log = LoggerFactory.getLogger(Log4jTest.class);

    @Test
    public void test(){
        log.trace("trace");
        log.debug("debug");
        log.info("info");
        log.warn("warn");
        log.error("error");
       
    }

}
  • lombok 对日志的支持,可以在类上面声明 @Slf4j注解,相当于在类中声明了log对象

Released under the MIT License.