0%

(七)MyBatis学习笔记-逆向工程

1. 简介

MyBatis Generator:简称MBG,是一个专门为MyBatis框架使用者定制的代码生成器,可以快速的根据表生成对应的映射文件,接口,以及bean类。支持基本的增删改查,以及QBC风格的条件查询。 但是表连接、存储过程等这些复杂sql的定义需要我们手工编写。

可以到官方工程地址中下载需要的Jar包。

在这里插入图片描述

2. 环境搭建

2.1 mbg.xml 编写

在最常见的用例中,MyBatis Generator(MBG)由XML配置文件驱动,我们这里使用XML的方式。本地的项目的结构如下:
在这里插入图片描述
根据本地工程项目结构,编写配置如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?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>

<!-- 引入外部的properties文件 -->
<properties resource="dbconfig.properties"/>

<!-- context标签用来指定生的项目的环境
targetRuntime="MyBatis3Simple":生成简单版的CRUD
MyBatis3:豪华版
-->
<context id="DB2Tables" targetRuntime="MyBatis3Simple">
<!-- jdbcConnection:指定如何连接到目标数据库 -->
<jdbcConnection driverClass="${jdbc.driver}"
connectionURL="${jdbc.url}"
userId="${jdbc.username}"
password="${jdbc.password}">
</jdbcConnection>

<!-- <javaTypeResolver>元素用于定义Java类型解析器的属性。 -->
<javaTypeResolver >
<!-- 此属性用于指定MyBatis Generator是否应强制
对DECIMAL和NUMERIC字段使用java.math.BigDecimal -->
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>

<!-- javaModelGenerator:指定javaBean的生成策略
targetPackage指定目标包名
targetProject指定目标工程
-->
<javaModelGenerator targetPackage="com.atguigu.mybatis.bean"
targetProject=".\src">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>

<!-- sqlMapGenerator:sql映射生成策略: -->
<sqlMapGenerator targetPackage="com.atguigu.mybatis.mapper"
targetProject=".\config">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>

<!-- javaClientGenerator:指定mapper接口所在的位置 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.atguigu.mybatis.mapper"
targetProject=".\src">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>

<!-- 指定要逆向分析哪些表:根据表要创建javaBean -->
<table tableName="tbl_dept" domainObjectName="Department"></table>
<table tableName="tbl_employee" domainObjectName="Employee"></table>
</context>
</generatorConfiguration>

注意:详细地XML标签和内容等使用和了解,详见 官方文档地址
在这里插入图片描述

2.2 Jar包引入

在这里插入图片描述

3. 测试

测试代码可以引用官方文档地址 的快速运行代码。如下所示:
在这里插入图片描述
本地的测试代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
@Test
public void testMbg() throws Exception {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
//使用mbg.xml配置文件生成File对象
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);
}

运行结果:
在这里插入图片描述
对于生成的POJO类Employee类,其类的内容主要如下:
在这里插入图片描述
而对于映射器接口EmployeeMapper的主要内容为:
在这里插入图片描述
从上面可以看出,这些都是一些简单的数据库CRUD操作,如根据主键删除,查询所有等。其他的这里不再赘述。

运行测试一下根据员工id查询的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
return sqlSessionFactory;
}

@Test
public void testMyBatis3Simple() throws IOException {
SqlSessionFactory sessionFactory = getSqlSessionFactory();
SqlSession session = sessionFactory.openSession();
try {
EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
Employee emp = mapper.selectByPrimaryKey(1);
System.out.println(emp.getLastName());

} finally {
session.close();
}

}

4. 复杂版MBG

上面我们在配置mbg.xml时,context标签的targetRuntime属性的内容之指定为MyBatis3Simple,也就是MGB会生成简单的CRUD代码。现在我们在其内容设置为MyBatis3 。即:
在这里插入图片描述
重新运行测试 (记得把之前项目的映射器等文件删除掉,避免发生错误) ,结果如下所示:
在这里插入图片描述
下面演示部分功能的用法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
@Test
public void testMyBatis3() throws IOException {
SqlSessionFactory sessionFactory = getSqlSessionFactory();
SqlSession session = sessionFactory.openSession();
try {
EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
//查询所有
/*List<Employee> emps = mapper.selectByExample(null);
for (Employee employee : emps) {
System.out.println(employee.getLastName());
}*/
//xxxExample就是封装查询条件的

//查询员工名字中有e字母的,和员工性别是1的,或者email带有字母e的
//封装员工查询条件的example
EmployeeExample example = new EmployeeExample();
//创建一个Criteria,这个Criteria就是拼装查询条件
//select id, last_name, email, gender, d_id from tbl_employee
//WHERE ( last_name like ? and gender = ? ) or email like "%e%"
//封装and部分
Criteria criteria = example.createCriteria();
criteria.andLastNameLike("%e%");
criteria.andGenderEqualTo("1");
//封装and部分
Criteria criteria2 = example.createCriteria();
criteria2.andEmailLike("%e%");
//将上面两部分用or封装
example.or(criteria2);

List<Employee> list = mapper.selectByExample(example);
for (Employee employee : list) {
System.out.println(employee.getLastName());
}

} finally {
session.close();
}

}
------ 本文结束------