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
自动代码生成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>
自动代码生成:
选中项目或者pom.xml,右键–》RunAs–》maven build
运行命令:mybatis-generator:generate
生成文件:
使用
使用TUserMapper需要添加注解@MapperScan,默认不能被扫描
可以添加全局扫描,这样每个Mappe对象就可以不用加注解了,路径可以根据实际写
启动springboot项目,访问
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);
}
}
springboot之swagger
swagger在线接口文档
SpringBootSwagger项目下载地址
链接:https://pan.baidu.com/s/1wtNGquYAfwJ0UG3IBYAkPQ
提取码:xtqv
启动项目RunAs–>Spring Boot App
访问: http://localhost:8023/swagger-ui.html
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所在包路径填写路径;//暴露接口地址的包路径
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 : 用在方法上包含一组参数说明。
示例演示前后端对比
请求参数是json对象
对象需要添加注解@ApiModel、@ApiModelProperty
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#/
错误演示
如果是@RequestMapping,需要添加请求类型,如果是@GetMapping、@PostMapping则不用。
swagger与yapi结合
两者结合产生接口测试文档
步骤:1.访问 http://localhost:8023/v2/api-docs ,右键,另存为xxx.json文件
使用docker搭建yapi服务,启动yapi服务,把xxx.json文件导入到yapi中
导入成功后,页面如下:
从yapi导出html格式到本地
打开html文件
thymeleaf与springboot整合
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
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
以上lombok安装的实质是:将lombok.jar ,拷贝到sts安装目录下,然后在sts.ini配置信息中添加了lombok包路径
项目中使用:
依赖架包:
<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教程
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
测试使用如下:
@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:
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(“表名”)与数据库形成对应关系
自定义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
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();
}
}
运行:
生成包名 及mapper xml文件
MyBatis-Plus 代码生成参数改动说明
核心Config类作用
GlobalConfig (设置代码作者,日期 等信息)
PackageConfig (设置父包相关配置)
TemplateConfig (设置代码生成模板相关配置)
StrategyConfig (设置相关生成策略)
代码中相关修改
// strategy.setSuperEntityClass(“com.testfan.BaseEntity”); 去掉官网的父类继承
打开实体类swagger 支持
globalConfig .setSwagger2(true);
mapper.xml 文件生成 BaseResultMap
globalConfig .setBaseResultMap(true);
使用自动代码生成后的代码
1、自动代码生成的,使用@autowired 注入service找到两个会报错,需要在service中添加注解,根据名字获取
修改后在service实现类中添加名字
@Service("userTestServiceabc")
public class TUserTestServiceImpl extends ServiceImpl<TUserTestMapper, TUserTest> implements ITUserTestService {
}
2、执行保存没有主键,需要在对象TUserTest中添加主键@TableId(type = IdType.UUID)
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
第二种自动代码生成可以生成多个表数据
运行代码:
注意修改数据库,和要生成的表名。
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);
}
}