generator源码(generatorpowered)
本文目录一览:
- 1、如何在idea中使用Mybatis-generator插件快速生成代码
- 2、如何修改mybatis generator tinyint byte
- 3、关于generator异步编程的理解以及如何动手写
- 4、js generator 是异步还是同步
- 5、通过generator写的mybatis怎么获取新增是的id
- 6、python如何修改已创建好的generator?
如何在idea中使用Mybatis-generator插件快速生成代码
IntelliJ idea 开发工具的相关资料很少,加大了大家入手的难度,今天就以mybatis的插件安装做下示例,可能对于已经会用的人不值一提但是对于我们这些天资一般刚开始使用,我想还是会有些帮助。
安装步骤:
1.下载插件
mybatis 插件
插件下载完毕,存放指定位置,文件名默认应该是:mybatis-plus.jar
2.打开Intellij idea工具,打开菜单 File -- settings 选择 Plugs,点击Install plug from disk,选择刚刚下载的插件jar文件,确认后,会直接显示mybatis插件和其信息,表示安装成功。
3.插件安装后,打开settings,会有Mybatis一项!
如何修改mybatis generator tinyint byte
首先说说上一篇最后提到的关于自定义注释的问题,想实现这个功能就需要修改org.mybatis.generator.internal.DefaultCommentGenerator这个类。我将里面一些主要的方法讲下。
addJavaFileComment(CompilationUnit compilationUnit)
给Java文件加注释,这个注释是在文件的顶部,也就是package上面。
addComment(XmlElement xmlElement)
给生成的XML文件加注释。大象将这个方法清空了,不生成注释。
addClassComment(InnerClass innerClass,IntrospectedTable introspectedTable)
Java类的类注释。
请注意红线的getRemarks()方法,这个remarks属性在原来的FullyQualifiedTable里面是没有的,这是大象自己加上去的,就是为了保存表的注释信息。那是在哪里加进去的呢?请看org.mybatis.generator.internal.db.DatabaseIntrospector这个类,大概浏览下就会发现,数据库表以及列的信息读取,类型设置都是由它来完成的,定位到608行,正好这里是个空行,插入几行代码。如下:
这样我们就取到了表的注释信息,看到这里应该就会明白了吧?
另外我需要说明的是,想通过databaseMetaData.getTables()来获得表注释的童鞋,这个做法是没用的,大象已经试过了,这个结果集里面的rs.getString("REMARKS")得到的是一个空字符串,什么都木有。而且大象还想吐槽下,网上一大堆说返回的这个结果集是10列,呵呵,是的么?我debug了好久发现它还是只有5列,不知道这10列是从哪来的,请打印出10列的童鞋告之是怎么做的,我用的mysql驱动是5.1.29
addFieldComment(Field field, IntrospectedTable introspectedTable,IntrospectedColumn introspectedColumn)
Java属性注释。注释为空就不给属性添加。
addGetterComment(Method method,IntrospectedTable introspectedTable,IntrospectedColumn introspectedColumn)
给getter方法加注释。这里添加注释的方法和Field一样,大象把这个方法以及addSetterComment方法都清空了,因为我比较习惯把注释加到属性上面,如果你习惯在getter方法上面加注释可以自行改一下。
上面这些修改做完后,记得要在org.mybatis.generator.codegen.mybatis3.model.BaseRecordGenerator的61行增加下面这行代码:
commentGenerator.addClassComment(topLevelClass, introspectedTable);
因为mybatis-generator源码中本来就是不加类注释的。
大家都在不同的公司,要求肯定都不一样,大象没法满足所有人,只对该类做了一定程度的修改,姑且把它当做一个示例模板吧,主要是弄明白怎么改就成了。
mybatis-generator在1.3.2版里对生成xml的namespace作了修改,不再用表名当为namespace的值,而是用包结构+类名+Mapper后缀的形式设置,大象不喜欢这么复杂做法,所以这里需要改一改,只保留类名+Mapper的命名形式。去掉org.mybatis.generator.api.IntrospectedTable类的907行与908行代码。
接下来再来说说对大对象类型的处理,mybatis-generator默认会把所有jdbcType为:BINARY、BLOB、CLOB、LONGVARBINARY、LONGVARCHAR、VARBINARY这些类型都作为大对象,反应出来的效果就是生成的pojo类会多一个类名+WithBLOBs.java的文件(含有的大对象个数大于1时),而在XML里面也会增加一个id为ResultMapWithBLOBs的resultMap,它继承BaseResultMap,大象一向喜欢简单的风格,这看得太不爽了。如果你觉得无所谓,不需要修改,请跳过这段往下看。
表中的text或blob等类型,通过databaseMetaData.getColumns()取出来后,它的rs.getInt("DATA_TYPE")值是与java.sql.Types对应的。
text类型的值:Types.LONGVARCHAR
blob类型是值:Types.LONGVARBINARY
它用org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl解析java类型与jdbc类型,然后设置到org.mybatis.generator.api.IntrospectedColumn的jdbcTypeName属性里,最关键的地方到了,IntrospectedColumn类第156行有个isBLOBColumn()方法,它就是用来判断是否生成xxxWithBLOBs.java和ResultMapWithBLOBs的条件。当然mybatis-generator不会这么直接用,它在里面定义了一个Rules接口,由它来统一进行调用。所以我们只需要把isBLOBColumn()里面的代码都去掉,直接返回false就可以了,再结合配置文件中的columnOverride属性就能达到目的。
jdbcType指定的值就是生成xml后result里面对应的类型,javaType与生成的pojo里面属性类型一致,这里其实可以不定义javaType,但是当数据库的表字段有的定义为tinyint时,如果不给它指定类型,那么默认生成的java类型就是java.lang.Byte,假如你想转换类型,而且保证不会超出字段类型的大小限制,那么你可以将它的javaType设为java.lang.Integer
经过这么一番修改之后,输出结果已经比较理想了,但是xml文件看上去还是有点问题,元素与元素之间没空行,看起来好别扭。恩,这里要给它加上空行,所以请找到org.mybatis.generator.api.dom.xml.XmlElement类的getFormattedContent方法,这个方法有个参数:indentLevel,通过名字我们可以很直观的理解它的作用就是来控制缩进等级,它的初始值为0,这表示不缩进,当变成1时就是缩进一级,也即缩进四个空格,后面以此类推,我们应该还注意到,方法内部用到了递归,所以它是从最底元素开始,再一步步返回,所以我们就应该在indentLevel为1的元素后面加上换行。
在生成xml的文件里面,我们看到有一个update元素,id为updateByPrimaryKey,这个基本上用不到,但是你还不能在table里加上enableUpdateByPrimaryKey="false",如果你这么做,虽然updateByPrimaryKey没有了,但updateByPrimaryKeySelective也会消失。所以这时请看看org.mybatis.generator.codegen.mybatis3.xmlmapper.XMLMapperGenerator这个类,getSqlMapElement()里面,有大量的addXXX方法,这些方法里面每个都用到了Rules规则来处理是否执行,比如我们在table里面加了enableDeleteByExample="false",它对应的是addDeleteByExampleElement(),而它又调用了introspectedTable.getRules().generateDeleteByExample()方法,再进入到generateDeleteByExample()里面,我们可以看到红线部分,上一篇大象讲过,在加载配置文件的时候,TableConfiguration会将table中的这些属性设置到对应的属性里,所以说其实最后还是回到了判断enableDeleteByExample的布尔值上面。
上面啰嗦了一大堆,现在再来解决之前提到的问题,如何去掉id为updateByPrimaryKey的update元素,注释掉addUpdateByPrimaryKeyWithoutBLOBsElement()或直接去掉这行代码,跟踪代码你会发现,它和addUpdateByPrimaryKeySelectiveElement()的rules验证里面都用到了enableUpdateByPrimaryKey的值。或者你不想采取我说的这个办法,而是改BaseRules的generateUpdateByPrimaryKeyWithoutBLOBs(),让它直接返回false
最后大象再唠叨一句,这些addXXX方法的顺序决定了生成xml文件中的元素顺序,所以有代码洁癖的人可以作下调整。
上一篇加这一篇都是讲怎么少量的改动源码以实现自定义文件输出,写的比较凌乱,不是很系统,完全是从实用的角度出发,关键还是大象水平有限,有什么错误还请大家帮我指出来,谢谢!
改了这么多,总要看下效果吧,下一篇大象将写个测试看看生成的结果,然后用maven assembly将它打包生成一个zip,它将包含:
关于generator异步编程的理解以及如何动手写
关于generator异步编程的理解以及如何动手写一个co模块
generator出现之前,想要实现对异步队列中任务的流程控制,大概有这么一下几种方式:
回调函数
事件监听
发布/订阅
promise对象
第一种方式想必大家是最常见的,其代码组织方式如下:
function fn(url, callback){ var httpRequest;//创建XHR
httpRequest = window.XMLHttpRequest ? new XMLHttpRequest() :
window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : undefined;
httpRequest.onreadystatechange = function(){ if(httpRequest.readystate === 4 httpRequest.status === 200){//状态判断 callback.call(httpRequest.responseXML);
}
};
httpRequest.open("GET", url);
httpRequest.send();
}
fn("text.xml", function(){//调用函数
console.log(this); //此语句后输出});
console.log("this will run before the above callback.");//此语句先输出
对于一个普通的ajax异步请求来说,我么在请求开始的时候就要告诉他请求成功之后所要执行的动作,因此就可以类似以这种方式组织代码,控制异步流程。这种调用方式最大的问题就是回调黑洞的问题,一层回调也还好,但涉及到二层、三层、n层的时候就让代码变得复杂很难维护。
第二种方式自己在前段时间使用backbone.js作为技术栈的项目的开发中深有体会,对于每一个ajax请求都对其分配一个自定义事件,在ajax成功返回数据的时候,就会触发自定义的事件完成接下来的动作,控制异步流程,代码如下:
第三种方式和第二种的方式性质上有些类似,如果从发布订阅的角度来看,on方法相当于订阅者/观察者,trigger方法相当于发布者。原理上来说无非就是维护一个“消息中心”的数组,通过on方法订阅的事件都会推入“消息中心”数组,最后发布的时候将会匹配“消息中心”数组的事件,进而执行相应的流程。
我们通过jquery的sub/pub插件完成一个很简单的演示。
首先,f2向"信号中心"jQuery订阅"done"信号。
jQuery.subscribe("done", f2);
function f1(){
setTimeout(function () {
// f1的任务代码
jQuery.publish("done");
}, 1000);
}
f1();
jQuery.publish("done")的意思是,f1执行完成后,向"信号中心"jQuery发布"done"信号,从而引发f2的执行。
第四种方式promise范式,先看一段代码:
我们只要并且仅需要new一个promise对象,就会发现promise对象的参数函数已经执行了,隔两秒之后输出"执行完成"。
接下来再看一段其实际应用的场景代码:
从本质上来看,Promise是一个构造函数,其本身有all、reject、resolve等方法,同时其原型上有then、catch等方法。通过其用Promise new出来的对象自然就有then、catch方法。然后可以通过then方法中的回调函数,获取到上一段异步操作中返回(通过resolve)的数据。从而实现对异步操作的流程控制。
但我的每个函数都得被promise对象包装一下,同时一大堆的then...真是一个听蛋疼的事儿...
综上所述对于异步流程的控制,都有其自身的缺陷,我们最理想的方式便是像操作同步流程那样实现对异步流程的控制,试想一下这样的异步操作流程(加了层层包装,proxy便是发送一个异步请求,接下来的代码便是获取到异步操作返回的数据,细节可暂时忽略):
这感觉就是真他妈的舒服,怎么实现这么一个让人很爽的东西呢,于是我们的主角---伟大的Generator函数登场了。
先理解这么自己悟的一句话:
"javascript是单线程的,顺序执行一段代码,执行到了异步操作,按正常的逻辑走的话就是主队列中的代码继续执行,这时异步队列中的代码还未执行,我们继续执行的代码也就会发生报错。那么解决问题的关键就是,我们能够手动控制代码的向下执行,配合一个东西监听到异步操作的已经正常返回了之后,去手动的操作代码的执行流程,这样的话就实现了已同步的方式控制异步代码的执行"
那么问题变成了解决两个问题。
1、我们是如何实现对于异步操作是否成功返回的监听。
2、如何手动操作代码的向下执行。
对于第一个问题,我们采用的方案是使用promise对象的方式,Promise 的编程思想便是,用于“当xx数据准备完毕,then执行xx动作”这样的场景,用在这里再适合不过。
对于第二个问题,我们便是采用伟大的generator生成器函数,其中的yield特性,可以使我们手动的控制代码的向下执行。
接下来我们实际的解决一个问题:实现对于读取文件异步操作的控制,当读取完文件之后打印读取的内容。
我们依赖于node环境,首先通过promise对其进行封装,实现数据成功的监听。我们手下代码如下:
var fs = require('fs');var readFile = function(fileName) { return new Promise(function(resolve,reject) {
fs.readFile(fileName, function(err, data) { if (err) return reject(err);
resolve(data);
})
})
}
有了这个东西,我们便可以通过其then()表达式,"当数据加载完后,执行某个动作"。那我们执行的动作是啥,自然就是执行下一步的代码的操作。继续看代码:
var gen = function* () { var f1 = yield readFile('/Users/dongzhiqiang/Desktop/demo.txt'); var f2 = yield readFile('/Users/dongzhiqiang/Desktop/demo.txt');
console.log('',f1.toString());
console.log('',f2.toString());
}
这个就是一个generator函数的表达式,在这个函数里面,遇到generator就会执行类似于return的操作。我们通过next()便可以实现手动的控制代码的向下执行。
那么我们如何控制代码的执行流程呢,看下面一段:
var g = gen();
g.next().value.then(function(data){
g.next(data).value.then(function(data){
g.next(data);
});
});
这段的具体解释就是,我们通过promise封装的对象实现了对于异步操作数据返回的监听,当数据返回的时候,我们就通过next()执行下一步的操作,同时把上步操作的值带入到下一个阶段的执行流程之中。
但是上面这段操作很是蛋疼啊,我们要的是一个能通用的操作流程函数。那么我们继续对这段循环操作进行封装:
function run(gen){ var g = gen(); function next(data){ var result = g.next(data); if (result.done) return result.value;
result.value.then(function(data){
next(data);
});
}
next();
}
run(gen);
于是一个非常简单的co模块便诞生了。
最终代码如下:
我们把函数放到run的执行器里面,便实现了同步操作异步代码的过程
js generator 是异步还是同步
是异步
刚刚看了V8引擎的源码,generator都是每次创建一个generator scope,然后将序列执行的方法指针传入,
源码在src/runtime/runtime-generator.cc
通过generator写的mybatis怎么获取新增是的id
在MBG中,最主要也最重要的就是XML配置文件,因此本篇文章主要的内容就是XML配置。
这里按照配置的顺序对配置逐个讲解,更细的内容可以配合中文文档参照。
1. 配置文件头
?xml version="1.0" encoding="UTF-8"?
!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
""
使用最新版的MBG需要使用上面的xml头,配置文件必须包含上面的DOCTYPE。
2. 根节点generatorConfiguration
generatorConfiguration节点没有任何属性,直接写节点即可,如下:
generatorConfiguration
!-- 具体配置内容 --
/generatorConfiguration
3. generatorConfiguration子元素
从这段开始,就是配置的主要内容,这些配置都是generatorConfiguration元素的子元素。
包含以下子元素(有严格的顺序):
properties (0个或1个)
classPathEntry (0个或多个)
context (1个或多个)
3.1 properties 元素
这个元素用来指定外部的属性元素,不是必须的元素。
元素用于指定一个需要在配置中解析使用的外部属性文件,引入属性文件后,可以在配置中使用 ${property}这种形式的引用,通过这种方式引用属性文件中的属性值。 对于后面需要配置的**jdbc信息**和targetProject属性会很有用。
这个属性可以通过resource或者url来指定属性文件的位置,这两个属性只能使用其中一个来指定,同时出现会报错。
resource:指定**classpath**下的属性文件,使用类似com/myproject/generatorConfig.properties这样的属性值。
url:可以指定文件系统上的特定位置,例如
3.2 classPathEntry 元素
这个元素可以0或多个,不受限制。
这个元素的作用是将MBG运行时需要用到的jar包(或zip格式)添加到**classpath**下。
最常见的用法是,当**classpath**下面**没有**JDBC驱动的时候,我们通常通过这个属性指定驱动的路径,例如:
classPathEntry location="E:\mysql\mysql-connector-java-5.1.29.jar"/
如果需要用到其他的jar包,也可以这么配置,例如如果你开发了一个MBG的插件,你就可以通过这种方式加入到**classpath**
这里注意上面重点强调的 没有,一般在项目中使用的时候,**classpath**下面都有JDBC驱动,因此从项目中启动的时候不需要配置该项。
建议:由于该参数使用了绝对路径,因此不利用在不同电脑上通用,因此建议最好把需要的jar包放到项目的**classpath**下,避免每个人都得单独配置路径。
3.3 context 元素
在MBG的配置中,至少需要有一个context元素。
context元素用于指定生成一组对象的环境。例如指定要连接的数据库,要生成对象的类型和要处理的数据库中的表。运行MBG的时候还可以指定要运行的context。
该元素只有一个**必选属性**id,用来唯一确定一个context元素,该id属性可以在运行MBG的使用。
此外还有几个**可选属性**:
defaultModelType:**这个属性很重要**,这个属性定义了MBG如何生成**实体类**。
这个属性有以下可选值:
conditional:*这是默认值*,这个模型和下面的hierarchical类似,除了如果那个单独的类将只包含一个字段,将不会生成一个单独的类。 因此,如果一个表的主键只有一个字段,那么不会为该字段生成单独的实体类,会将该字段合并到基本实体类中。
flat:该模型为每一张表只生成一个实体类。这个实体类包含表中的所有字段。**这种模型最简单,推荐使用。**
hierarchical:如果表有主键,那么该模型会产生一个单独的主键实体类,如果表还有BLOB字段, 则会为表生成一个包含所有BLOB字段的单独的实体类,然后为所有其他的字段生成一个单独的实体类。 MBG会在所有生成的实体类之间维护一个继承关系。
targetRuntime:此属性用于指定生成的代码的运行时环境。该属性支持以下可选值:
MyBatis3:*这是默认值*
MyBatis3Simple
Ibatis2Java2
Ibatis2Java5 一般情况下使用默认值即可,有关这些值的具体作用以及区别请查看中文文档的详细内容。
introspectedColumnImpl:该参数可以指定扩展org.mybatis.generator.api.IntrospectedColumn该类的实现类。该属性的作用可以查看扩展MyBatis Generator。
一般情况下,我们使用如下的配置即可:
context id="Mysql" defaultModelType="flat"
如果你希望不生成和Example查询有关的内容,那么可以按照如下进行配置:
context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat"
使用MyBatis3Simple可以避免在后面的table中逐个进行配置(后面会提到)。
MBG配置中的其他几个元素,基本上都是context的子元素,这些子元素(有严格的配置顺序)包括:
property (0个或多个)
plugin (0个或多个)
commentGenerator (0个或1个)
jdbcConnection (1个)
javaTypeResolver (0个或1个)
javaModelGenerator (1个)
sqlMapGenerator (0个或1个)
javaClientGenerator (0个或1个)
table (1个或多个)
其中property属性比较特殊,后面讲解的时候都会和父元素一起进行讲解。在讲解property属性前,我们先看看**什么是分隔符?**。
这里通过一个例子说明。假设在Mysql数据库中有一个表名为user info,你没有看错,中间是一个空格,这种情况下如果写出select * from user info这样的语句,肯定是要报错的,在Mysql中的时候我们一般会写成如下的样子:
select * from `user info`
这里的使用的**反单引号(`)**就是**分隔符**,**分隔符**可以用于**表名**或者**列名**。
下面继续看property支持的属性:
autoDelimitKeywords
beginningDelimiter
endingDelimiter
javaFileEncoding
javaFormatter
xmlFormatter
由于这些属性比较重要,这里一一讲解。
首先是autoDelimitKeywords,当表名或者字段名为SQL关键字的时候,可以设置该属性为true,MBG会自动给表名或字段名添加**分隔符**。
然后这里继续上面的例子来讲beginningDelimiter和endingDelimiter属性。
由于beginningDelimiter和endingDelimiter的默认值为双引号("),在Mysql中不能这么写,所以还要将这两个默认值改为**反单引号(`)**,配置如下:
property name="beginningDelimiter" value="`"/
property name="endingDelimiter" value="`"/
属性javaFileEncoding设置要使用的Java文件的编码,默认使用当前平台的编码,只有当生产的编码需要特殊指定时才需要使用,一般用不到。
最后两个javaFormatter和xmlFormatter属性**可能会**很有用,如果你想使用模板来定制生成的java文件和xml文件的样式,你可以通过指定这两个属性的值来实现。
接下来分节对其他的子元素逐个进行介绍。
3.3.1 plugin 元素
该元素可以配置0个或者多个,不受限制。
plugin元素用来定义一个插件。插件用于扩展或修改通过MyBatis Generator (MBG)代码生成器生成的代码。
插件将按在配置中配置的顺序执行。
有关插件的详细信息可以参考开发插件和提供的插件了解更多。
3.3.2 commentGenerator 元素
该元素最多可以配置1个。
这个元素非常有用,相信很多人都有过这样的需求,就是希望MBG生成的代码中可以包含**注释信息**,具体就是生成表或字段的备注信息。
使用这个元素就能很简单的实现我们想要的功能。这里先介绍该元素,介绍完后会举例如何扩展实现该功能。
该元素有一个可选属性type,可以指定用户的实现类,该类需要实现org.mybatis.generator.api.CommentGenerator接口。而且必有一个默认的构造方法。这个属性接收默认的特殊值DEFAULT,会使用默认的实现类org.mybatis.generator.internal.DefaultCommentGenerator。
默认的实现类中提供了两个可选属性,需要通过property属性进行配置。
suppressAllComments:**阻止**生成注释,默认为false
suppressDate:**阻止**生成的注释包含时间戳,默认为false
一般情况下由于MBG生成的注释信息没有任何价值,而且有时间戳的情况下每次生成的注释都不一样,使用**版本控制**的时候每次都会提交,因而一般情况下我们都会屏蔽注释信息,可以如下配置:
commentGenerator
property name="suppressAllComments" value="true"/
property name="suppressDate" value="true"/
/commentGenerator
接下来我们简单举例实现生成包含表字段注释信息的注释
因为系统提供了一个默认的实现类,所以对我们来说,自己实现一个会很容易,最简单的方法就是复制默认实现类代码到一个新的文件中,修改类名如MyCommentGenerator,在你自己的实现类中,你可以选择是否继续支持上面的两个属性,你还可以增加对其他属性的支持。
我们通过下面一个方法的修改来了解,其他几个方法请自行修改(写本章的时候我也没有完全实现该类,所以不提供完整源码了):
@Override
public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
if (introspectedColumn.getRemarks() != null !introspectedColumn.getRemarks().equals("")) {
field.addJavaDocLine("/**");
field.addJavaDocLine(" * " + introspectedColumn.getRemarks());
addJavadocTag(field, false);
field.addJavaDocLine(" */");
}
}
这个方法是给字段添加注释信息的,其中IntrospectedColumn包含了字段的完整信息,通过getRemarks方法可以获取字段的注释信息。上面这个方法修改起来还是很容易的。除了字段的注释外还有Getter和Setter,以及类的注释。此外还有生成XML的注释,大家可以根据默认的实现进行修改。
完成我们自己的实现类后,我们还需要做如下配置:
commentGenerator type="com.github.abel533.mybatis.generator.MyCommentGenerator"/
3.3.3 jdbcConnection 元素
jdbcConnection用于指定数据库连接信息,该元素必选,并且只能有一个。
配置该元素只需要注意如果JDBC驱动不在**classpath**下,就需要通过classPathEntry元素引入jar包,这里**推荐**将jar包放到**classpath**下。
该元素有两个必选属性:
driverClass:访问数据库的JDBC驱动程序的完全限定类名
connectionURL:访问数据库的JDBC连接URL
该元素还有两个可选属性:
userId:访问数据库的用户ID
password:访问数据库的密码
此外该元素还可以接受多个property子元素,这里配置的property属性都会添加到JDBC驱动的属性中。
这个元素配置起来最容易,这里举个简单例子:
jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/test"
userId="root"
password=""
/jdbcConnection
3.3.4 javaTypeResolver 元素
该元素最多可以配置一个。
这个元素的配置用来指定JDBC类型和Java类型如何转换。
该元素提供了一个可选的属性type,和commentGenerator比较类型,提供了默认的实现DEFAULT,一般情况下使用默认即可,需要特殊处理的情况可以通过其他元素配置来解决,不建议修改该属性。
该属性还有一个可以配置的property元素。
可以配置的属性为forceBigDecimals,该属性可以控制是否强制DECIMAL和NUMERIC类型的字段转换为Java类型的java.math.BigDecimal,默认值为false,一般不需要配置。
默认情况下的转换规则为:
如果精度0或者长度18,就会使用java.math.BigDecimal
如果精度=0并且10=长度=18,就会使用java.lang.Long
如果精度=0并且5=长度=9,就会使用java.lang.Integer
如果精度=0并且长度5,就会使用java.lang.Short
如果设置为true,那么一定会使用java.math.BigDecimal,配置示例如下:
javaTypeResolver
property name="forceBigDecimals" value="true" /
/javaTypeResolver
3.3.5 javaModelGenerator 元素
该元素必须配置一个,并且最多一个。
该元素用来控制生成的实体类,根据context中配置的defaultModelType,一个表可能会对应生成多个不同的实体类。一个表对应多个类实际上并不方便,所以前面也推荐使用flat,这种情况下一个表对应一个实体类。
该元素只有两个属性,都是必选的。
targetPackage:生成实体类存放的包名,一般就是放在该包下。实际还会受到其他配置的影响(table中会提到)。
targetProject:指定目标项目路径,使用的是文件系统的绝对路径。
该元素支持以下几个property子元素属性:
constructorBased:该属性只对MyBatis3有效,如果true就会使用构造方法入参,如果false就会使用setter方式。默认为false。
enableSubPackages:如果true,MBG会根据catalog和schema来生成子包。如果false就会直接用targetPackage属性。默认为false。
immutable:该属性用来配置实体类属性是否可变,如果设置为true,那么constructorBased不管设置成什么,都会使用构造方法入参,并且不会生成setter方法。如果为false,实体类属性就可以改变。默认为false。
rootClass:设置所有实体类的基类。如果设置,需要使用类的全限定名称。并且如果MBG能够加载rootClass,那么MBG不会覆盖和父类中完全匹配的属性。匹配规则:
属性名完全相同
属性类型相同
属性有getter方法
属性有setter方法
trimStrings:是否对数据库查询结果进行trim操作,如果设置为true就会生成类似这样public void setUsername(String username) {this.username = username == null ? null : username.trim();}的setter方法。默认值为false。
配置示例如下:
javaModelGenerator targetPackage="test.model" targetProject="E:\MyProject\src\main\java"
property name="enableSubPackages" value="true" /
property name="trimStrings" value="true" /
/javaModelGenerator
3.3.6 sqlMapGenerator 元素
该元素可选,最多配置一个。但是有如下两种必选的特殊情况:
如果targetRuntime目标是**iBATIS2**,该元素必须配置一个。
如果targetRuntime目标是**MyBatis3**,只有当javaClientGenerator需要XML时,该元素必须配置一个。 如果没有配置javaClientGenerator,则使用以下的规则:
如果指定了一个sqlMapGenerator,那么MBG将只生成XML的SQL映射文件和实体类。
如果没有指定sqlMapGenerator,那么MBG将只生成实体类。
该元素只有两个属性(和前面提过的javaModelGenerator的属性含义一样),都是必选的。
targetPackage:生成实体类存放的包名,一般就是放在该包下。实际还会受到其他配置的影响(table中会提到)。
targetProject:指定目标项目路径,使用的是文件系统的绝对路径。
该元素支持property子元素,只有一个可以配置的属性:
enableSubPackages:如果true,MBG会根据catalog和schema来生成子包。如果false就会直接用targetPackage属性。默认为false。
配置示例:
sqlMapGenerator targetPackage="test.xml" targetProject="E:\MyProject\src\main\resources"
property name="enableSubPackages" value="true" /
/sqlMapGenerator
3.3.7 javaClientGenerator 元素
该元素可选,最多配置一个。
如果不配置该元素,就不会生成Mapper接口。
该元素有3个必选属性:
type:该属性用于选择一个预定义的客户端代码(可以理解为Mapper接口)生成器,用户可以自定义实现,需要继承org.mybatis.generator.codegen.AbstractJavaClientGenerator类,必选有一个默认的构造方法。 该属性提供了以下预定的代码生成器,首先根据context的targetRuntime分成三类:
MyBatis3:
ANNOTATEDMAPPER:基于注解的Mapper接口,不会有对应的XML映射文件
MIXEDMAPPER:XML和注解的混合形式,(上面这种情况中的)SqlProvider注解方法会被XML替代。
XMLMAPPER:所有的方法都在XML中,接口调用依赖XML文件。
MyBatis3Simple:
ANNOTATEDMAPPER:基于注解的Mapper接口,不会有对应的XML映射文件
XMLMAPPER:所有的方法都在XML中,接口调用依赖XML文件。
Ibatis2Java2或**Ibatis2Java5**:
IBATIS:生成的对象符合iBATIS的DAO框架(不建议使用)。
GENERIC-CI:生成的对象将只依赖于SqlMapClient,通过构造方法注入。
GENERIC-SI:生成的对象将只依赖于SqlMapClient,通过setter方法注入。
SPRING:生成的对象符合Spring的DAO接口
targetPackage:生成实体类存放的包名,一般就是放在该包下。实际还会受到其他配置的影响(table中会提到)。
targetProject:指定目标项目路径,使用的是文件系统的绝对路径。
该元素还有一个可选属性:
implementationPackage:如果指定了该属性,实现类就会生成在这个包中。
该元素支持property子元素设置的属性:
enableSubPackages
exampleMethodVisibility
methodNameCalculator
rootInterface
useLegacyBuilder
这几个属性不太常用,具体作用请看完整的文档,这里对rootInterface做个简单介绍。
rootInterface用于指定一个所有生成的接口都继承的父接口。 这个值可以通过table配置的rootInterface属性覆盖。
这个属性对于通用Mapper来说,可以让生成的所有接口都继承该接口。
python如何修改已创建好的generator?
list = range(10)
g1 = (i for i in list)
上面是如何转换list成为生成器,
至于如何修改,如果是指在程序里动态修改的话,可以用类自定义个生成器,然后再定义方法去修改它。
转载请说明来源于"b2c信息网"