16 Mybatis-PLUS MP
16.1 官网
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的配置文件
propertieslog4j.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
自定义以生成逻辑
javapackage 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
javaPage<Menu> userSelectListPage(Page page);
在service中使用
javagetBaseMapper().userSelectListPage(page);
如果想在自定义sql中使用QueryWrapper封装的 where条件则代码如下:
- Mapper.xml
xml<select id="userSelectListPage" resultMap="resultMap"> select * from menu ${ew.customSqlSegment} </select>
- Mapper.java
javaPage<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>
- 编辑log4j的日志配置文件
- 配置文件详解:https://my.oschina.net/u/3359365/blog/1559125
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对象
