今年是2013年的杀青之日,前几天由于比较忙,没有及时更新本篇的最后一篇东西,前六篇中我们主要都是采用手动配置相关的Mybatis映射文件与相 应的接口类与实体类。当然如果在真正的使用过程中,由于业务的复杂度,表少点的话还好如果相关业务表很多,难道我们都要一个个这样去配置嘛,这显然不可 能,今天就要讲述怎么通过官方提供的MyBatisGenerator生成相应的配置文件。还记得第一章中我们要求准备的2个核心jar包嘛,一个是用于 Mybatis的核心业务,另一个mybatis-generator-core-1.3.1.jar就是这边用到的,闲话不多少了,我们看看怎么样用这 个工具自动生成相应的配置。
对于使用这个MybatisGenerator(下面简称MBG)配置工具我们必须了解和知道的信息:
MBG工具主要能够生成
1. Java POJO(对应于表结构的生成),主要可以生成满足如下条件的实体类
1.1 表的主键字段(如果有的话)
1.2 表的非主键字段(不包含BLOB类型的字段)
1.3 一个包含BLOB字段的表
1.4 该类允许动态的select,update,delete操作
2. 对应MBG配置里面配置表的那些简单CRUD操作,如果需要的选择语句是多表联合查询的还是需要自己在那个基础上手动修改。
2.1 新增记录
2.2 根据主键更新记录
2.3 根据动态条件更新记录
2.4 根据主键删除记录
2.5 根据非主键的条件删除记录
2.6 根据主键查询记录
2.7 根据相应条件查询记录
2.8 统计相应记录数
上述的那些语句是表结构情况来定(例如如果这个表没有主键,那MBG就不会生成相应的与主键相关的Mapper信息节点)
3. 如果过多次运行生成操作,如果发现有同名的Mapper文件,MBG将自动合并相应的Mapper.xml并把他合并后的文件当成新的配置文件,
当然它不会合并掉你已经添加的那些自定义的配置文件变化信息,你可以多次运行而不必担心定制的内容被覆盖。
4. Mapper配置会相应的合并,但是MBG是不会去合并相应的Java文件,包括POJO的实体类,与相应的接口类,它会采取覆盖或者重新成
成另外个名字的新文件,如果你多次生成了配置文件,你只有手动去合并那些已经有的改动,当然如果你运行Eclipse的插件那么MBG就可
以自动合并相应的Java信息文件了
5. 依赖性,该MBG工具除了要求是JRE5.0以上的环境与一个JDBC驱动包,没有其他特别需要的依赖。
说了那么多注意事项,我们可以动手开始弄了。
MBG的运行主要依靠一份XML配置文件,首先我们可以重新新建一个项目名为MybatisGenerator,新建3个包分别名叫 config,david.test,与david.mbg,config包主要存放真正的Mybatis里面需要用到的配置文件,可以把前几章中项目中 的mybatis_demo_config.xml拷贝过来放在这个目录下,等等用作测试程序之用,david.test顾名思义就是存放以下常用的方法 和测试程序大家也可以吧前几章中用到MybatisUtils工具类拿过来,新建好相应的MainFunction以备测试之用。而最后的david.mbg中就是我们今天要配置的XML,MBG生成配置文件。
如图所示,我们在下面新建好一个名为mbg_configuration.xml的配置文件,详情如下:
MBG配置文件
<?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>
<classPathEntry
location="./lib/mysql-connector-java-5.1.26-bin.jar" />
<context id="mybatisDemoForMysql" targetRuntime="MyBatis3">
<!-- 控制注释 -->
<commentGenerator>
<!-- 是否去除所有自动生成的注释文件 -->
<property name="suppressAllComments" value="true" />
<!-- 是否去除所有自动生成的文件的时间戳,默认为false -->
<property name="suppressDate" value="true" />
</commentGenerator>
<!-- 控制数据库 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://127.0.0.1:3306/mybatis_db?characterEncoding=utf8"
userId="root" password="david0110" />
<javaTypeResolver>
<!-- 把jdbc中的decimal与numberic类型转化为integer类型 -->
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- 数据库表对应的model -->
<javaModelGenerator targetPackage="david.model"
targetProject="src">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- 控制Model的xmlMapper文件 -->
<sqlMapGenerator targetPackage="david.mappers"
targetProject="src">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- 控制mapper接口 -->
<javaClientGenerator targetPackage="david.inter"
type="XMLMAPPER" targetProject="src">
<property name="enableSubPackages" value="true" />
<property name="methodNameCalculator" value="extended" />
</javaClientGenerator>
<!-- schema你的数据库,tableName表明,domainObjectName对应你的javabean类名,是否生成相应的example -->
<table schema="mybatis_db" tableName="visitor" domainObjectName="Visitor"
enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false">
<generatedKey column="id" sqlStatement="MySql" />
<columnOverride column="name" property="visitor_name" />
<ignoreColumn column="status" delimitedColumnName="false" />
</table>
</context>
</generatorConfiguration> 大家可以注意到其实主要是这几个节点
<classPathEntry>=> 存放jdbc驱动包的位置,可以采用相对路径,也可以采用绝对路径,此处示例中采用了相对路径
<context>=>对应一个数据库下所有表的配置,可以有多个context,一个配置mysql,一个配置oracle。
<context>节点下主要有:
<commentGenerator> => 注释生成节点,此示例中下的2个子节点分表代表
suppressAllComments => 是否去除所有自动生成的注释文件
suppressDate => 是否去除所有自动生成的文件的时间戳,默认为false
<jdbcConnection> => 数据库连接配置信息
<javaTypeResolver> => 把jdbc中的decimal与numberic类型转化为java.math.BigDeciaml形式表示
<javaModelGenerator> => 配置你的POJO实体类,targetPackage="david.model",对应你的报名,可以自己根据实际业务取 名,targetProject="src",在Eclipse环境下,指代的是项目和源文件夹的路径一般是指src目录,你的包都会新建在这个目录下, 如果不是Eclipse环境,此处的值应该是个实际存在的文件系统路径,如果指定的路径不存在会报错,因为MBG不会自己创建相应的文件夹
<sqlMapGenerator> => 配置生成相应的实体Mapper.xml,对于Mapper3.X我们需要把type="XMLMAPPER"
<javaClientGenerator> => 配置生成相应的接口类,对应与Mapper.xml中的一系列CRUD方法SQL语句
<table> => 配置相应的数据库,对应的表明与想要生成领域类名(也就是实体类名字),此示例中我关闭了所有不必要的Example生成信息
上述所有的信息都可以去官网查阅相应文档,或者到我的文件中去下载,里面相应的配置说明与相关应用示例。下载文档
配 置完上面的信息,最后一步是什么呢,我们就是要运行这个脚本文件了,官方说明中有4种方式,第一通过命令行方式,第二,三都是通过Ant或者Maven之 类的工具生成,最后一种就是通过Java代码生成,我们这里就采用通过Java大麦生成的方式。在DemoRun类中添加一个生成脚本的方法如下:
脚本生成方法
private static void generateMbgConfiguration() {
/*
* Mybatis自带Generator工具生成相应东西
*/
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
File configFile = new File("./src/david/mbg/mbg_configuration.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = null;
try {
config = cp.parseConfiguration(configFile);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XMLParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
try {
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
} catch (InvalidConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("生成Mybatis配置成功!");
} 运行后再Refresh下项目你会发现下面神奇的帮你生成了主要配置,下图红框部分:
最后我们来使用下自动生成的成果吧,我们可以参照前六章的方式,在DemoRun中添加相应的CRUD测试方法如下:
CRUD测试方法
/*
* 查询访问者信息
*/
public static void testGenerateAdd() {
SqlSession session = MybatisUtils.getSqlSession();
VisitorMapper vOperation = session.getMapper(VisitorMapper.class);
Visitor visitor = new Visitor();
visitor.setVisitor_name("hello2");
visitor.setEmail("helloworld2@qq.com");
visitor.setCreatetime(new Date());
int count = vOperation.insert(visitor);
session.commit();
MybatisUtils.closeSession(session);
MybatisUtils.showMessages(CRUD_Enum.Add, count);
}
/*
* 查询访问者信息
*/
public static void testGenerateQuery(int id) {
SqlSession session = MybatisUtils.getSqlSession();
VisitorMapper vOperation = session.getMapper(VisitorMapper.class);
Visitor visitor = vOperation.selectByPrimaryKey(id);
MybatisUtils.closeSession(session);
MybatisUtils.showMessages(CRUD_Enum.Query, 1);
System.out.println(visitor);
}
public static void testGenerateDelete(int id) {
SqlSession session = MybatisUtils.getSqlSession();
VisitorMapper vOperation = session.getMapper(VisitorMapper.class);
int count = vOperation.deleteByPrimaryKey(id);
session.commit();
MybatisUtils.closeSession(session);
MybatisUtils.showMessages(CRUD_Enum.Delete, count);
}
public static void testGenerateUpdate(int id) {
SqlSession session = MybatisUtils.getSqlSession();
VisitorMapper vOperation = session.getMapper(VisitorMapper.class);
Visitor visitor = vOperation.selectByPrimaryKey(id);
System.out.println(visitor);
String name = visitor.getVisitor_name();
if (name.contains("update")) {
visitor.setVisitor_name(name.substring(0, name.indexOf("update")));
} else {
visitor.setVisitor_name(name + "update");
}
int count = vOperation.updateByPrimaryKey(visitor);
session.commit();
MybatisUtils.closeSession(session);
MybatisUtils.showMessages(CRUD_Enum.Update, count);
System.out.println(visitor);
} 运行下测试程序,结果就出来了
有 没有感觉使用这个帮你提高了不少效率,不必在为繁琐的配置而头痛了,至少不用做重复的无谓的步骤了,让这些都交给工具去做吧^0^,当然在实际的使用中我 们可能需要在生成后修改相应的类信息与接口信息名字,当然这些工作量已经不是太多了。希望今天这些内容对需要配置的同学有所帮助。
Mybatis系列用例源码下载
MybatisGenerator用例源码下载