mybatis反向生成sql,基本的增删改查
用到的几个文件
MyBatisGeneratorProxy.java
package com.timestech.wsgk.test.tools; import static org.mybatis.generator.internal.util.ClassloaderUtility.getCustomClassloader;
import static org.mybatis.generator.internal.util.messages.Messages.getString; import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set; import org.mybatis.generator.api.GeneratedJavaFile;
import org.mybatis.generator.api.GeneratedXmlFile;
import org.mybatis.generator.api.ProgressCallback;
import org.mybatis.generator.api.ShellCallback;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.Context;
import org.mybatis.generator.config.MergeConstants;
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.ShellException;
import org.mybatis.generator.internal.DefaultShellCallback;
import org.mybatis.generator.internal.NullProgressCallback;
import org.mybatis.generator.internal.ObjectFactory;
import org.mybatis.generator.internal.XmlFileMergerJaxp; public class MyBatisGeneratorProxy { private Configuration configuration; private ShellCallback shellCallback; private List<GeneratedJavaFile> generatedJavaFiles; private List<GeneratedXmlFile> generatedXmlFiles; private List<String> warnings; private Set<String> projects; /**
* Constructs a MyBatisGenerator object.
*
* @param configuration
* The configuration for this invocation
* @param shellCallback
* an instance of a ShellCallback interface. You may specify
* <code>null</code> in which case the DefaultShellCallback will
* be used.
* @param warnings
* Any warnings generated during execution will be added to this
* list. Warnings do not affect the running of the tool, but they
* may affect the results. A typical warning is an unsupported
* data type. In that case, the column will be ignored and
* generation will continue. You may specify <code>null</code> if
* you do not want warnings returned.
* @throws InvalidConfigurationException
* if the specified configuration is invalid
*/
public MyBatisGeneratorProxy(Configuration configuration, ShellCallback shellCallback,
List<String> warnings) throws InvalidConfigurationException {
super();
if (configuration == null) {
throw new IllegalArgumentException(getString("RuntimeError.2")); //$NON-NLS-1$
} else {
this.configuration = configuration;
} if (shellCallback == null) {
this.shellCallback = new DefaultShellCallback(false);
} else {
this.shellCallback = shellCallback;
} if (warnings == null) {
this.warnings = new ArrayList<String>();
} else {
this.warnings = warnings;
}
generatedJavaFiles = new ArrayList<GeneratedJavaFile>();
generatedXmlFiles = new ArrayList<GeneratedXmlFile>();
projects = new HashSet<String>(); this.configuration.validate();
} /**
* This is the main method for generating code. This method is long running,
* but progress can be provided and the method can be canceled through the
* ProgressCallback interface. This version of the method runs all
* configured contexts.
*
* @param callback
* an instance of the ProgressCallback interface, or
* <code>null</code> if you do not require progress information
* @throws SQLException
* @throws IOException
* @throws InterruptedException
* if the method is canceled through the ProgressCallback
*/
public void generate(ProgressCallback callback) throws SQLException,
IOException, InterruptedException {
generate(callback, null, null);
} /**
* This is the main method for generating code. This method is long running,
* but progress can be provided and the method can be canceled through the
* ProgressCallback interface.
*
* @param callback
* an instance of the ProgressCallback interface, or
* <code>null</code> if you do not require progress information
* @param contextIds
* a set of Strings containing context ids to run. Only the
* contexts with an id specified in this list will be run. If the
* list is null or empty, than all contexts are run.
* @throws InvalidConfigurationException
* @throws SQLException
* @throws IOException
* @throws InterruptedException
* if the method is canceled through the ProgressCallback
*/
public void generate(ProgressCallback callback, Set<String> contextIds)
throws SQLException, IOException, InterruptedException {
generate(callback, contextIds, null);
} /**
* This is the main method for generating code. This method is long running,
* but progress can be provided and the method can be cancelled through the
* ProgressCallback interface.
*
* @param callback
* an instance of the ProgressCallback interface, or
* <code>null</code> if you do not require progress information
* @param contextIds
* a set of Strings containing context ids to run. Only the
* contexts with an id specified in this list will be run. If the
* list is null or empty, than all contexts are run.
* @param fullyQualifiedTableNames
* a set of table names to generate. The elements of the set must
* be Strings that exactly match what's specified in the
* configuration. For example, if table name = "foo" and schema =
* "bar", then the fully qualified table name is "foo.bar". If
* the Set is null or empty, then all tables in the configuration
* will be used for code generation.
* @throws InvalidConfigurationException
* @throws SQLException
* @throws IOException
* @throws InterruptedException
* if the method is canceled through the ProgressCallback
*/
public void generate(ProgressCallback callback, Set<String> contextIds,
Set<String> fullyQualifiedTableNames) throws SQLException,
IOException, InterruptedException { if (callback == null) {
callback = new NullProgressCallback();
} generatedJavaFiles.clear();
generatedXmlFiles.clear(); // calculate the contexts to run
List<Context> contextsToRun;
if (contextIds == null || contextIds.size() == 0) {
contextsToRun = configuration.getContexts();
} else {
contextsToRun = new ArrayList<Context>();
for (Context context : configuration.getContexts()) {
if (contextIds.contains(context.getId())) {
contextsToRun.add(context);
}
}
} // setup custom classloader if required
if (configuration.getClassPathEntries().size() > 0) {
ClassLoader classLoader = getCustomClassloader(configuration.getClassPathEntries());
ObjectFactory.addExternalClassLoader(classLoader);
} // now run the introspections...
int totalSteps = 0;
for (Context context : contextsToRun) {
totalSteps += context.getIntrospectionSteps();
}
callback.introspectionStarted(totalSteps); for (Context context : contextsToRun) {
context.introspectTables(callback, warnings,
fullyQualifiedTableNames);
} // now run the generates
totalSteps = 0;
for (Context context : contextsToRun) {
totalSteps += context.getGenerationSteps();
}
callback.generationStarted(totalSteps); for (Context context : contextsToRun) {
context.generateFiles(callback, generatedJavaFiles,
generatedXmlFiles, warnings);
} // now save the files
callback.saveStarted(generatedXmlFiles.size()
+ generatedJavaFiles.size()); for (GeneratedXmlFile gxf : generatedXmlFiles) {
projects.add(gxf.getTargetProject()); File targetFile;
String source;
try {
File directory = shellCallback.getDirectory(gxf
.getTargetProject(), gxf.getTargetPackage());
targetFile = new File(directory, gxf.getFileName());
if (targetFile.exists()) {
if (gxf.isMergeable()) {
source = XmlFileMergerJaxp.getMergedSource(gxf,
targetFile);
} else if (shellCallback.isOverwriteEnabled()) {
source = gxf.getFormattedContent();
warnings.add(getString("Warning.11", //$NON-NLS-1$
targetFile.getAbsolutePath()));
} else {
source = gxf.getFormattedContent();
targetFile = getUniqueFileName(directory, gxf
.getFileName());
warnings.add(getString(
"Warning.2", targetFile.getAbsolutePath())); //$NON-NLS-1$
}
} else {
source = gxf.getFormattedContent();
}
} catch (ShellException e) {
warnings.add(e.getMessage());
continue;
} callback.checkCancel();
callback.startTask(getString(
"Progress.15", targetFile.getName())); //$NON-NLS-1$
writeFile(targetFile, source, "UTF-8"); //$NON-NLS-1$
} for (GeneratedJavaFile gjf : generatedJavaFiles) {
projects.add(gjf.getTargetProject()); File targetFile;
String source;
String fileName;
try {
fileName = gjf.getFileName();
File directory = shellCallback.getDirectory(gjf
.getTargetProject(), gjf.getTargetPackage());
targetFile = new File(directory, fileName);
if (targetFile.exists()) {
if (shellCallback.isMergeSupported()) {
source = shellCallback.mergeJavaFile(gjf
.getFormattedContent(), targetFile
.getAbsolutePath(),
MergeConstants.OLD_ELEMENT_TAGS,
gjf.getFileEncoding());
} else if (shellCallback.isOverwriteEnabled()) {
source = gjf.getFormattedContent();
warnings.add(getString("Warning.11", //$NON-NLS-1$
targetFile.getAbsolutePath()));
} else {
source = gjf.getFormattedContent();
targetFile = getUniqueFileName(directory, fileName);
warnings.add(getString(
"Warning.2", targetFile.getAbsolutePath())); //$NON-NLS-1$
}
} else {
source = gjf.getFormattedContent();
}
if(!fileName.equals(gjf.getFileName())){
source = source.replace("interface " + gjf.getFileName().substring(0,gjf.getFileName().indexOf(".")),
"interface " + fileName.substring(0,fileName.indexOf(".")));
}
callback.checkCancel();
callback.startTask(getString(
"Progress.15", targetFile.getName())); //$NON-NLS-1$
writeFile(targetFile, source, gjf.getFileEncoding());
} catch (ShellException e) {
warnings.add(e.getMessage());
}
} for (String project : projects) {
shellCallback.refreshProject(project);
} callback.done();
} /**
* Writes, or overwrites, the contents of the specified file
*
* @param file
* @param content
*/
private void writeFile(File file, String content, String fileEncoding) throws IOException {
FileOutputStream fos = new FileOutputStream(file, false);
OutputStreamWriter osw;
if (fileEncoding == null) {
osw = new OutputStreamWriter(fos);
} else {
osw = new OutputStreamWriter(fos, fileEncoding);
} BufferedWriter bw = new BufferedWriter(osw);
bw.write(content);
bw.close();
} private File getUniqueFileName(File directory, String fileName) {
File answer = null; // try up to 1000 times to generate a unique file name
StringBuilder sb = new StringBuilder();
for (int i = 1; i < 1000; i++) {
sb.setLength(0);
sb.append(fileName);
sb.append('.');
sb.append(i); File testFile = new File(directory, sb.toString());
if (!testFile.exists()) {
answer = testFile;
break;
}
} if (answer == null) {
throw new RuntimeException(getString(
"RuntimeError.3", directory.getAbsolutePath())); //$NON-NLS-1$
} return answer;
}
}
MyBatisGeneratorTool.java---------run as 这个文件即可生成
package com.timestech.wsgk.test.tools; import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List; import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback; public class MyBatisGeneratorTool { public static void main(String[] args) throws UnsupportedEncodingException {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
String genCfg = "/generator.xml"; //src/*/resources的一级目录下
File configFile = new File(java.net.URLDecoder.decode(MyBatisGeneratorTool.class.getResource(genCfg).getFile(),"utf-8"));
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = null;
try {
config = cp.parseConfiguration(configFile);
} catch (IOException e) {
e.printStackTrace();
} catch (XMLParserException e) {
e.printStackTrace();
}
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGeneratorProxy myBatisGenerator = null;
try {
myBatisGenerator = new MyBatisGeneratorProxy(config, callback, warnings);
} catch (InvalidConfigurationException e) {
e.printStackTrace();
}
try {
System.out.println("begin generate......");
myBatisGenerator.generate(null);
System.out.println("end generate......");
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
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>
<properties resource="generatorConfig.properties"/>
<classPathEntry location="${oracle.classPath}" /> <context id="Mysql2Tables" targetRuntime="MyBatis3">
<!-- 过滤掉注释 -->
<commentGenerator>
<property name="suppressAllComments" value="true" />
<property name="suppressDate" value="true" />
</commentGenerator> <!-- 数据链接 -->
<jdbcConnection driverClass="${oracle.driverClass}"
connectionURL="${oracle.connectionURL}"
userId="${oracle.userId}"
password="${oracle.password}">
</jdbcConnection> <!-- 根据数据库字段长度自动匹配,默认为false:bigdecimal,long,int,short ,为true时始终使用bigdecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver> <!-- domain类的生成 -->
<javaModelGenerator targetPackage="${oracle.modelPackage}"
targetProject="src/main/java">
<!-- 是否允许在targetPackage目录下建子目录 -->
<property name="enableSubPackages" value="false" />
<property name="trimStrings" value="true" />
</javaModelGenerator> <!-- mapper文件生成 -->
<sqlMapGenerator targetPackage="${oracle.sqlMapperPackage}"
targetProject="src/main/java">
<!-- 是否允许在targetPackage目录下建子目录 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator> <!-- DAO生成 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="${oracle.daoMapperPackage}" targetProject="src/main/java">
<!-- 是否允许在targetPackage目录下建子目录 -->
<property name="enableSubPackages" value="false" />
<property name="trimStrings" value="true" />
</javaClientGenerator> <!-- 对应的数据库的哪张表,多个表的话就写多个table -->
<table schema="bjlt" tableName="${oracle.tableName}" domainObjectName="${oracle.domainName}"
enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false">
<!-- 指定id字段是Long类型,而不是BigDecimal类型 -->
<columnOverride column="id" javaType="Long" />
</table> </context>
</generatorConfiguration>
generatorConfig.properties-----生成文件的位置什么的在这里配置
#MYSQL数据库驱动
mysql.classPath=C\:/Users/Administrator/.m2/repository/mysql/mysql-connector-java/5.1.30/mysql-connector-java-5.1.30.jar
#targetProject=D\:/ylink/myeclipse/MBG/src
mysql.driverClass=com.mysql.jdbc.Driver
#链接数据库url
mysql.connectionURL=jdbc:mysql://192.168.0.121:3306/bjlt
#用户名
mysql.userId=root
#密码
mysql.password=root
#表名称
mysql.tableName=test
#domain名称
mysql.domainName=test
#domain类生成路径
mysql.modelPackage=com.timestech.wsgk.web.model
#mapper文件生成路径
mysql.sqlMapperPackage=com.timestech.wsgk.web.mapper
#DAO类生成路径
mysql.daoMapperPackage=com.timestech.wsgk.web.dao #ORACLE数据库驱动
oracle.classPath=C\:/Users/Administrator/.m2/repository/com/oracle/ojdbc14/10.1.3/ojdbc14-10.1.3.jar
#targetProject=D\:/ylink/myeclipse/MBG/src
oracle.driverClass=oracle.jdbc.driver.OracleDriver
#链接数据库url
oracle.connectionURL=jdbc:oracle:thin:@192.168.0.121:1521:orcl
#用户名
oracle.userId=bjlt
#密码
oracle.password=bjlt
#表名称
oracle.tableName=BASESTATION
#domain名称
oracle.domainName=BASESTATION
#domain类生成路径
oracle.modelPackage=com.timestech.wsgk.web.model
#mapper文件生成路径
oracle.sqlMapperPackage=com.timestech.wsgk.web.mapper
#DAO类生成路径
oracle.daoMapperPackage=com.timestech.wsgk.web.dao
mybatis反向生成sql,基本的增删改查的更多相关文章
- Mybatis实现简单的CRUD(增删改查)原理及实例分析
Mybatis实现简单的CRUD(增删改查) 用到的数据库: CREATE DATABASE `mybatis`; USE `mybatis`; DROP TABLE IF EXISTS `user` ...
- MyBatis学习(三)MyBatis基于动态代理方式的增删改查
1.前言 上一期讲到MyBatis-Statement版本的增删改查.可以发现.这种代码写下来冗余的地方特别多.写一套没啥.如果涉及到多表多查询的时候就容易出现问题.故.官方推荐了一种方法.即MyBa ...
- 使用java对sql server进行增删改查
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...
- 四种简单的sql语句(增删改查语句)
四种简单的sql语句(增删改查语句) 一.插入语句 insert into [table] ([column],[column],[column]) values(?,?,?) 二.删除语句 dele ...
- dml语句就是你常写的sql语句,增删改查
dml语句就是你常写的sql语句,增删改查
- MyBatis初级实战之二:增删改查
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 常见 SQL语句使用 增删改查
一.常见的增删改查(一).查:1.SELECT 列名称 FROM 表名称,其中列名可以是多个,中间用豆号分开,如SELECT LastName,FirstName FROM Persons: 2.SE ...
- 02.Mybatis的动态代理方式实现增删改查
动态代理的方式实现增删改查: 通过约定的方式定位sql语句 约定 > 配置文件 > 硬编码 约定的目标是省略掉通过硬编码的方式定位sql的代码,通过接口直接定位出sql语句,以下代码为通过 ...
- ssm框架(Spring Springmvc Mybatis框架)整合及案例增删改查
三大框架介绍 ssm框架是由Spring springmvc和Mybatis共同组成的框架.Spring和Springmvc都是spring公司开发的,因此他们之间不需要整合.也可以说是无缝整合.my ...
- SQL总结之增删改查
SQL语句增删改查(总结) 一.增:有2种方法 1.使用insert插入单行数据: 语法:insert [into] <表名> [列名] values <列值> 例:ins ...
随机推荐
- [设计模式] javascript 之 模板方法模式
模板方法模式说明 定义:定义方法操作的骨架,把一些具体实现延伸到子类中去,使用得具体实现不会影响到骨架的行为步骤! 说明:模式方法模式是一个继承跟复用的典型模式,该模式定义了一个抽象类,Abstrac ...
- 一张图读懂https加密协议
搭建CA服务器和iis启用https:http://blog.csdn.net/dier4836/article/details/7719532 一张图读懂https加密协议 https是一种加密传输 ...
- [译]Create a Web API in MVC 6
原文: http://www.asp.net/vnext/overview/aspnet-vnext/create-a-web-api-with-mvc-6 ASP.NET 5.0的一个目标是合并MV ...
- SQL--表分区
use Test --.创建数据库文件组>>alter database <数据库名> add filegroup <文件组名> ALTER DATABASE TE ...
- POJ 2151 Check the difficulty of problems
以前做过的题目了....补集+DP Check the difficulty of problems Time Limit: 2000MS Memory Limit: 65536K ...
- Swift2.1 语法指南——嵌套类型
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
- java之String
一.构造器 package com.string; import java.io.UnsupportedEncodingException; import java.nio.charset.Chars ...
- APPCAN MAS接口之SOAP
APPCAN MAS接口中使用webservice接口形式,示例代码如下: 1 var MEAP=require("meap"); 2 3 function run(Par ...
- UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position 0: illegal multibyte sequence
混淆了 python2 里边的 str 和 unicode 数据类型. 1. 对需要 str->unicode 的代码,可以在前边写上 import sys reload(sys) sys.se ...
- IOS学习目录
一.UI 1.基础控件 2.高级控件 二.多线程网络 1.网络请求.网络安全 2.