mybatis generator提供的代码生成功能解决了繁琐的sql文件编写,提供了类似hibernate的javaapi编程拼装sql功能,对于效率提高颇有帮助。
MBG的配置使用
本文采用maven方式配置。
1.在pom.xml中加入插件,<build>应该与<dependencies>并列
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.0</version>
<!-- 所需依赖 -->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
</dependencies>
<configuration>
<!--配置文件的路径 -->
<configurationFile>${basedir}/src/main/resources/generatorConfig.xml</configurationFile>
<!-- 重复生成是否覆盖源文件 -->
<overwrite>true</overwrite>
</configuration>
</plugin>
</plugins>
</build>
2.在resources目录下建mappers文件夹存放生成的xxx-mapper.xml,并在java目录下建立dao和entity目录分别存放生成的Mapper接口和实体类
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>
<context id="tables" targetRuntime="MyBatis3">
<!-- 数据库连接配置 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/ssm?characterEncoding=UTF8"
userId="root"
password="root">
</jdbcConnection>
<!-- java类型调整,此处并不强制使用BigDecimal -->
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- 模型类生成配置,targetPackage为生成后文件的目录 -->
<javaModelGenerator targetPackage="com.chinasofti.ssm.dal.entity" targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- XXXMapper.xml生成配置,targetPackage为生成后文件的目录 -->
<sqlMapGenerator targetPackage="resources.mappers" targetProject="src/main/">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- Mapper接口即XXXMapper.java生成配置,targetPackage为生成后文件的目录 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.chinasofti.ssm.dal.dao" targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!-- 表的配置 -->
<table schema="ssm" tableName="player" domainObjectName="Player" >
<!-- useActualColumnNames设为true则会直接将数据库的表名作为模型类的表名,所以设为false,默认转成驼峰式 -->
<property name="useActualColumnNames" value="false"/>
<generatedKey column="id" sqlStatement="mysql" identity="true" />
<columnOverride column="id" property="id"/>
</table>
</context>
</generatorConfiguration>
4.在项目根目录下执行mvn mybatis-generator:generate
则会自动生成到指定目录下。eclipse可以run as > maven build 在goal里输入mybatis-generator:generate
!注意,配置文件中指定的targetPackage不能有大写,必须全小写,否则出错
关于生成的方法,如果设置了主键,则会生成一系列XXByPrimaryKey的方法,如果没有检查是否有主键或者主键类型是否为自增int。
生成的XXByExample可能会让你觉得很奇怪。其实Example的API很简单。主要是createCreteria方法,该方法创建的对象提供了各种条件拼装的方法,使用这些方法就能够创建查询条件了。
一个列子
PaymentExample example = new PaymentExample();
example.setOrderByClause("amount desc");
example.setDistinct(true);
example.createCriteria().andAmountGreaterThan(new BigDecimal("100")).andPayTimeGreaterThan(DateUtil.parse("2018-12-12 00:00:00"));
paymentMapper.selectByExample(example);
生成的sql为
select distinct id, user, amount, status, pay_time from payment WHERE ( amount > ? and pay_time > ? ) order by amount desc
自定义sql最佳实践
使用MBG会有一个问题,就是重复生成代码,如果不配置override(见pom.xml中的插件配置),则会生成一堆重复文件,如果配置了,会将UserMapper里的内容覆盖掉。个人认为的最佳实践如下。
编写一个自定义Mapper接口继承自原Mapper,将自定义的方法写在该对象中,并自己编写一个对应的Mapper.xml
Mapper接口如下:
package com.ci.framework.door.dal.dao;
import java.util.Map;
import com.ci.framework.door.dal.entity.User;
public interface UserMapperCustom extends UserMapper {
User findById(int userId);
User selectUsernameAndPassword(Map<String, Object> map);
}
对应的mapper.xml如下:
<?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="com.ci.framework.door.dal.dao.UserMapperCustom" >
<select id="findById" parameterType="int" resultType="com.chinasofti.framework.door.dal.entity.User">
select * from users where user_id=#{userId}
</select>
<select id="selectUsernameAndPassword" parameterType="map" resultType="com.chinasofti.framework.door.dal.entity.User">
select * from users where username=#{username} and passwd=#{passwd}
</select>
</mapper>
这样重复生成覆盖内容将不会影响到原先的内容。