MyBatis 逆向工程
MyBatis Generator:
- 简称MBG,是一个专门为MyBatis框架使用者定制的代码生成器,可以快速的根据表生成对应的映射文件,接口,以及bean类。支持基本的增删改查,以及QBC风格的条件查询,但是表连接、存储过程等这些复杂sql的定义需要我们手工编写。
- 官方文档地址:http://www.mybatis.org/generator/
- 官方工程地址:https://github.com/mybatis/generator/releases
1. MyBatisGenerator
1.1 使用步骤
使用步骤:
1、编写MBG的配置文件(重要几处配置)
- jdbcConnection:配置数据库连接信息。
- javaModelGenerator:配置javaBean的生成策略。
- sqlMapGenerator:配置sql映射文件生成策略。
- javaClientGenerator:配置Mapper接口的生成策略。
- tableName:表名。
- domainObjectName:对应的javaBean名。
2、运行代码生成器生成代码
3、注意:Context标签
targetRuntime=“MyBatis3“可以生成带条件的增删改查。
targetRuntime=“MyBatis3Simple“可以生成基本的增删改查。
如果再次生成,建议将之前生成的数据删除,避免xml向后追加内容出现的问题。
2. MyBatisGenerator 使用
导包
使用教程在在GitHub上可以找到,复制下来就可以直接使用了。
在项目路径下添加mbg.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>
<!--
targetRuntime="MyBatis3Simple":生成简单版的CRUD
MyBatis3:生成复杂的CRUD
-->
<context id="DB2Tables" targetRuntime="MyBatis3Simple">
<!-- jdbcConnection:指定如何连接到目标数据库 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatis?allowMultiQueries=true"
userId="root"
password="root">
</jdbcConnection>
<!-- Java类型解析器 可以参考官网文档 -->
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!--
javaModelGenerator:指定javaBean的生成策略。
targetPackage="com.ginger.mybatis.bean":目标包名。
targetProject=".\src":生成在哪个工程下,我这里指定的是当前项目的src路径下。
-->
<javaModelGenerator targetPackage="com.ginger.mybatis.bean" targetProject=".\src">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!--
sqlMapGenerator:sql映射生成策略。
targetPackage="com.ginger.mybatis.bean":目标包名。
targetProject=".\src":生成在哪个工程下,我这里指定的是当前项目的conf路径下。
-->
<sqlMapGenerator targetPackage="com.ginger.mybatis.dao" targetProject=".\conf">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!--
javaClientGenerator:指定mapper接口所在的位置
targetPackage="com.ginger.mybatis.bean":目标包名。
targetProject=".\src":生成在哪个工程下,我这里指定的是当前项目的conf路径下。
-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.ginger.mybatis.dao" targetProject=".\src">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!-- 指定要逆向分析哪些表:根据表要创建javaBean -->
<table tableName="employee" domainObjectName="Employee"></table>
<table tableName="department" domainObjectName="Department"></table>
</context>
</generatorConfiguration>
创建一个测试类,来生成代码。
public class MyBatisGeneratorTest{
@Test
public void testMyBatisGenerator() throws Exception {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
File configFile = new File("mbg.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);
}
}
生成的代码
// 测试
@Test
public void testMyBatis3Simple() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession();
try{
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
//EmployeeExample 如果是 null 就是查询所有
List<Employee> list = mapper.selectByExample(null);
for (Employee employee : list) {
System.out.println(employee);
}
}finally{
openSession.close();
}
}
测试结果
上面的配置只是生成简单的正删改查,如果想生成复杂的增删改查可以将mbg.xml中的context 标签的 targetRuntime 属性改为MyBatis3就可以生成复杂代码。
//测试 QBC风格的带条件查询
@Test
public void testMyBatis3() throws IOException{
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession();
try{
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
// xxxExample就是封装查询条件的
// 1、查询所有
// List<Employee> emps = mapper.selectByExample(null);
// 2、查询员工名字中有e字母的,和员工性别是1的
// 封装员工查询条件的example
EmployeeExample example = new EmployeeExample();
// 创建一个Criteria,这个Criteria就是拼装查询条件
// select id, last_name, email, gender, d_id from employee
// WHERE ( last_name like ? and gender = ? ) or email like "%e%"
EmployeeExample.Criteria criteria = example.createCriteria();
criteria.andLastNameLike("%小%");
criteria.andGenderEqualTo("1");
EmployeeExample.Criteria criteria2 = example.createCriteria();
criteria2.andEmailLike("%x%");
example.or(criteria2);
List<Employee> list = mapper.selectByExample(example);
for (Employee employee : list) {
System.out.println(employee);
}
}finally{
openSession.close();
}
}
测试结果