mybatis的逆向工程和中文注解
取不到中文注释字段的时候,可以试试下面的方法
下面的配置均指的是Mybatis Generator 的配置文件(一般是叫generatorConfig.xml)的配置:
mysql
方法1:
- <jdbcConnection driverClass="${driver}"
- connectionURL="{url}" userId="${username}" password="${password}">
- <!-- 针对mysql数据库 -->
- <property name="useInformationSchema" value="true"></property>
- </jdbcConnection>
方法2
connectionURL="jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8&useInformationSchema=true"
Oracle
- <jdbcConnection driverClass="${driver}"
- connectionURL="{url}" userId="${username}" password="${password}">
- <!-- 针对oracle数据库 -->
- <property name="remarksReporting" value="true"></property>
- </jdbcConnection>
详解
MBG访问数据库也是通过JDBC进行,而通过JDBC连接Oracle、Mysql(其它数据库暂不清楚)时,想获取到表及字段注释是需要额外设置一些连接属性的.一般大体上都是如下的代码(以Oracle为例):
我们先来看下MBG连接数据库的代码,可以在org.mybatis.generator.internal.JDBCConnectionFactory中找到:
- public JDBCConnectionFactory(JDBCConnectionConfiguration config) {
- super();
- userId = config.getUserId();
- password = config.getPassword();
- connectionURL = config.getConnectionURL();
- driverClass = config.getDriverClass();
- otherProperties = config.getProperties(); //注意此行
- }
- public Connection getConnection()
- throws SQLException {
- Driver driver = getDriver();
- Properties props = new Properties();
- if (stringHasValue(userId)) {
- props.setProperty("user", userId); //$NON-NLS-1$
- }
- if (stringHasValue(password)) {
- props.setProperty("password", password); //$NON-NLS-1$
- }
- props.putAll(otherProperties); //注意此行
- Connection conn = driver.connect(connectionURL, props);
- if (conn == null) {
- throw new SQLException(getString("RuntimeError.7")); //$NON-NLS-1$
- }
- return conn;
- }
通过上面代码(尤其是我加了注意此行注释的两行代码)我们可以看到,MBG在建立连接时,是把JDBCConnectionConfiguration中的所有properties给设置进去了.那么显然我们只需要找到在哪配置这些properties就行了.
JDBCConnectionConfiguration对应到XML配置里就是jdbcConnection节点.
再来看看官方的使用文档,官方文档关于jdbcConnection (点击查看) 一节中 <property>子元素的说明:
- <property> (0..N) Note: any properties specified here will be added to the properties of the JDBC driver.
那么在配置文件中我们如下改动即可:
- <jdbcConnection driverClass="${driver}"
- connectionURL="{url}" userId="${username}" password="${password}">
- <!-- 针对oracle数据库 -->
- <property name="remarksReporting" value="true"></property>
- </jdbcConnection>
由于MyBatis Generator自带了生成注释的功能,但是,是英文的而且生成的根本无法理解,所以可以通过,修改他的源码来实现生成中文的注释,具体方式有以下几种:
1) 自定义CommentGenerator
2) 修改源码
3) PluginAdapter插件的形式
这个例子通过自定义CommentGenerator来实现。
1.创建maven工程,修改pom.xml:
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.test</groupId>
- <artifactId>testgenerator</artifactId>
- <version>1.0-SNAPSHOT</version>
- <properties>
- <!-- 依赖版本 -->
- <mapper.version>3.3.9</mapper.version>
- <mysql.version>5.1.10</mysql.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.1</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>tk.mybatis</groupId>
- <artifactId>mapper</artifactId>
- <version>${mapper.version}</version>
- </dependency>
- <dependency>
- <groupId>org.mybatis.generator</groupId>
- <artifactId>mybatis-generator-core</artifactId>
- <version>1.3.5</version>
- </dependency>
- <dependency>
- <groupId>org.mybatis.spring.boot</groupId>
- <artifactId>mybatis-spring-boot-starter</artifactId>
- <version>1.1.1</version>
- </dependency>
- </dependencies>
- <build>
- <plugins>
- <plugin>
- <groupId>org.mybatis.generator</groupId>
- <artifactId>mybatis-generator-maven-plugin</artifactId>
- <version>1.3.5</version>
- <configuration>
- <configurationFile>${basedir}/src/main/resources/generatorConfig.xml</configurationFile>
- <overwrite>true</overwrite>
- <verbose>true</verbose>
- </configuration>
- <dependencies>
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>${mysql.version}</version>
- </dependency>
- <dependency>
- <groupId>tk.mybatis</groupId>
- <artifactId>mapper</artifactId>
- <version>${mapper.version}</version>
- </dependency>
- <dependency>
- <groupId>com.test</groupId>
- <artifactId>testgenerator</artifactId>
- <version>1.0-SNAPSHOT</version>
- </dependency>
- </dependencies>
- </plugin>
- </plugins>
- </build>
- </project>
在java目录里面增加MybatisCommentGenerator.java
- import org.mybatis.generator.api.CommentGenerator;
- import org.mybatis.generator.api.IntrospectedColumn;
- import org.mybatis.generator.api.IntrospectedTable;
- import org.mybatis.generator.api.dom.java.*;
- import org.mybatis.generator.api.dom.xml.XmlElement;
- import org.mybatis.generator.config.MergeConstants;
- import org.mybatis.generator.config.PropertyRegistry;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import java.util.Properties;
- import static org.mybatis.generator.internal.util.StringUtility.isTrue;
- /**
- * TODO
- *
- * @Author mx
- * @Date: 2019-04-09 11:32
- */
- public class MybatisCommentGenerator implements CommentGenerator {
- private Properties properties;
- private Properties systemPro;
- private boolean suppressDate;
- private boolean suppressAllComments;
- private String currentDateStr;
- public MybatisCommentGenerator() {
- super();
- properties = new Properties();
- systemPro = System.getProperties();
- suppressDate = false;
- suppressAllComments = false;
- currentDateStr = (new SimpleDateFormat("yyyy-MM-dd")).format(new Date());
- }
- /**
- * Adds properties for this instance from any properties configured in the
- * CommentGenerator configuration.
- * <p> * This method will be called before any of the other methods.
- *
- * @param properties All properties from the configuration
- */
- public void addConfigurationProperties(Properties properties) {
- this.properties.putAll(properties);
- suppressDate = isTrue(properties.getProperty(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_DATE));
- suppressAllComments = isTrue(properties.getProperty(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_ALL_COMMENTS));
- }
- /**
- * @param field the field
- * @param introspectedTable the introspected table
- * @param introspectedColumn
- */
- public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
- if (suppressAllComments) {
- return;
- }
- StringBuilder sb = new StringBuilder();
- field.addJavaDocLine("/**");
- sb.append(" * ");
- sb.append(introspectedColumn.getRemarks());
- field.addJavaDocLine(sb.toString());
- addJavadocTag(field, false);
- field.addJavaDocLine(" */");
- }
- /**
- * Adds the field comment.
- *
- * @param field the field
- * @param introspectedTable
- */
- public void addFieldComment(Field field, IntrospectedTable introspectedTable) {
- if (suppressAllComments) {
- return;
- }
- StringBuilder sb = new StringBuilder();
- field.addJavaDocLine("/**");
- sb.append(" * ");
- sb.append(introspectedTable.getFullyQualifiedTable());
- field.addJavaDocLine(sb.toString());
- field.addJavaDocLine(" */");
- }
- public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
- if (suppressAllComments) {
- return;
- }
- StringBuilder sb = new StringBuilder();
- topLevelClass.addJavaDocLine("/**");
- sb.append(" * ");
- sb.append(introspectedTable.getRemarks());
- sb.append(" ");
- sb.append(introspectedTable.getTableType());
- sb.append(" ");
- sb.append(getDateString());
- topLevelClass.addJavaDocLine(sb.toString());
- topLevelClass.addJavaDocLine(" */");
- }
- /**
- * Adds the inner class comment.
- *
- * @param innerClass the inner class
- * @param introspectedTable
- */
- public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable) {
- if (suppressAllComments) {
- return;
- }
- StringBuilder sb = new StringBuilder();
- innerClass.addJavaDocLine("/**");
- sb.append(" * ");
- sb.append(introspectedTable.getFullyQualifiedTable());
- sb.append(" ");
- sb.append(getDateString());
- innerClass.addJavaDocLine(sb.toString());
- innerClass.addJavaDocLine(" */");
- }
- /**
- * Adds the inner class comment.
- *
- * @param innerClass the inner class
- * @param introspectedTable the introspected table
- * @param markAsDoNotDelete
- */
- public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable, boolean markAsDoNotDelete) {
- if (suppressAllComments) {
- return;
- }
- StringBuilder sb = new StringBuilder();
- innerClass.addJavaDocLine("/**");
- sb.append(" * ");
- sb.append(introspectedTable.getFullyQualifiedTable());
- innerClass.addJavaDocLine(sb.toString());
- sb.setLength(0);
- sb.append(" * @author ");
- sb.append(systemPro.getProperty("user.name"));
- sb.append(" ");
- sb.append(currentDateStr);
- addJavadocTag(innerClass, markAsDoNotDelete);
- innerClass.addJavaDocLine(" */");
- }
- /**
- * Adds the enum comment.
- *
- * @param innerEnum the inner enum
- * @param introspectedTable
- */
- public void addEnumComment(InnerEnum innerEnum, IntrospectedTable introspectedTable) {
- if (suppressAllComments) {
- return;
- }
- StringBuilder sb = new StringBuilder();
- innerEnum.addJavaDocLine("/**");
- addJavadocTag(innerEnum, false);
- sb.append(" * ");
- sb.append(introspectedTable.getFullyQualifiedTable());
- innerEnum.addJavaDocLine(sb.toString());
- innerEnum.addJavaDocLine(" */");
- }
- /**
- * Adds the getter comment.
- *
- * @param method the method
- * @param introspectedTable the introspected table
- * @param introspectedColumn
- */
- public void addGetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
- if (suppressAllComments) {
- return;
- }
- method.addJavaDocLine("/**");
- StringBuilder sb = new StringBuilder();
- sb.append(" * ");
- sb.append(introspectedColumn.getRemarks());
- method.addJavaDocLine(sb.toString());
- sb.setLength(0);
- sb.append(" * @return ");
- sb.append(introspectedColumn.getActualColumnName());
- sb.append(" ");
- sb.append(introspectedColumn.getRemarks());
- method.addJavaDocLine(sb.toString());
- addJavadocTag(method, false);
- method.addJavaDocLine(" */");
- }
- /**
- * Adds the setter comment.
- *
- * @param method the method
- * @param introspectedTable the introspected table
- * @param introspectedColumn
- */
- public void addSetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
- if (suppressAllComments) {
- return;
- }
- method.addJavaDocLine("/**");
- StringBuilder sb = new StringBuilder();
- sb.append(" * ");
- sb.append(introspectedColumn.getRemarks());
- method.addJavaDocLine(sb.toString());
- Parameter parm = method.getParameters().get(0);
- sb.setLength(0);
- sb.append(" * @param ");
- sb.append(parm.getName());
- sb.append(" ");
- sb.append(introspectedColumn.getRemarks());
- method.addJavaDocLine(sb.toString());
- addJavadocTag(method, false);
- method.addJavaDocLine(" */");
- }
- /**
- * Adds the general method comment.
- *
- * @param method the method
- * @param introspectedTable
- */
- public void addGeneralMethodComment(Method method, IntrospectedTable introspectedTable) {
- if (suppressAllComments) {
- return;
- }
- method.addJavaDocLine("/**");
- // addJavadocTag(method, false);
- StringBuilder sb = new StringBuilder();
- sb.append(" * ");
- sb.append(MergeConstants.NEW_ELEMENT_TAG);
- String s = method.getName();
- sb.append(' ');
- sb.append(s);
- method.addJavaDocLine(sb.toString());
- method.addJavaDocLine(" */");
- }
- public void addJavaFileComment(CompilationUnit compilationUnit) {
- }
- public void addComment(XmlElement xmlElement) {
- }
- public void addRootComment(XmlElement rootElement) {
- }
- protected void addJavadocTag(JavaElement javaElement, boolean markAsDoNotDelete) {
- javaElement.addJavaDocLine(" *");
- StringBuilder sb = new StringBuilder();
- sb.append(" * ");
- sb.append(MergeConstants.NEW_ELEMENT_TAG);
- if (markAsDoNotDelete) {
- sb.append(" do_not_delete_during_merge");
- }
- String s = getDateString();
- if (s != null) {
- sb.append(' ');
- sb.append(s);
- }
- javaElement.addJavaDocLine(sb.toString());
- }
- protected String getDateString() {
- String result = null;
- if (!suppressDate) {
- result = currentDateStr;
- }
- return result;
- }
- }
在resources目录下面增加文件config.properties,generatorConfig.xml。
config.properties的内容:
- # 数据库配置
- jdbc.driverClass=com.mysql.jdbc.Driver
- jdbc.url=jdbc:mysql://localhost:3306/wmbook
- jdbc.user=root
- jdbc.password=123456
- # 通用Mapper固定配置
- mapper.plugin=tk.mybatis.mapper.generator.MapperPlugin
- mapper.Mapper=tk.mybatis.mapper.common.Mapper
- mapper.forceAnnotation=true
- # 生成文件保存位置
- targetModelPackage=com.test.testgenerator.domain
- targetXMLPackage=com.test.testgenerator.mapper.xml
- targetMapperPackage=com.test.testgenerator.mapper
- targetJavaProject=src/main/java
- targetResourcesProject=src/main/java
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>
- <properties resource="config.properties"/>
- <context id="Mysql" targetRuntime="MyBatis3" defaultModelType="flat">
- <property name="beginningDelimiter" value="`"/>
- <property name="endingDelimiter" value="`"/>
- <!--支持序列化-->
- <plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>
- <!-- <commentGenerator>-->
- <!-- <!– 是否去除自动生成的注释 true:是 : false:否 –>-->
- <!-- <property name="suppressAllComments" value="false"/>-->
- <!-- </commentGenerator>-->
- <commentGenerator type="MybatisCommentGenerator">
- <property name="suppressDate" value="false"/>
- <property name="suppressAllComments" value="false"/>
- </commentGenerator>
- <jdbcConnection driverClass="${jdbc.driverClass}"
- connectionURL="${jdbc.url}"
- userId="${jdbc.user}"
- password="${jdbc.password}">
- </jdbcConnection>
- <javaModelGenerator targetPackage="${targetModelPackage}" targetProject="${targetJavaProject}">
- <!-- enableSubPackages:是否让schema作为包的后缀 -->
- <property name="enableSubPackages" value="false"/>
- <!-- 从数据库返回的值被清理前后的空格 -->
- <property name="trimStrings" value="true"/>
- </javaModelGenerator>
- <sqlMapGenerator targetPackage="${targetXMLPackage}" targetProject="${targetResourcesProject}">
- <!-- enableSubPackages:是否让schema作为包的后缀 -->
- <property name="enableSubPackages" value="false"/>
- </sqlMapGenerator>
- <javaClientGenerator targetPackage="${targetMapperPackage}" targetProject="${targetJavaProject}"
- type="XMLMAPPER">
- <!-- enableSubPackages:是否让schema作为包的后缀 -->
- <property name="enableSubPackages" value="false"/>
- </javaClientGenerator>
- <!--全部表参与逆向工程-->
- <!--以下example为false,表示不会生成example类,否则将自动生成example类-->
- <table schema="" tableName="%">
- </table>
- <!--指定某些表参与逆向工程-->
- <!--<table tableName="user"-->
- <!--enableCountByExample="false"-->
- <!--enableUpdateByExample="false"-->
- <!--enableDeleteByExample="false"-->
- <!--enableSelectByExample="false"-->
- <!--selectByExampleQueryId="false">-->
- <!--</table>-->
- </context>
- </generatorConfiguration>
创建完相关文件后的目录为:
生成方式一
新建生成文件的类StartUp.java
- public class StartUp {
- public static void main(String[] args) {
- try {
- List<String> warnings = new ArrayList<String>();
- boolean overwrite = true;
- ClassLoader classloader = Thread.currentThread().getContextClassLoader();
- InputStream is = classloader.getResourceAsStream("generatorConfig.xml");
- ConfigurationParser cp = new ConfigurationParser(warnings);
- Configuration config = cp.parseConfiguration(is);
- DefaultShellCallback callback = new DefaultShellCallback(overwrite);
- MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
- myBatisGenerator.generate(null);
- } catch (SQLException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (InvalidConfigurationException e) {
- e.printStackTrace();
- } catch (XMLParserException e) {
- e.printStackTrace();
- }
- }
- }
执行main方法就可以生成文件了。
如果需要让生成的实体和mapper继承其它对象和接口可以设置
- <javaModelGenerator targetPackage="${targetModelPackage}" targetProject="${targetJavaProject}">
- <!-- enableSubPackages:是否让schema作为包的后缀 -->
- <property name="enableSubPackages" value="false"/>
- <!-- 从数据库返回的值被清理前后的空格 -->
- <property name="trimStrings" value="true"/>
- <property name="rootClass" value="com.XXX.BaseEntity"/>
- </javaModelGenerator>
- <javaClientGenerator targetPackage="${targetMapperPackage}" targetProject="${targetJavaProject}"
- type="XMLMAPPER">
- <!-- enableSubPackages:是否让schema作为包的后缀 -->
- <property name="enableSubPackages" value="true"/>
- <property name="rootInterface" value="com.XXX.BaseMapper"/>
- </javaClientGenerator>
如果还想自定义生成实体和mapper里面的内容,可以参考 让MyBatis Generator产生的Mapper更简洁
生成方式二
先安装maven项目,然后在配置文成通过执行maven插件执行程序生成文件
执行后生成的目录路径为:
在生成的实体文件中就有中文注释了:
生成方式三
使用IDEA的插件MyBatisCodeHelper等,也可以生成
mybatis的逆向工程和中文注解的更多相关文章
- SpringBoot+Mybatis+Generator 逆向工程使用(二)
Mybatis-Genarator 逆向工程使用 个人开发环境 java环境:Jdk1.8.0_60 编译器:IntelliJ IDEA 2017.1.4 mysql驱动:mysql-connecto ...
- Mybatis 联合查询XML与注解对比
由于是练习,故只做了感兴趣的一部分测试. 测试类容XML配置转注解方式 实体类为了测试请忽略设计是否合理… User.java @Alias("User")public class ...
- mybatis的逆向工程
mybatis的逆向工程是很大的减少了程序员对代码的编写工作,由于mybatis是半自动的sql语句使用,我们在项目中一般都是采用逆向工程来生成mybatis的文件,mapper接口相当于我们平常所说 ...
- spring + myBatis 常见错误:@Autowired注解失败
今天配置spring+myBatis的时候,使用注解@Autowired把持久层dao注入service层的时候总是报错. 查了好久才发现,居然是配置文件路径写错了.basepackge的路径一定要正 ...
- Mybatis(七) mybatis的逆向工程的配置详解
还是觉得看书学习有意思~嘿嘿.今天把mybatis给结束掉. --WH 一.什么是逆向工程? 简单点说,就是通过数据库中的单表,自动生成java代码. Mybatis官方提供了逆向工程,可以针对单表自 ...
- Mybatis【逆向工程,缓存,代理】知识要点
前言 本文主要讲解Mybatis的以下知识点: Mybatis缓存 一级缓存 二级缓存 与Ehcache整合 Mapper代理 使用Mapper代理就不用写实现类了 逆向工程 自动生成代码 Mybat ...
- Mybatis插入MySQL数据库中文乱码
Mybatis插入MySQL数据库中文乱码 在dataSource.properties配置文件中设置useUnicode=true&characterEncoding=utf-8编码即可. ...
- Mybatis学习(七)————— mybatis的逆向工程的配置详解
一.什么是逆向工程? 简单点说,就是通过数据库中的单表,自动生成java代码. Mybatis官方提供了逆向工程,可以针对单表自动生成mybatis代码(mapper.java\mapper.xml\ ...
- Mybatis新增mysql时中文乱码
Mybatis新增mysql时中文乱码 1.设置数据库连接的编码(jdbc.properties) jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:my ...
随机推荐
- 解决Chrome浏览器访问https提示“您的连接不是私密连接”的问题
安装fiddler后,使用Chrome访问https网站时,可能会出现以下错误,本文说明如何解决此类问题: “您的连接不是私密连接”.“NET::ERR_CERT_AUTHORITY_INVALID” ...
- C Primer Plus Study Note
最近在学C语言,看好这本C Primer Plus,看到第九章了,记录一下第一章目录. 第一章 初识C语言 C语言的起源 选择C语言的理由 设计特性 高效性 可移植性 强大而灵活 面向程序员 缺点 C ...
- 42.输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, 如果有多对数字的和等于S,输出两个数的乘积最小的。
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, 如果有多对数字的和等于S,输出两个数的乘积最小的. 这道题有很多烟雾弹: 首先如果有多对,最前面的两个数就是乘积最小的, ...
- 学习笔记 Optional
今天学习到的一种新的防止空指针的方法下面是我自己写的一个例子:节省空间,bean的get set 省略... /** * 类目 * @author 唐 * @date 2018/5/6 17:45 * ...
- Measuring Text Difficulty Using Parse-Tree Frequency
https://nlp.lab.arizona.edu/sites/nlp.lab.arizona.edu/files/Kauchak-Leroy-Hogue-JASIST-2017.pdf In p ...
- Mawawa CSS 学习之旅 Display
CSS 类型之 Display 更新时间: 2018-2-10: 一个良好的布局结构从 display 开始! 分类:外部值.内部值.列表值.属性值.混合值.显示值.全局值: 一.外部值 作用:主要用 ...
- 函数模板前template语句的位置
先贴个例子看看: #include<iostream> using namespace std; template <> void print() { ; i < siz ...
- Spock - Document - 03 - Data Driven Testing
Data Driven Testing Peter Niederwieser, The Spock Framework TeamVersion 1.1 Oftentimes, it is useful ...
- js相关用法
一.location1.返回当前网址urllocation.href2.设置跳转网址urllocation.href = "http://www.baidu.com"3.重载刷新l ...
- Python之PIL库的运用、GIF处理
一.PIL库简介 PIL(Python Image Library)库是Python语言的第三方库,它支持图像存储.显示和处理,它能够处理几乎所有图片格式,可以完成对图像的缩放.剪裁.折叠以及像图片添 ...