乐趣区

Springboot-整合Mybatis-逆向工程详解版

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&amp;characterEncoding=utf-8&amp;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- 表示相关列不得为方法调用中传递的值列表之一。
退出移动版