使用过MyBatis的小伙伴都知道,做一个SSM项目,需要在配置Spring、SpringMVC、MyBatis的文件上花费巨额精力,对于小项目来说,是得不偿失的 ,这里给大家介绍一个关于逆向生成MyBatis的方法:
逆向生成的作用:
可以自动生成关于数据库中的表的实体类
可以自动生成实体类的持久层Dao
可以自动生成持久层的映射文件Mapper
首先、进入官网http://www.mybatis.org/generator/
这里有关于MyBatis逆向生成的说明使用接着再下载逆向生成的关键jar包
mybatis-generator-core
,如果是Maven用户,则按下配置
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
- 现在我们就可以搭建逆向生成的项目了
回到说明文档中进入
XML configuration Reference
模块
右边是关于逆向生成的配置文件,我们只需要在我们项目文件下新建一个XML配置文件,然后将内容复制过来这里我新建了一个
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>
<!--将无用的属性注释掉,我们只保留所需要的-->
<!-- <classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />-->
<!-- 这里配置数据库连接池的四要素 -->
<jdbcConnection driverClass="COM.ibm.db2.jdbc.app.DB2Driver"
connectionURL="jdbc:db2:TEST"
userId="db2admin"
password="db2admin">
</jdbcConnection>
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<context id="DB2Tables" targetRuntime="MyBatis3">
<!-- 这里指定javaBean实体类的生成位置属性等,是按照数据库中表来生成 -->
<javaModelGenerator targetPackage="test.model" targetProject="\MBGTestProject\src">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- 指定sql映射文件生成的位置 -->
<sqlMapGenerator targetPackage="test.xml" targetProject="\MBGTestProject\src">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- 指定dao接口生成位置,mapper接口 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="test.dao" targetProject="\MBGTestProject\src">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!-- table指定每一个表生成策略 -->
<table schema="DB2ADMIN" tableName="ALLTYPES" domainObjectName="Customer" >
<property name="useActualColumnNames" value="true"/>
<generatedKey column="ID" sqlStatement="DB2" identity="true" />
<columnOverride column="DATE_FIELD" property="startDate" />
<ignoreColumn column="FRED" />
<columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />
</table>
</context>
</generatorConfiguration>
我项目结构为
按我的需求将配置文件进行更改
<?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>
<context id="testTables" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/ssm"
userId="root"
password="1111">
</jdbcConnection>
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true
时把JDBC DECIMAL 和
NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 生成模型(PO)的包名和位置 -->
<javaModelGenerator targetPackage="com.shaw.bean"
targetProject="src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false"/>
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 生成映射文件的包名和位置-->
<sqlMapGenerator targetPackage="mapper"
targetProject="src/main/resources">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<!-- 生成DAO的包名和位置-->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.shaw.dao"
targetProject="src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false"/>
</javaClientGenerator>
<!-- 要生成的表 tableName是数据库中的表名或视图名 domainObjectName是
实体类名-->
<table tableName="student" domainObjectName="Student"/>
<table tableName="teacher" domainObjectName="Teacher"/>
</context>
</generatorConfiguration>
看不懂的小伙伴可以结合我的结构图
我要生成的为student和teacher两张表
接着我们创建一个简单的入口函数类
public class demo {
public static void main(String[] args) throws IOException, XMLParserException, InvalidConfigurationException, SQLException, InterruptedException {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
//指定 逆向工程配置文件,这里指定你的逆向生成配置文件路径
//我的结合上图放在src下,所以路径为src/generatorConfig.xml
File configFile = new File("src/generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
}
}
然后运行这个程序,可以看到程序已经按我们所要求的生成了相应的实体类,mapper映射文件和数据持久层Dao
然后,我们打开看看,可以看到
Student
表中的id字段和name
字段都被自动生成,并实现了get
和set
方法,这里只列举了Student
,大家可以自己去尝试,关于下面的StudentExample
类是对student
类进行动态包装的类,我们查询只需要将条件交给它,就可以得到想要的数据
我们再看看数据持久层Dao层是否正确生成,我们可以看到,通过条件查询均使用
StudentExample
类,这个持久层接口已经帮我们写好了所需要的基本功能
然后再看看我们的持久层实现映射文件,通过对比也可以看到,每一个接口都帮我们重写了里面的功能,我们只需要负责调用,这很符合Java面向对象的特征