今年是2013年的杀青之日,前几天因为比较忙,没有及时更新本篇的最后一篇东西,前六篇中咱们主要都是采用手动配置相关的Mybatis映射文件与相应的接口类与实体类。固然若是在真正的使用过程当中,因为业务的复杂度,表少点的话还好若是相关业务表不少,难道咱们都要一个个这样去配置嘛,这显然不可能,今天就要讲述怎么经过官方提供的MyBatisGenerator生成相应的配置文件。还记得第一章中咱们要求准备的2个核心jar包嘛,一个是用于Mybatis的核心业务,另外一个mybatis-generator-core-1.3.1.jar就是这边用到的,闲话很少少了,咱们看看怎么样用这个工具自动生成相应的配置。java
对于使用这个MybatisGenerator(下面简称MBG)配置工具咱们必须了解和知道的信息:mysql
MBG工具主要可以生成
sql
1. Java POJO(对应于表结构的生成),主要能够生成知足以下条件的实体类数据库
1.1 表的主键字段(若是有的话)
session
1.2 表的非主键字段(不包含BLOB类型的字段)mybatis
1.3 一个包含BLOB字段的表oracle
1.4 该类容许动态的select,update,delete操做app
2. 对应MBG配置里面配置表的那些简单CRUD操做,若是须要的选择语句是多表联合查询的仍是须要本身在那个基础上手动修改。
dom
2.1 新增记录ide
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的配置文件,详情以下:
<?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测试方法以下:
/* * 查询访问者信息 */ 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^,固然在实际的使用中咱们可能须要在生成后修改相应的类信息与接口信息名字,固然这些工做量已经不是太多了。但愿今天这些内容对须要配置的同窗有所帮助。