SpringBoot整合Mybatis整合的一些坑。
SpringBoot整合Mybatis整合的一些坑。
第一次文章不懂咋写粗暴点直接上代码教程,本次代教程集成mybatis的逆向工程
整合参考文献
逆向工程参考文献
整合工程我放在github
1、创建springboot工程
这里没什么好讲的
勾选 spirng Web、
勾选 Spring Data JDBC 、Mybatis、Mysql Driver (备注:如果你是其他数据库勾选其他的)
下一步、下一步、创建完成之后
2、maven依赖
2.1、pom.xml依赖**
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
2.2、这里讲到mybatis的逆向工程的插件!!!
<!-- mybatis generator 自动生成代码插件 -->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<configurationFile>${basedir}/src/main/resources/mybatis-generator.xml</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
</plugin>
等待下载完成之后…
3、配置springboot的配置文件
3.1、这里推荐用xxxx.yml文件简介、层级关系。
- 创建application.yml
spring:
profiles:
active: dev
- 创建application-dev.yml
server:
port: 8080
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/gmall_study?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
driver-class-name: com.mysql.jdbc.Driver
thymeleaf:
prefix: classpath:/templates/
mybatis:
mapper-locations: classpath:mapping/*Mapper.xml
type-aliases-package: com.atguigu.gmall.user.pojo
4、配置mybatis逆向工程
4.1、在Rsource目录创建一个mapping文件夹
- 这是目录结构。
4.2、在Rsource底下创建mybatis-generator.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>
<!--mysql 连接数据库jar 这里选择自己本地位置-->
<classPathEntry
location="E:\NZshipping\generatorSqlmapCustom\lib\mysql-connector-java-5.1.28-bin.jar"/>
<context id="testTables" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/gmall_study?serverTimezone=UTC" userId="root"
password="123456">
</jdbcConnection>
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- targetProject:生成PO类的位置 -->
<javaModelGenerator targetPackage="com.example.demo.entity"
targetProject="src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false"/>
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置
如果maven工程只是单独的一个工程,targetProject="src/main/java"
若果maven工程是分模块的工程,targetProject="所属模块的名称",例如:
targetProject="ecps-manager-mapper",下同-->
<sqlMapGenerator targetPackage="mapping"
targetProject="src/main/resources">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<!-- targetPackage:mapper接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.example.demo.mapper"
targetProject="src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false"/>
</javaClientGenerator>
<!-- 指定数据库表 多个表示,可用多个table标签-->
<table schema="" tableName="ums_member"></table>
</context>
</generatorConfiguration>
4.2、配置maven启动插件
以免打错我吧上面这一行贴出来:mybatis-generator:generate -e
点击OK
配置完成之后启动…
启动成功
这是逆向生成的文件
5、接下来我们来测试
在springboot启动文件里面加入
@MapperScan(basePackages = "你的mapper的目录")
别漏掉(非常重要)
5.2、建一个工具返回前端 result 类
package com.atguigu.gmall.user.common;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.Serializable;
import java.util.List;
/**
* json结果集
*/
public class ResultList implements Serializable {
// 定义jackson对象
private static final ObjectMapper MAPPER = new ObjectMapper();
// 响应业务状态
private Integer status;
// 响应消息
private String msg;
// 响应中的数据
private Object data;
public static ResultList build(Integer status, String msg, Object data) {
return new ResultList(status, msg, data);
}
public static ResultList ok(Object data) {
return new ResultList(data);
}
public static ResultList ok() {
return new ResultList(null);
}
public ResultList() {
}
public static ResultList build(Integer status, String msg) {
return new ResultList(status, msg, null);
}
public ResultList(Integer status, String msg, Object data) {
this.status = status;
this.msg = msg;
this.data = data;
}
public ResultList(Object data) {
this.status = 200;
this.msg = "OK";
this.data = data;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
/**
* 将json结果集转化为Result对象
*
* @param jsonData
* json数据 传的是Result的对象的Json字符串
* @param clazz
* TaotaoResult中的object类型
* @return
*/
public static ResultList formatToPojo(String jsonData, Class<?> clazz) {
try {
if (clazz == null) {
return MAPPER.readValue(jsonData, ResultList.class);
}
JsonNode jsonNode = MAPPER.readTree(jsonData);
JsonNode data = jsonNode.get("data");
Object obj = null;
if (clazz != null) {
if (data.isObject()) {
obj = MAPPER.readValue(data.traverse(), clazz);
} else if (data.isTextual()) {
obj = MAPPER.readValue(data.asText(), clazz);
}
}
return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj);
} catch (Exception e) {
return null;
}
}
/**
* 没有object对象的转化
*
* @param json
* @return
*/
public static ResultList format(String json) {
try {
return MAPPER.readValue(json, ResultList.class);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* Object是集合转化
*
* @param jsonData 传的是Result的对象的Json字符串
* json数据
* @param clazz
* 集合中的类型
* @return
*/
public static ResultList formatToList(String jsonData, Class<?> clazz) {
try {
JsonNode jsonNode = MAPPER.readTree(jsonData);
JsonNode data = jsonNode.get("data");
Object obj = null;
if (data.isArray() && data.size() > 0) {
obj = MAPPER.readValue(data.traverse(),
MAPPER.getTypeFactory().constructCollectionType(List.class, clazz));
}
return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj);
} catch (Exception e) {
return null;
}
}
}
这是代码目录结构
- UserServiceImpl
- UserService
- UserController
、切记别重复逆向生成…
6、接下去我们打开Postman
😊我们拿数据了。