Hibernate 根据写好的 pojo启动服务器会自动帮助我们生成对应的数据表。
Mybatis Generator简称 MBG,是一个专门为 MyBatis和 ibatis框架使用者提供的代码生成器。也可以快速的根据数据表生成对应的pojo类、Mapper接口、Mapper文件,甚至生成QBC风格的查询对象。
一般在项目中,根据MyBatis Generator的XML配置文件设置生成简单的CRUD,但是复杂的查询或者有关关联的操作还是需要我们写SQL完成。
新建一个 maven web项目,pom.xml引出 mybatis-generator依赖
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- mybatis-generator -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
Bash
Copy
一、使用 targetRuntime="MyBatis3Simple" 生成
MyBatis3Simple:类似MyBatis3,只是不生成XXXBySample
1、MBG 的配置文件,一般起名为 generatorConfig.xml:一般项目中使用这些就OK
<?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>
<!--targetRuntime用MyBatis3, 也就是默认的-->
<context id="mysqlTables" targetRuntime="MyBatis3Simple">
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--jdbc的数据库连接-->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatis_demo?useUnicode=true;characterEncoding=utf8;useSSL=true;serverTimezone=GMT"
userId="root"
password="123456">
</jdbcConnection>
<!--非必须,Java类型解析器,在数据库类型和java类型之间的转换控制-->
<javaTypeResolver>
<!--
true:使用BigDecimal对应DECIMAL和 NUMERIC数据类型
false:默认,
scale>0;length>18:使用BigDecimal;
scale=0;length[10,18]:使用Long;
scale=0;length[5,9]:使用Integer;
scale=0;length<5:使用Short; -->
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- java模型创建器,即配置生成java POJO实体类的位置
负责:1,key类(见context的defaultModelType);2,java类;3,查询类
targetPackage:生成的类要放的包,真实的包受enableSubPackages属性控制;
targetProject:目标项目,指定一个存在的目录下,生成的内容会放到指定目录中,如果目录不存在,MBG不会自动建目录
-->
<javaModelGenerator targetPackage="cn.jq.jqmybatis.model" targetProject=".\src\main\java">
<!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下(即是否允许子包),默认为false -->
<property name="enableSubPackages" value="true"/>
<!-- 设置是否在getter方法中,对String类型字段调用trim()方法 -->
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- Mapper映射生成器,即配置生成生成XxxMapper.xml的位置 -->
<sqlMapGenerator targetPackage="cn.jq.jqmybatis.dao" targetProject=".\src\main\java">
<!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!--Mapper接口生成器, 即配置生成生成的 Mapper接口的位置,注意,如果没有配置该元素,那么默认不会生成Mapper接口
type:选择怎么生成mapper接口(在MyBatis3/MyBatis3Simple下):
1,ANNOTATEDMAPPER:会生成使用Mapper接口+Annotation的方式创建(SQL生成在annotation中),不会生成对应的XML;
2,MIXEDMAPPER:使用混合配置,会生成Mapper接口,并适当添加合适的Annotation,但是XML会生成在XML中;
3,XMLMAPPER:会生成Mapper接口,接口完全依赖XML;
注意,如果context是MyBatis3Simple:只支持ANNOTATEDMAPPER和XMLMAPPER
-->
<javaClientGenerator type="XMLMAPPER" targetPackage="cn.jq.jqmybatis.dao" targetProject=".\src\main\java">
<!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 指定数据库中的数据表(可同时指定多张表)进行生成 -->
<!--字段命名策略过程: table标签对应数据库中的table表-->
<table tableName="t_user" domainObjectName="User"></table>
<table tableName="t_role" domainObjectName="Role"></table>
</context>
</generatorConfiguration>
Bash
Copy
2、MBG启动类:使用 Java代码运行,也可使用 Maven插件运行
固定写法,可参考官方文档:http://www.mybatis.org/generator/running/runningWithJava.html
public class App {
public static void main(String[] args) {
try {
App app = new App();
app.generator();
} catch (Exception e) {
e.printStackTrace();
}
}
public void generator() throws Exception{
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
// 指定 逆向工程配置文件,这两种都可以
String path = this.getClass().getClassLoader().getResource("generatorConfig.xml").getPath();
File configFile = new File(path);
// File configFile = new File("D:/JDWorkspaceIDEA19/jqmybatis/src/main/resources/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);
}
}
Bash
Copy
3、生成的文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.jq.jqmybatis.dao.UserMapper">
<resultMap id="BaseResultMap" type="cn.jq.jqmybatis.model.User">
<id column="id" jdbcType="BIGINT" property="id" />
<result column="username" jdbcType="VARCHAR" property="username" />
<result column="pazzword" jdbcType="VARCHAR" property="pazzword" />
<result column="salary" jdbcType="DECIMAL" property="salary" />
<result column="reg_date" jdbcType="TIMESTAMP" property="regDate" />
</resultMap>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
delete from t_user
where id = #{id,jdbcType=BIGINT}
</delete>
<insert id="insert" parameterType="cn.jq.jqmybatis.model.User">
insert into t_user (id, username, pazzword,
salary, reg_date)
values (#{id,jdbcType=BIGINT}, #{username,jdbcType=VARCHAR}, #{pazzword,jdbcType=VARCHAR},
#{salary,jdbcType=DECIMAL}, #{regDate,jdbcType=TIMESTAMP})
</insert>
<update id="updateByPrimaryKey" parameterType="cn.jq.jqmybatis.model.User">
update t_user
set username = #{username,jdbcType=VARCHAR},
pazzword = #{pazzword,jdbcType=VARCHAR},
salary = #{salary,jdbcType=DECIMAL},
reg_date = #{regDate,jdbcType=TIMESTAMP}
where id = #{id,jdbcType=BIGINT}
</update>
<select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
select id, username, pazzword, salary, reg_date
from t_user
where id = #{id,jdbcType=BIGINT}
</select>
<select id="selectAll" resultMap="BaseResultMap">
select id, username, pazzword, salary, reg_date
from t_user
</select>
</mapper>
Bash
Copy
二、使用 targetRuntime="MyBatis3" 生成
MyBatis3:默认的值,生成基于MyBatis3.x以上版本的内容,包括XXXBySample
把 MBG配置文件 那里改为 MyBatis3 即可,启动类一样,需要生成那张表,运行它即可
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.jq.jqmybatis.dao.UserMapper">
<resultMap id="BaseResultMap" type="cn.jq.jqmybatis.model.User">
<id column="id" jdbcType="BIGINT" property="id" />
<result column="username" jdbcType="VARCHAR" property="username" />
<result column="pazzword" jdbcType="VARCHAR" property="pazzword" />
<result column="salary" jdbcType="DECIMAL" property="salary" />
<result column="reg_date" jdbcType="TIMESTAMP" property="regDate" />
</resultMap>
<sql id="Example_Where_Clause">
<where>
<foreach collection="oredCriteria" item="criteria" separator="or">
<if test="criteria.valid">
<trim prefix="(" prefixOverrides="and" suffix=")">
<foreach collection="criteria.criteria" item="criterion">
<choose>
<when test="criterion.noValue">
and ${criterion.condition}
</when>
<when test="criterion.singleValue">
and ${criterion.condition} #{criterion.value}
</when>
<when test="criterion.betweenValue">
and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
</when>
<when test="criterion.listValue">
and ${criterion.condition}
<foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
#{listItem}
</foreach>
</when>
</choose>
</foreach>
</trim>
</if>
</foreach>
</where>
</sql>
<sql id="Update_By_Example_Where_Clause">
<where>
<foreach collection="example.oredCriteria" item="criteria" separator="or">
<if test="criteria.valid">
<trim prefix="(" prefixOverrides="and" suffix=")">
<foreach collection="criteria.criteria" item="criterion">
<choose>
<when test="criterion.noValue">
and