基于 SSM 框架开发,Mybatis 属于半自动 ORM,如果每个数据表相关的 Model、Dao、Mapping 都要自己动手去写,是不是很麻烦呢?工作量最大的就是书写Mapping的映射文件,而且手动书写很容易出错。
这里就介绍一个用于 MyBatis 的代码生成工具 MyBatis Generator,MyBatis Generator 简称(MBG)是 MyBatis 和 iBATIS 的代码生成器。
它将生成所有版本的MyBatis的代码,以及版本2.2.0之后的iBATIS版本。它将内省数据库表(或许多表),并将生成可用于访问表的工件。这减少了设置对象和配置文件以与数据库表进行交互的最初麻烦。MBG旨在对简单的CRUD(创建,检索,更新,删除)的大量数据库操作产生重大影响。您仍然需要为连接查询或存储过程手动编写 SQL 和对象。更多请参考:MyBatis Generator (MBG) 代码生成器简介
本文参考:MyBatis Generator 代码生成器 快速入门指南
本文完整示例下载:MyBatis Generator 代码生成器+MySQL驱动+配置文件
工作原理
代码生成器需要一个实现 DatabaseMetaData 接口的 JDBC 驱动程序,尤其是 getColumns 和 getPrimaryKeys 方法。
通过 DatabaseMetaData 数据库元数据信息接口,可以获取数据库中有哪些表,表中有哪些列以及列的数据类型、长度、是否允许为空、注释,主键是什么等信息,根据这些信息再根据实体类(Entity 或 POJO)的格式、MyBatis 的 Mapper.xml 格式、Dao 层类的格式等生成对应的文件。
前期准备
1、下载 MyBatis Generator
最新版本:MyBatis Generator Release 1.3.5
有关版本的更多信息请参考:MyBatis Generator中的新功能
2、下载数据库驱动程序
连接不同的数据库,需要使用对应的驱动程序。
针对 MySQL,我们需要下载 Connector/J,MySQL Connector / J是MySQL的官方JDBC驱动程序。
最新版本:Connector/J 5.1.44
3、编写配置文件
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="mysql-connector-java-5.1.30.jar" />
<context id="DB2Tables" targetRuntime="MyBatis3">
<!-- 指定生成的java文件的编码,没有直接生成到项目时中文可能会乱码 -->
<property name="javaFileEncoding" value="UTF-8"/>
<commentGenerator>
<property name="suppressDate" value="true"/>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--数据库链接URL,用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/db_test" userId="root"
password="xxx">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<javaModelGenerator targetPackage="test.model"
targetProject="./src">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<sqlMapGenerator targetPackage="test.xml"
targetProject="./src">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER"
targetPackage="test.dao" targetProject="./src">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<table tableName="base_area">
</table>
</context>
</generatorConfiguration>
注意:你使用的版本号可能与我的不同。classPathEntry 标签中的“mysql-connector-java-5.1.30.jar” 要改为对应的版本。jdbcConnection 数据库连接信息需要修改为你自己的实际的信息。table 标签必须存在,一个标签只能指定一个表,多个表可以存在多个 table 标签。
tableName 可以使用通配符 % 来匹配全部的表,例如:
<table tableName="%">
<generatedKey column="id" sqlStatement="Mysql"/>
</table>
更多细节请参考:MyBatis Generator XML 配置文件参考
4、关于包的存放目录
将 mybatis-generator-core-1.3.5.jar,mysql-connector-java-5.1.30.jar,generatorConfig.xml 等文件放在同一个目录下,
参考我的目录结构:
注意:你使用的版本号可能与我的不同。src 目录需要你自己创建。生成的文件会按配置文件中指定的包名创建目录结构。
生成代码
1、打开终端
2、切换目录到 mybatis-generator-core-1.3.5.jar,mysql-connector-java-5.1.30.jar,generatorConfig.xml 等文件所在的目录
3、执行命令
$ java -jar mybatis-generator-core-1.3.5.jar -configfile generatorConfig.xml -overwrite
看到输出:
MyBatis Generator finished successfully.
就说明生成成功了。
常见错误:
你可能会遇到错误一:
Exception in thread "main" java.lang.RuntimeException: Cannot resolve classpath
entry: mysql-connector-java-5.1.30.jar
at org.mybatis.generator.internal.util.ClassloaderUtility.getCustomClass
loader(ClassloaderUtility.java:49)
at org.mybatis.generator.api.MyBatisGenerator.generate(MyBatisGenerator.
java:245)
at org.mybatis.generator.api.MyBatisGenerator.generate(MyBatisGenerator.
java:189)
at org.mybatis.generator.api.ShellRunner.main(ShellRunner.java:117)
Cannot resolve classpath entry: mysql-connector-java-5.1.30.jar
查看 generatorConfig.xml 文件所在的目录中是否存在名称为“mysql-connector-java-5.1.30.jar”的文件,
是不是你下载的版本和我用的不一致?改为对应的版本的文件名称就可以了。
错误二:
XML Parser Errors occurred:
XML Parser Error on line 1: 前言中不允许有内容。
在 Windows 下遇到这个问题,解决方法:采用无 BOM 格式编码
错误三:
The specified target project directory ./src does not exist
你需要手动创建一个目录。
代码预览
数据表结构
SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for `base_area`
-- ----------------------------
DROP TABLE IF EXISTS `base_area`;
CREATE TABLE `base_area` (
`ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
`AREA_NAME` varchar(255) DEFAULT NULL COMMENT '地区名称',
`AREA_CODE` varchar(255) DEFAULT NULL COMMENT '地区编码',
`PARENT_ID` bigint(20) DEFAULT NULL COMMENT '上级地区编号',
`PLAT_MARK` bigint(20) DEFAULT NULL COMMENT '区域标识,也就是平台标识',
`LEVEL` tinyint(4) DEFAULT '1' COMMENT '级别',
`STATUS` tinyint(4) DEFAULT '1' COMMENT '是否可用、是否显示',
`EXPAND` tinyint(4) DEFAULT '0' COMMENT '是否展开子节点,非0为展开。',
PRIMARY KEY (`ID`),
KEY `index2` (`PLAT_MARK`)
) ENGINE=InnoDB AUTO_INCREMENT=3514 DEFAULT CHARSET=utf8;
SET FOREIGN_KEY_CHECKS = 1;
生成的代码文件:
dao/BaseAreaMapper.java
package test.dao;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import test.model.Ba