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





