Springboot 整合Mybatis 逆向工程(详解版)
什么逆向工程
分析数据库中数据表,自动生成JavaBean(与数据库表对应的实体类)、dao 接口(数据访问层接口,定义了访问数据的方法)、SQLMap (sql 语句映射文件,与dao层接口类一一对应)
step1:写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>
<!-- 在maven中配置了依赖这个就可以注释掉了-->
<!-- <classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />-->
<context id="DB2Tables" targetRuntime="MyBatis3">
<!--数据库连接信息-->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://10.10.10.10:3306/meeting?useUnicode=true&characterEncoding=utf-8&serverTimezone=CTT"
userId="root"
password="root">
</jdbcConnection>
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!--JavaBean 实体类-->
<javaModelGenerator targetPackage="top.crxk.MyBatisGenerator.entity" targetProject="./src/main/java">
<property name="enableSubPackages" value="false" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!--SQL映射文件-->
<sqlMapGenerator targetPackage="mapping" targetProject="/Users/crxk/Documents/codeWorld/dhu/Learning/MyBatisGenerator/src/main/resources">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!--Mapper接口-->
<javaClientGenerator type="XMLMAPPER" targetPackage="top.crxk.MyBatisGenerator.dao" targetProject="/Users/crxk/Documents/codeWorld/dhu/Learning/MyBatisGenerator/src/main/java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!--配置所要生成代码的表-->
<table schema="DB2ADMIN" tableName="task" domainObjectName="Task" >
</table>
</context>
</generatorConfiguration>
关于一些配置项的解释:
targetPackage
用于配置生成的代码要放在哪个包里面, 这个如果没有的话Mybatis Generator会自动创建。
targetProject
官方定义是
This is used to specify a target project for the generated objects.
用最直白的语句解释就是:targetPackage所在的目录,也就是targetPackage的父目录。
这个目录是一定要有的,如果没有的话Mybatis generator不会自动创建。
这里的路径可以写绝对路径,也可以写相对路径,相对路径是相对于这个xml配置文件的!
最坑的一点:
关于为什么Mybatis generator程序运行成功以后,并没有代码文件生成的问题,是因为:
mac和windows有些不一样
mac下路径要这样写./src
windows下的路径是这样写.src
这个是很坑的,mbg不会给出错误提示!
step2:运行程序生成代码
Mybatis Generator官方提供了很多种方式来生成代码,但最好用最灵活的是直接写一段Java代码,读取配置文件,来生成目标代码。
package top.crxk.MyBatisGenerator;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class TestMbg {
public static void main(String[] args) throws Exception{
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
// 从这里加载配置文件,此时要注意路径
// 其他的代码不用动,直接运行即可
File configFile = new File("mbg.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
}
}
step3:使用目标代码
Mybatis Generator生成的代码提供了非常强大的对于单表的 增删改查的操作。
每一个表mbg会生成四个文件,以task表为例,分别是
- Task.java
- TaskExample.java
- TaskMapper.java
- TaskMapper.xml
使用TaskExample.java这个类可动态地定义出各种条件查询子句,满足对于单个表的各种增删改查的操作,如果不涉及到其他的表,基本上不用和其他文件打交道了。
举个例子:
@Controller
@ResponseBody
@RequestMapping("/test")
public class testMbgController {
@Autowired
TaskMapper taskMapper;
@Autowired
TaskExample taskExample;
@RequestMapping("/countByExample")
public long countByExample(int id) {
taskExample.or().andIdEqualTo(id);
return taskMapper.countByExample(taskExample);
}
@RequestMapping("/selectByExample")
public List<Task> selectByExample() {
taskExample.or().andIdEqualTo(12);
return taskMapper.selectByExample(taskExample);
}
}
相关细节
TaskExample.Criteria
主要就是定义各种查询条件的,是TaskExample的核心。
taskExample.or()
调用taskExample的or()方法,会返回一个Criteria,Criteria定义了与数据表中各个字段相关的方法,调用这些方法来设置条件,可以链式调用以添加多个条件。
taskExample.or().andIdEqualTo(12).andDeviceIdIsNull();
所包含的条件
- IS NULL-表示相关列必须为NULL
- IS NOT NULL-表示相关列不能为NULL
- =(等于)-表示相关列必须等于方法调用中传递的值
- <>(不等于)-表示相关列不得等于方法调用中传递的值
- >(大于)-表示相关列必须大于方法调用中传递的值
- > =(大于或等于)-表示相关列必须大于或等于在方法调用中传递的值
- <(小于)-表示相关列必须小于方法调用中传递的值
- <=(小于或等于)-表示相关列必须小于或等于在方法调用中传递的值
- LIKE-表示相关列必须与方法调用中传递的值“相似”。 该代码未添加必需的'%',您必须在方法调用中传递的值中自行设置该值。
- 不喜欢-意味着相关列必须“不喜欢”方法调用中传递的值。 该代码未添加必需的'%',您必须在方法调用中传递的值中自行设置该值。
- BETWEEN-表示相关列必须在方法调用中传递的两个值之间。
- NOT BETWEEN-表示相关列必须在方法调用中传递的两个值之间“不在”之间。
- IN-表示相关列必须是方法调用中传入的值列表之一。
- NOT IN-表示相关列不得为方法调用中传递的值列表之一。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。