用mybatis 的映射文件,逆向生成SQL语句


mybatis 正向,逆向

mybatis 这个开源项目是一经推出,就占领各大平台呀。不过,hibernate 的影响好象也不容小觑,好象还时不时的看到一些网民的项目使用hibernate 。mybatis 取得如此成功,跟他的良好的社区,强大的支持都有着不小的关系。

MyBatis Generator

代码自动生成器:
在日常开发工作中,我们往往需要自己去构建各种数据表所对应的持久化对象(PO)、用于操作数据库的接口(DAO)以及跟 DAO 所绑定的对应 XML。这都是一些重复性的操作,不需要多大技术含量,这时候我们不禁会去想,有没有一种工具,能够帮助我们去自动生成这些文件呢
这就是MyBatis Generator的介绍。
这是一个一推出就受到广大程序员关观的工具。
作为一个基于 MyBatis 的独立工具,MyBatis Generator 能够满足我们以上的要求,能够通过简单的配置去帮我们生成数据表所对应的 PO、DAO、XML 等文件,减去我们手动去生成这些文件的时间,有效提高开发效率。MyBatis Generator 运行方式多样,主要可以通过以下几种方式来运行:
命令行
Ant
Maven
Java
Eclipse
而我平时主要在 Maven 中配置并使用,所以本文主要基于 Maven 环境来进行讲解。

引入插件

既然要使用 MyBatis Generator,那么肯定我们的项目中已经配置了数据库和 MyBatis 的相关依赖,如果还没有配置,那么可以在 pom.xml 文件中进行配置,这里主要以 MySQL 数据库为例。

    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
    </dependencies>

MyBatis Generator 的相关配置

接着我们继续引入 MyBatis Generator 的相关配置。

    <build>
        <plugins>
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.4.0</version>
            </plugin>
        </plugins>
    </build>

完成上述步骤后,我们只是完成了 MyBatis Generator 的引入工作,要想让它正常工作,我们还需要对它进行配置,而 MyBatis Generator 在 pom.xml 中的主要配置主要有以下几点。

这里主要配置 MyBatis Generator 配置文件所在路径,一般我们将其放在 resources 路径中,而配置文件的名字则可以自定义,这里我以 mybatis-generator-config.xml 为例,此时需要将如下配置加入到 pom.xml 文件中。

 <configuration>
        <configurationFile>src/main/resources/mybatis-generator-config.xml</configurationFile>
    </configuration>

这是一个用mybatis-generator的过程,一般项目组有一个人去下载一下mybatis-generator工具就行了,很少有人第二次再使用它,主要是生成的XML,还得要人来修改,而且在用了mybatis-plus 之后,生成的xml 配置 文件也没有啥价值了。

mybatis 逆向

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<mapper namespace="com.SpringBoot.dao.ApplianceImp">
 
    <select id="findAll" resultType="com.SpringBoot.bean.Appliance">
        select * from bus_appliance
        <where>
            <if test="name != null">
                and name like '%${name}%'
            </if>
            <if test="available != null">
                and available like '%${available}%'
            </if>
        </where>
    </select>
。。

如果是这样的有XML没有SQL语句呢?

AI 的回答确实比百度强。比较清晰

对于没有resultMap的情况下逆向生成SQL,可以使用MyBatis的逆向工程插件来实现。下面是具体的步骤:

引入MyBatis逆向工程插件。在项目的pom.xml中添加以下插件依赖:

<plugin>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-maven-plugin</artifactId>
    <version>1.4.0</version>
    <configuration>
        <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
        <verbose>true</verbose>
        <overwrite>true</overwrite>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.21</version>
        </dependency>
    </dependencies>
</plugin>

创建generatorConfig.xml文件。在项目的resources目录下创建generatorConfig.xml文件,并配置相应的数据库连接信息和要逆向生成SQL的表信息。以下是一个示例的generatorConfig.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>
    <context id="DB2Tables" targetRuntime="MyBatis3">
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/mydatabase"
                        userId="myuser"
                        password="mypassword">
        </jdbcConnection>
 
        <javaTypeResolver >
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>
 
        <!-- 设置是否生成注释 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
 
        <!-- 设置生成的 Java 文件的编码 -->
        <javaModelGenerator targetPackage="com.SpringBoot.bean" targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
 
        <!-- 设置生成的 SQL Map 文件的位置、名称以及格式 -->
        <sqlMapGenerator targetPackage="com.SpringBoot.dao" targetProject="src/main/resources">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>
 
        <!-- 设置生成的 Mapper 文件的位置、名称以及格式 -->
        <javaClientGenerator targetPackage="com.SpringBoot.dao" targetProject="src/main/java" type="XMLMAPPER">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>
 
        <!-- 指定需要逆向生成 SQL 的表 -->
        <table tableName="bus_appliance"></table>
 
        <!-- 如果有多个表,继续添加 <table tableName="your_table_name"></table> -->
    </context>
</generatorConfiguration>

在上面的示例中,需要替换数据库连接信息、表名和包名等。

运行逆向工程插件。在命令行或IDE的Maven插件中运行以下命令:

mvn mybatis-generator:generate

AI 现在真的挺强大的。比我找到的几篇百度到的文章 靠谱太多了。

自已写代码实现

其实,如果是说,XML文件里的信息是全的。比如说有mapper 那么,我们是不是可以自己写一个简单的?
不就是遍历一个目录下的XML文件? 然后一个XML文件,组成一个map 的list ? 感觉上好象自己也可以手撸一下,
记录一下吧,这个思路还是有很多的借鉴。

package com.SpringBoot;

import java.util.Map;
import java.util.Set;

/**
 * @author :biao
 * @date :Created in 2022/2/27 
 */
public class Tab {

    private String tableName;

    private String idName;

    private String idType;

    private Map<String,String> columns;

    public String getTableName() {
        return tableName;
    }
    public void setTableName(String tableName) {
        this.tableName = tableName;
    }
    public String getIdName() {
        return idName;
    }
    public void setIdName(String idName) {
        this.idName = idName;
    }
    public String getIdType() {
        return idType;
    }
    public void setIdType(String idType) {
        this.idType = idType;
    }
    public Map<String, String> getColumns() {
        return columns;
    }
    public void setColumns(Map<String, String> columns) {
        this.columns = columns;
    }
    @Override
    public String toString() {

        StringBuffer sb = new StringBuffer("DROP TABLE  IF EXISTS "+tableName+";");
        sb.append("\r\n");
        sb.append("CREATE TABLE ");
        sb.append(tableName);
        sb.append("(");
        sb.append("\r\n");
        Set<Map.Entry<String,String>> set = columns.entrySet();
        int size = set.size();
        int i = 0;
        for (Map.Entry<String,String> entry : set) {
            i++;
            sb.append("\t"+entry.getKey()+" "+format(entry.getValue()));
            if (size != i){
                sb.append(" ,");
                sb.append("\r\n");
            }

        }
        sb.append("\r\n");
        sb.append(");");
        sb.append("\r\n");
        return sb.toString();

    }
    private String format(String val){
        if (val.equals("VARCHAR")){
            return "VARCHAR(255)";
        }
        return val;
    }


}

然后再来一个主类。

package com.SpringBoot;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;

import org.dom4j.Element;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * @author :biao
 * @date :Created in 2022/2/27
 */
public class Createsql {

    public static void main(String[] args) throws Exception {
        generateSql("G:\\vue\\spring-boot-erp\\src\\main\\resources\\mybatis\\mapper\\", "e://arcfacedm.sql");
    }
    /**
     * 生成sql
     * @param dirPath mapper.xml的父级文件夹
     * @param sqlFile 选择你将要生成sql的文件
     * @throws IOException
     */
    private static void generateSql(String dirPath,String sqlFile) throws IOException {
        FileWriter fw = null;
        try {
            File dir = new File(dirPath);
            File sql = new File(sqlFile);
            if (sql.exists()){
                sql.delete();
            }
            sql.createNewFile();
            fw = new FileWriter(sql);

            if (dir.exists() && dir.isDirectory()){
                File[] files = dir.listFiles();
                for (File file : files) {
                    if (file.isFile() && file.getName().endsWith(".xml")){
                        System.out.println(file.getName());
                        fw.append("\r\n");
                        fw.append(getSql(file));
                        fw.flush();
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if (fw != null)
                fw.close();
        }
    }

    private static String getSql(File xmlfile) throws DocumentException {
        SAXReader saxReader= new SAXReader();
        Document document = saxReader.read(xmlfile);
        org.dom4j.Element root = document.getRootElement();
        Element resultMap = root.element("resultMap");
        Tab tab = new Tab();
        tab.setTableName(getTableName(root));
        tab.setColumns(getColumns(resultMap));
        return tab.toString();
    }
    private static Map<String,String> getColumns(Element resultMap){
        List<Element> elements = resultMap.elements();
        Map<String,String> map = new LinkedHashMap<String, String>();
        for (Element element : elements) {
            map.put(element.attribute("column").getValue(), element.attribute("jdbcType").getValue());
        }
        return map;
    }
    private static String getTableName(Element root){
        Element selectByPrimaryKey = root.element("select");
        String selectStr = selectByPrimaryKey.getTextTrim();
        String tableName = selectStr.split("from")[1].trim().split(" ")[0].trim();
        return tableName;
    }
}

总结

提示:这里对文章进行总结:
这里先记录一下,最后的代码的思路才是最值得记录的。毕竟工具的使用到头来,也不会提高自己的能力。
彪哥语录:
不怕别人比你聪明,就怕聪明的人比你还努力!

评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

项目张雪峰之巅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值