Day14(springboot与mybatis整合、mybatis自动代码生成、swagger、thymeleaf、lombok环境配置、mybatisPlus介绍(自动代码生成))

srpingboot和mybatis整合

springbootSSM项目下载地址

链接:https://pan.baidu.com/s/11fwh1C7ZOg3jQVlXl2DJjQ
提取码:83yt

依赖

		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.3.2</version>
		</dependency>

mybatis自动代码生成

application.properties

server.port=8090
server.servlet.context-path=/spring
#thymeleaf
# \u524d\u7f00
spring.thymeleaf.prefix=classpath:/templates/
## \u540e\u7f00
spring.thymeleaf.suffix=.html

spring.datasource.url=jdbc\:mysql\://XXX\:3306/goods?characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

mybatis.mapper-locations=classpath:com/testfan/model/*.xml  
mybatis.type-aliases-package=com.testfan.model
#\u5206\u9875\u63d2\u4ef6
mybatis.config-location=classpath:mybatis-config.xml

#\u7ed9\u4ee3\u7801\u751f\u6210\u63d2\u4ef6\u4f7f\u7528  \u5982\u679c\u662f mac\u7cfb\u7edf\u8def\u5f84\u4fee\u6539\u6210 /
jdbc.driverPath=D:\\repository\\mysql\\mysql-connector-java\\5.1.47\\mysql-connector-java-5.1.47.jar
#\u751f\u6210\u7684\u5305\u54ea\u91cc
target_package=com.testfan
#\u5de5\u7a0b\u8def\u5f84  \u5982\u679c\u662f mac\u4fee\u6539\u6210src/main/java
project=src\\main\\java

logging.level.com.testfan.dao=debug

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DQOYnXv0-1590741740754)(Day14.assets/image-20200513084109351.png)]

自动代码生成xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
<generatorConfiguration>
	<properties resource="application.properties" />
	  <!-- 指定数据连接驱动jar地址 -->  
    <classPathEntry location="${jdbc.driverPath}" />  
	<!-- 此处指定生成针对MyBatis3的DAO -->
	<context id="context" targetRuntime="MyBatis3">
		
		  <!-- 生成的Java文件的编码 -->
        <property name="javaFileEncoding" value="UTF-8"/>
 
        <!-- 格式化java代码 -->
        <property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
 
        <!-- 格式化XML代码 -->
        <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>
 
         <!--beginningDelimiter和endingDelimiter:指明数据库的用于标记数据库对象名的符号,比如ORACLE就是双引号,MYSQL默认是`反引号;-->
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>
        
         <!-- 为生成的Java模型创建一个toString方法 -->
        <plugin type="org.mybatis.generator.plugins.ToStringPlugin" />
         <!-- 添加序列号方法 -->
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
        
         <!-- 重命名插件 -->
		<plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin" />
		<plugin type="org.mybatis.generator.plugins.RenameExampleClassPlugin">
			<property name="searchString" value="Example$" />
			<property name="replaceString" value="Criteria" />
		</plugin>
        
		<!-- 去掉生成出来的代码的注解 -->
		<commentGenerator>
			<property name="suppressAllComments" value="true" />
			<property name="suppressDate" value="true" />
		</commentGenerator>

		<!--数据库链接URL,用户名、密码 -->
		<jdbcConnection driverClass="${spring.datasource.driver-class-name}"
			connectionURL="${spring.datasource.url}" userId="${spring.datasource.username}" password="${spring.datasource.password}">
		</jdbcConnection>

		<!-- 默认false,表示把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer; true表示把JDBC DECIMAL 
			和 NUMERIC 类型解析为java.math.BigDecimal -->
		<javaTypeResolver>
			<property name="forceBigDecimals" value="false" />
		</javaTypeResolver>

		<!-- 生成bean对象 -->
		<javaModelGenerator targetPackage="${target_package}.model"
			targetProject="${project}">
			<!-- enableSubPackages:是否让schema作为包的后缀 -->
			<property name="enableSubPackages" value="true" />
			<!-- 从数据库返回的值被清理前后的空格 -->
			<property name="trimStrings" value="true" />
		</javaModelGenerator>

		<!-- 生成sqlMap xml -->
		<sqlMapGenerator targetPackage="${target_package}.model"
			targetProject="${project}">
			<property name="enableSubPackages" value="true" />
			</sqlMapGenerator>
	
		<!-- 生成DAO的类文件 -->
		<javaClientGenerator targetPackage="${target_package}.dao"
			targetProject="${project}" type="XMLMAPPER">
			<property name="enableSubPackages" value="true" />
		</javaClientGenerator>
		

		
	   <!-- 要生成的表 tableName是数据库中的表名或视图名 domainObjectName是实体类名 -->
<!-- 		<table tableName="user_t" domainObjectName="TUser" -->
<!-- 		 enableCountByExample="false" enableUpdateByExample="false" -->
<!--                 enableDeleteByExample="false" enableSelectByExample="false" -->
<!--                 selectByExampleQueryId="false"> -->
<!-- 			<property name="useActualColumnNames" value="false" /> -->
<!-- 		</table> -->

	  	<table tableName="t_user_test" domainObjectName="UserTest"/>
	</context>
</generatorConfiguration>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-USc2v8Xh-1590741740757)(Day14.assets/image-20200513084359132.png)]

自动代码生成:

选中项目或者pom.xml,右键–》RunAs–》maven build

运行命令:mybatis-generator:generate

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wXRYwp4b-1590741740758)(Day14.assets/image-20200513084722559.png)]

生成文件:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cYj1N5Vi-1590741740762)(Day14.assets/image-20200513084900321.png)]

使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-daMagT1U-1590741740763)(Day14.assets/image-20200513085835303.png)]

使用TUserMapper需要添加注解@MapperScan,默认不能被扫描

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b3dzIGDh-1590741740766)(Day14.assets/image-20200513090644275.png)]

可以添加全局扫描,这样每个Mappe对象就可以不用加注解了,路径可以根据实际写

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XmltrspH-1590741740767)(Day14.assets/image-20200513090850393.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5YCifbLf-1590741740768)(Day14.assets/image-20200513091001451.png)]

启动springboot项目,访问
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jUizCJiN-1590741740769)(Day14.assets/image-20200513085906947.png)]

sprinboot单元测试

junit单元测试

import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import com.testfan.model.UserTestCriteria;
import com.testfan.model.UserTestCriteria.Criteria;

@RunWith(SpringRunner.class)
@SpringBootTest   //扫描SpringbootTestApplication启动类,启动类扫描mapper
class UserTestMapperTest {

	@Autowired
	UserTestMapper userTestMapper;

	@Test
	void testSelectByExample() {
		UserTestCriteria userTestCriteria=new UserTestCriteria();
		Criteria criteria1=userTestCriteria.createCriteria();
		criteria1.andLoginnameLike("test%");
		userTestMapper.selectByExample(userTestCriteria);
	}

}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yecr0HnI-1590741740771)(Day14.assets/image-20200513092740357.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7vIp8L4c-1590741740773)(Day14.assets/image-20200513094213948.png)]

springboot之swagger

swagger在线接口文档

SpringBootSwagger项目下载地址

链接:https://pan.baidu.com/s/1wtNGquYAfwJ0UG3IBYAkPQ
提取码:xtqv

启动项目RunAs–>Spring Boot App

访问: http://localhost:8023/swagger-ui.html

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iM0nzyBE-1590741740774)(Day14.assets/image-20200513095250937.png)]

Swagger基础使用

依赖

		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger2</artifactId>
			<version>2.4.0</version>
		</dependency>
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger-ui</artifactId>
			<version>2.4.0</version>
		</dependency>

SwaggerConfiguration.java配置swagger描述等信息

注意:1.添加注解@Configuration、@EnableSwagger2,才能被扫描。

2.注意根据controller所在包路径填写路径;//暴露接口地址的包路径

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-skJjZ2aG-1590741740775)(Day14.assets/image-20200513102442609.png)]

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfiguration {

    /**
     * swagger2的配置文件,这里可以配置swagger2的一些基本的内容,比如扫描的包等等
     * @return
     */
    @Bean
    public Docket createRestfulApi(){
        return new Docket(DocumentationType.SWAGGER_2)
        		.apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.lance.learn.springbootswagger.controller"))  //暴露接口地址的包路径
                .paths(PathSelectors.any())
                .build();
    }

    /**
     * 构建 api文档的详细信息函数,注意这里的注解引用的是哪个
     * @return
     */
    private ApiInfo apiInfo(){
        return new ApiInfoBuilder()
                //页面标题
                .title("Spring Boot 测试使用 Swagger2 构建RESTful API")
                //创建人
                .contact(new Contact("testfan", "http://ask.testfan.cn", "917484312@qq.com"))
                //版本号
                .version("2.0")
                //描述
                .description("API 描述")
                .build();
    }
}

swagger参数说明

@Api:用在类上,说明该类的作用。

@ApiOperation:注解来给API增加方法说明。

@ApiImplicitParams : 用在方法上包含一组参数说明。

示例演示前后端对比
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HofJ6YQ1-1590741740776)(Day14.assets/image-20200513102950825.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iUGpcLG1-1590741740777)(Day14.assets/image-20200513103027701.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f9nfp27G-1590741740779)(Day14.assets/image-20200513102847289.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mXkBn0Xn-1590741740780)(Day14.assets/image-20200513103405829.png)]

请求参数是json对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hXZCcDNG-1590741740781)(Day14.assets/image-20200513130606968.png)]

对象需要添加注解@ApiModel、@ApiModelProperty

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9F256A70-1590741740782)(Day14.assets/image-20200513130642015.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1EkEOUe4-1590741740784)(Day14.assets/image-20200513130743264.png)]

swagger与springbootSSM集成

依赖

		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger2</artifactId>
			<version>2.4.0</version>
		</dependency>
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger-ui</artifactId>
			<version>2.4.0</version>
		</dependency>

拷贝SwaggerConfiguration.java配置swagger描述等信息

注意修改接口地址的路径为实际路径

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfiguration {

    /**
     * swagger2的配置文件,这里可以配置swagger2的一些基本的内容,比如扫描的包等等
     * @return
     */
    @Bean
    public Docket createRestfulApi(){
        return new Docket(DocumentationType.SWAGGER_2)
        		.apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.testfan.controller"))  //暴露接口地址的包路径
                .paths(PathSelectors.any())
                .build();
    }

    /**
     * 构建 api文档的详细信息函数,注意这里的注解引用的是哪个
     * @return
     */
    private ApiInfo apiInfo(){
        return new ApiInfoBuilder()
                //页面标题
                .title("Spring Boot 测试使用 Swagger2 构建RESTful API")
                //创建人
                .contact(new Contact("testfan", "http://ask.testfan.cn", "917484312@qq.com"))
                //版本号
                .version("2.0")
                //描述
                .description("API 描述")
                .build();
    }

}

启动项目访问: http://localhost:8090/spring/swagger-ui.html#/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3hjAxlED-1590741740785)(Day14.assets/image-20200513105336769.png)]

错误演示

如果是@RequestMapping,需要添加请求类型,如果是@GetMapping、@PostMapping则不用。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PVrJXsmq-1590741740786)(Day14.assets/image-20200513125038385.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3gOiah8j-1590741740787)(Day14.assets/image-20200513125057786.png)]

swagger与yapi结合

两者结合产生接口测试文档

步骤:1.访问 http://localhost:8023/v2/api-docs ,右键,另存为xxx.json文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VAyfKnZv-1590741740788)(Day14.assets/image-20200513131035666.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IQ9jf2bm-1590741740789)(Day14.assets/image-20200513132224722.png)]

使用docker搭建yapi服务,启动yapi服务,把xxx.json文件导入到yapi中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZQJ4ZLcK-1590741740790)(Day14.assets/image-20200513132203729.png)]

导入成功后,页面如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I1TqybhT-1590741740791)(Day14.assets/image-20200513132415677.png)]

从yapi导出html格式到本地

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CYD9OhDE-1590741740791)(Day14.assets/image-20200513133421425.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b1mtEHGp-1590741740793)(Day14.assets/image-20200513133510429.png)]

打开html文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zZqNWGOk-1590741740794)(Day14.assets/image-20200513133456890.png)]

thymeleaf与springboot整合

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CJxd6NK0-1590741740795)(Day14.assets/image-20200513135441841.png)]

html页面的使用需要带 th:标签

<span th:text="${msg}"></span>
<input type="text" name="username" th:value="${msg}"/>
<span th:text="${#dates.format(key,'yyy/MM/dd')}"></span>
<span th:text="${#dates.year(key)}"></span>

<table border="1">
		<tr>
			<th>ID</th>
			<th>Name</th>
			<th>Age</th>
			<th>Index</th>
			<th>Count</th>
			<th>Size</th>
			<th>Even</th>
			<th>Odd</th>
			<th>First</th>
			<th>lase</th>
		</tr>
		<tr th:each="u,var : ${list}">
			<td th:text="${u.userid}"></td>
			<td th:text="${u.username}"></td>
			<td th:text="${u.userage}"></td>
			<td th:text="${var.index}"></td>
			<td th:text="${var.count}"></td>
			<td th:text="${var.size}"></td>
			<td th:text="${var.even}"></td>
			<td th:text="${var.odd}"></td>
			<td th:text="${var.first}"></td>
			<td th:text="${var.last}"></td>
		</tr>
	</table>
	<!-- if标签额使用 -->
	<span th:if="${sex} == ''">
		性别:男
	</span>
	<span th:if="${sex} == ''">
		性别:女
	</span>
	<hr/>
	<div th:switch="${id}">
		<span th:case="1">ID为1</span>
		<span th:case="2">ID为2</span>
		<span th:case="3">ID为3</span>
	</div>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Thymeleaf-URL</title>
</head>
<body>
	<a href="http://www.baidu.com">绝对路径</a><br/>
	<a th:href="@{http://www.baidu.com}">thyemleaf绝对路径</a><br/>
	<hr/>
	<a th:href="@{/show}">相对路径</a>
	<hr/>
	<a th:href="@{/show(id=1,name=zhagnsan)}">相对路径-传参</a>
	<hr/>
	<a th:href="@{/path/{id}/show(id=1,name=zhagnsan)}">相对路径-传参-restful</a>
</body>
</html>

资源访问方式

<script type="text/javascript" th:src="@{/js/main.js}"></script> 

lombok环境配置

先下载lombok.jar包,然后切换到lombok.jar文件夹,cmd运行java -jar lombok.jar

lombok.jar下载地址:

链接:https://pan.baidu.com/s/1JHeMvLf9rupA9ztxSkUnfA
提取码:t8ke

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QhndeSF2-1590741740797)(C:\Users\wys\AppData\Roaming\Typora\typora-user-images\image-20200326090331613.png)]

以上lombok安装的实质是:将lombok.jar ,拷贝到sts安装目录下,然后在sts.ini配置信息中添加了lombok包路径

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gAJqmPFN-1590741740797)(C:\Users\wys\AppData\Roaming\Typora\typora-user-images\image-20200326092334590.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iQhQyxK2-1590741740798)(C:\Users\wys\AppData\Roaming\Typora\typora-user-images\image-20200326092402514.png)]

项目中使用:

依赖架包:

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<scope>provided</scope>
		</dependency>

使用效果如下,免写set\get方法,主要使用注解@Data

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor //所有参数构造方法
@NoArgsConstructor  //无参数构造方法
public class BookLombok {
	 	private String bid;

	    private String bname;

	    private String author;
}

常用注解:
@Data:注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、hashCode、toString 方法
@Setter:注解在属性上;为属性提供 setting 方法
@Getter:注解在属性上;为属性提供 getting 方法
@NoArgsConstructor:注解在类上;为类提供一个无参的构造方法
@AllArgsConstructor:注解在类上;为类提供一个全参的构造方法

idea教程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nlwh2aVk-1590741740799)(C:\Users\wys\AppData\Roaming\Typora\typora-user-images\image-20200326091807768.png)]

MybatisPlus介绍

springboot_mybatisplus项目下载:

链接:https://pan.baidu.com/s/1VzxXOUSITDFJ9Hcv1bCVNA
提取码:ae80

依赖架包

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

dao继承了BaseMapper,跟springmybatis相比,免写了XXMapper.xml

import java.util.List;
import org.apache.ibatis.annotations.Select;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.mybatisplus.springboot.entity.User;


public interface UserMapper extends BaseMapper<User> {
	//自定义sql
	@Select("SELECT * from  user_t where user_name=#{name}")
	public List<User> selectByName(String name);
  
}

对象和数据库表对应关系,通过注解@TableName,主键对应通过@TableId,属性通过注解@TableField

主键生成策略:IdType

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SBf4gVds-1590741740800)(C:\Users\wys\AppData\Roaming\Typora\typora-user-images\image-20200326095259487.png)]

测试使用如下:

@RunWith(SpringRunner.class)
@SpringBootTest
public class MybatisPlusSpringbootApplicationTests {
	
	@Autowired
	UserMapper userMapper;
	
	@Autowired
	TBookMapper tbookMapper;
	
	@Autowired @Qualifier("bookservice")
	ITBookService bookService;

	
	@Test
	public void contextLoads() {
		QueryWrapper<User> qw=new QueryWrapper<User>();
		qw.eq("user_name", "haha11");
		qw.eq("id", "2002");
		qw.or();
		qw.eq("age", 18);
		userMapper.selectList(qw);
	}
}

执行sql:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wxvV3uUZ-1590741740801)(Day14.assets/image-20200513153437343.png)]

mybatis-plus and支持

QueryWrapper qryWrapper = new QueryWrapper();
qryWrapper.eq("id", "1");
qryWrapper.eq("password", "1");
userMapper.selectList(qryWrapper);

mybatis-plus or支持

QueryWrapper qryWrapper = new QueryWrapper();
qryWrapper.eq("id", "1");
qryWrapper.like("id", "1");
qryWrapper.or();
qryWrapper.eq("password", "1");

mybatisPlus自定义sql如下:

import java.util.List;
import org.apache.ibatis.annotations.Select;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.mybatisplus.springboot.entity.User;

public interface UserMapper extends BaseMapper<User> {
	//自定义sql
	@Select("SELECT * from  user_t where user_name=#{name}")
	public List<User> selectByName(String name);
}

Mybatis-Plus官网

https://mp.baomidou.com/guide/generator.html

mybatisPlus相比mybatis简化了很多,mapper里面不用写方法,继承了extends BaseMapper,对象user通过注解@TableName(“表名”)与数据库形成对应关系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uWRM4hi7-1590741740801)(Day14.assets/image-20200513154656825.png)]

自定义sql,使用注解@Select

import java.util.List;

import org.apache.ibatis.annotations.Select;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.mybatisplus.springboot.entity.User;

/**
 * <p>
 * user Mapper 接口
 */
public interface UserMapper extends BaseMapper<User> {

	//自定义sql
	@Select("SELECT * from  user_t where user_name=#{name}")
	public List<User> selectByName(String name);
  
}

mybatisPlus自动代码生成

Mybatis-Plus官网

https://mp.baomidou.com/guide/generator.html

运行CodeGenerator.java,输入模块名usertest,输入数据库表名t_user_test,自动生成controller、entity、mapper、service

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-75NwTs0V-1590741740802)(Day14.assets/image-20200513160359185.png)]

pom.xml依赖

		<!-- mybaits-plus自动代码生成 -->
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-generator</artifactId>
			<version>3.2.0</version>
		</dependency>
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
		<!-- velocity 模板引擎, 默认 -->
		<dependency>
			<groupId>org.apache.velocity</groupId>
			<artifactId>velocity-engine-core</artifactId>
			<version>2.0</version>
		</dependency>

		<!-- freemarker 模板引擎 -->
		<dependency>
			<groupId>org.freemarker</groupId>
			<artifactId>freemarker</artifactId>
			<version>2.3.28</version>
		</dependency>

		<!-- beetl 模板引擎 -->
		<dependency>
			<groupId>com.ibeetl</groupId>
			<artifactId>beetl</artifactId>
			<version>2.9.8</version>
		</dependency>

CodeGenerator.java自动生成代码运行此文件,注意修改数据库配置信息


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;
 
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
 
/**
 * <p>
 * mysql 代码生成器演示例子
 * </p>
 */
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.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("wys_testfan");
        gc.setOpen(false);
        gc.setSwagger2(true);
        mpg.setGlobalConfig(gc);
 
        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://118.24.13.38:3308/goods?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2B8");
        // dsc.setSchemaName("public");
        dsc.setDriverName("com.mysql.jdbc.Driver");
        dsc.setUsername("zhangsan");
        dsc.setPassword("123123");
        mpg.setDataSource(dsc);
 
        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName(scanner("模块名"));
        pc.setParent("com.mybatisplus.springboot");
        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 + "/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.example.demo.entity");
        strategy.setEntityLombokModel(true);
//设置生成controller类的继承类,不需要可不用,我这注释掉了
//        strategy.setSuperControllerClass("com.example.demo.controller");
        strategy.setInclude(scanner("表名"));
        strategy.setSuperEntityColumns("id");
        strategy.setControllerMappingHyphenStyle(true);
        strategy.setTablePrefix(pc.getModuleName() + "_");
        mpg.setStrategy(strategy);
        // 选择 freemarker 引擎需要指定如下加,注意 pom 依赖必须有!
        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        mpg.execute();
    }

}

运行:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KywoFWGx-1590741740804)(Day14.assets/image-20200514093317641.png)]

生成包名 及mapper xml文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e8dN4vj2-1590741740805)(Day14.assets/image-20200514093410402.png)]

MyBatis-Plus 代码生成参数改动说明

核心Config类作用

GlobalConfig (设置代码作者,日期 等信息)

PackageConfig (设置父包相关配置)

TemplateConfig (设置代码生成模板相关配置)

StrategyConfig (设置相关生成策略)

代码中相关修改

// strategy.setSuperEntityClass(“com.testfan.BaseEntity”); 去掉官网的父类继承

打开实体类swagger 支持

globalConfig .setSwagger2(true);

mapper.xml 文件生成 BaseResultMap
globalConfig .setBaseResultMap(true);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xnQhmci7-1590741740806)(Day14.assets/1572487141710.png)]

使用自动代码生成后的代码

1、自动代码生成的,使用@autowired 注入service找到两个会报错,需要在service中添加注解,根据名字获取

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w41Zx9d1-1590741740807)(Day14.assets/image-20200513163125324.png)]

修改后在service实现类中添加名字

@Service("userTestServiceabc")
public class TUserTestServiceImpl extends ServiceImpl<TUserTestMapper, TUserTest> implements ITUserTestService {

}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-stlMBG9N-1590741740807)(Day14.assets/image-20200513163829202.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x9DWXBco-1590741740809)(Day14.assets/image-20200513164010507.png)]

2、执行保存没有主键,需要在对象TUserTest中添加主键@TableId(type = IdType.UUID)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MQjipZsv-1590741740810)(Day14.assets/image-20200513164515717.png)]

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;

import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

/**
 * <p>
 * 
 * </p>
 *
 * @author wys_testfan
 * @since 2020-05-13
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="TUserTest对象", description="")
public class TUserTest implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId(type = IdType.UUID)
    private String uid;

    private String loginname;

    private String loginpass;


}

使用代码:

package com.mybatisplus.springboot;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.mybatisplus.springboot.Book.entity.TBook;
import com.mybatisplus.springboot.Book.mapper.TBookMapper;
import com.mybatisplus.springboot.Book.service.ITBookService;
import com.mybatisplus.springboot.dao.UserMapper;
import com.mybatisplus.springboot.entity.User;
import com.mybatisplus.springboot.usertest.entity.TUserTest;
import com.mybatisplus.springboot.usertest.service.ITUserTestService;

@RunWith(SpringRunner.class)
@SpringBootTest
public class MybatisPlusSpringbootApplicationTests {
	
	@Autowired
	UserMapper userMapper;
	
	@Autowired
	TBookMapper tbookMapper;
	
	//@Resource(name = "userTestServiceabc")
	@Autowired @Qualifier("userTestServiceabc") //找不到通过name查找
	ITUserTestService userTestService;
	
	//@Resource(name = "bookservice")
	@Autowired @Qualifier("bookservice")
	ITBookService bookService;

	@Test
	public void userTest1() {
		TUserTest usertest=new TUserTest();
		usertest.setLoginname("loginname_wang");
		usertest.setLoginpass("loginpass_123456");
		userTestService.save(usertest);
        
        QueryWrapper qw=new QueryWrapper();
		qw.likeRight("loginname", "login");
		userTestService.count(qw);
	}
	
	
	//@Test
	public void contextLoads() {
		QueryWrapper<User> qw=new QueryWrapper<User>();
		qw.eq("user_name", "haha11");
		qw.eq("id", "2002");
		qw.or();
		qw.eq("age", 18);
		userMapper.selectList(qw);
	}
	
//	@Test
	public void test2() {
		userMapper.selectByName("haha11");
	}
	
//	@Test
	public void test3() {
		QueryWrapper<TBook> qw=new QueryWrapper<TBook>();
		tbookMapper.selectList(qw);
	}
	
	//@Test
	@Transactional
	public void test4() {
		TBook book=new TBook();
		book.setBname("java测试开发");
		book.setAuthor("wys");
		bookService.save(book);
		
		QueryWrapper<TBook> qw=new QueryWrapper<TBook>();
		qw.like("bname", "Java");
		int c=bookService.count(qw);
		System.out.println(c);
//		bookService.list(qw);
	}

}

3.脏数据自动回滚,使用注解@Transactional

4.支持复杂查询,使用QueryWrapper

	@Test
	@Transactional
	public void userTest1() {
		TUserTest usertest=new TUserTest();
		usertest.setLoginname("loginname_wang");
		usertest.setLoginpass("loginpass_123456");
		userTestService.save(usertest);
		
		QueryWrapper qw=new QueryWrapper();
		qw.likeRight("loginname", "login");
		userTestService.count(qw);
	}

mybatisPlus自动代码生成2

第二种自动代码生成可以生成多个表数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mKjYR1HB-1590741740811)(Day14.assets/image-20200514094359866.png)]

运行代码:

注意修改数据库,和要生成的表名。


import com.baomidou.mybatisplus.annotation.DbType;
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;

public class CodeGenerator2 {


	public static void main(String[] args) {
		// 指定包名
		String packageName = "com.mybatisplus.springboot";
		// user -> UserService, 设置成true: user -> IUserService
		boolean serviceNameStartWithI = false;
		// 指定生成的表名
		String[] tableNames = new String[] { "t_role", "t_case", "t_order" };
		generateByTables(serviceNameStartWithI, packageName, tableNames);
	}
	
	/**
	 * 配置数据源
	 * 
	 * @return 数据源配置 DataSourceConfig
	 * @author Terry
	 */
	private static DataSourceConfig getDataSourceConfig() {
		String dbUrl = "jdbc:mysql://192.168.21.134:3306/goods?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2B8";
		return new DataSourceConfig().setDbType(DbType.MYSQL).setUrl(dbUrl).setUsername("root").setPassword("123456")
				.setDriverName("com.mysql.jdbc.Driver");
	}

	/**
	 * 根据表自动生成
	 * 
	 * @param serviceNameStartWithI 默认为false
	 * @param packageName           包名
	 * @param tableNames            表名
	 * @author Terry
	 */
	private static void generateByTables(boolean serviceNameStartWithI, String packageName, String... tableNames) {
		// 配置数据源
		DataSourceConfig dataSourceConfig = getDataSourceConfig();
		// 策略配置
		StrategyConfig strategyConfig = getStrategyConfig(tableNames);
		// 全局变量配置
		GlobalConfig globalConfig = getGlobalConfig(serviceNameStartWithI);
		// 包名配置
		PackageConfig packageConfig = getPackageConfig(packageName);
		// 自动生成
		atuoGenerator(dataSourceConfig, strategyConfig, globalConfig, packageConfig);
	}

	/**
	 * 集成
	 * 
	 * @param dataSourceConfig 配置数据源
	 * @param strategyConfig   策略配置
	 * @param config           全局变量配置
	 * @param packageConfig    包名配置
	 * @author Terry
	 */
	private static void atuoGenerator(DataSourceConfig dataSourceConfig, StrategyConfig strategyConfig,
			GlobalConfig config, PackageConfig packageConfig) {
		new AutoGenerator().setGlobalConfig(config).setDataSource(dataSourceConfig).setStrategy(strategyConfig)
				.setPackageInfo(packageConfig).execute();
	}

	/**
	 * 设置包名
	 * 
	 * @param packageName 父路径包名
	 * @return PackageConfig 包名配置
	 * @author Terry
	 */
	private static PackageConfig getPackageConfig(String packageName) {
		return new PackageConfig().setParent(packageName).setXml("mapper").setMapper("dao").setController("controller")
				.setEntity("entity");
	}

	/**
	 * 全局配置
	 * 
	 * @param serviceNameStartWithI false
	 * @return GlobalConfig
	 * @author Terry
	 */
	private static GlobalConfig getGlobalConfig(boolean serviceNameStartWithI) {
		GlobalConfig globalConfig = new GlobalConfig();
		globalConfig.setBaseColumnList(true).setBaseResultMap(true).setActiveRecord(false).setAuthor("Terry")
				// 设置输出路径
				.setOutputDir(getOutputDir()).setFileOverride(true);
		if (!serviceNameStartWithI) {
			// 设置service名
			globalConfig.setServiceName("%sService");
		}
		return globalConfig;
	}

	/**
	 * 返回项目路径
	 * 
	 * @param projectName 项目名
	 * @return 项目路径
	 * @author Terry
	 */
	private static String getOutputDir() {
		String projectPath = System.getProperty("user.dir");
		return  projectPath + "/src/main/java/";
	}

	/**
	 * 策略配置
	 * 
	 * @param tableNames 表名
	 * @return StrategyConfig
	 * @author Terry
	 */
	private static StrategyConfig getStrategyConfig(String... tableNames) {
		return new StrategyConfig()
				// 全局大写命名 ORACLE 注意
				.setCapitalMode(true).setEntityLombokModel(false)
				// 从数据库表到文件的命名策略
				.setNaming(NamingStrategy.underline_to_camel)
				// 需要生成的的表名,多个表名传数组
				.setInclude(tableNames);
	}
}


版权声明:本文为weixin_39919087原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。