一、MyBatis-逆向工程
- MyBatis Generator:
- 简称MBG,是一个专门为MyBatis框架使用者定制的代码生成器,可以快速的根据表生成对应的映射文件,接口,以及bean类。支持基本的增删改查,以及QBC风格的条件查询。但是表连接、存储过程等这些复杂sql的定义需要我们手工编写。
- 官方文档地址
http://www.mybatis.org/generator/ - 官方工程地址
https://github.com/mybatis/generator/releases
二、MBG使用
三、MBG配置文件
<?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="DB2Tables" targetRuntime="MyBatis3">
<!-- 数据库连接信息配置 -->
<jdbcConnection
driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql:///mybatis" userId="root"
password="123456">
</jdbcConnection>
<!--
javaBean的生成策略 :
1.targetPackage:目标包名
2.targetProject:目标工程生成路径
-->
<javaModelGenerator
targetPackage="cn.edu.pzhu.cg.mybatis.bean"
targetProject=".\src">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!--
映射文件的生成策略
1.targetPackage:目标包名
2.targetProject:目标工程生成路径
.\conf:在当前工程下生成名为 conf 的源码包
-->
<sqlMapGenerator
targetPackage="mybatis.mapper"
targetProject=".\conf">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!--dao接口java文件的生成策略 -->
<javaClientGenerator
type="XMLMAPPER"
targetPackage="cn.edu.pzhu.cg.dao" targetProject=".\src">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!--数据表与javaBean的映射 -->
<table tableName="employee" domainObjectName="Employee"></table>
<table tableName="department" domainObjectName="Department"></table>
</context>
</generatorConfiguration>
四、生成器代码
从官网上 copy 下生成器代码。mbg.xml 文件需要放在项目的根目录下。
@Test
public void testCreateMBG() 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);
}
执行完以上代码后,就会生成对应的 bean,mapper,以及 mapper 接口。其中 bean 包中还生成了额外的 xxxExample 类,这是为后面封装条件提供的。
五、测试方法
1.插入:
@Test
public void testInsert() {
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
Employee employee = new Employee();
employee.setLastName("BB");
employee.setAge(21);
employee.setEmail("bb@163.com");
employee.setDeptId(1);
mapper.insert(employee);
sqlSession.commit();
}
2.删除:
将条件封装在对应的 xxxExamlpe 中,通过 Criteria 添加条件。
@Test
public void testDelete() {
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
EmployeeExample example = new EmployeeExample();
Criteria criteria = example.createCriteria();
criteria.andAgeLessThan(18);
mapper.deleteByExample(example);
sqlSession.commit();
}
3.查询:
(1).查询所有:
@Test
public void testQuery() {
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
//xxxxExample 就是封装查询条件的,传入 null 表示查询所有
List<Employee> emps = mapper.selectByExample(null);
for (Employee employee : emps) {
System.out.println(employee);
}
}
(2).按条件查询:
QBC 风格的带条件查询。
@Test
public void testQuaeryExample() {
//条件查询:查询出 lastName 中带有 'C' 和 age = 22 的 employee
//1.获取对应的 mapper
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
//2.获取查询条件的 example 对象
EmployeeExample example = new EmployeeExample();
//3.拼凑查询条件
Criteria criteria = example.createCriteria();
criteria.andLastNameLike("%C%");
criteria.andAgeEqualTo(22);
//4.获取结果集
List<Employee> emps = mapper.selectByExample(example);
for (Employee employee : emps) {
System.out.println(employee);
}
}
4.修改:
(1).按主键修改:
@Test
public void testUpdateByPrimaryKeySelective() {
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
Employee employee = new Employee();
employee.setId(4);//主键
employee.setLastName("DD");
employee.setDeptId(1);
/*
* updateByPrimaryKeySelective(employee):
* 按照主键修改 employee 中不为 null 的字段
*
* sql 语句:update employee SET last_name = ?, dept_id = ? where id = ?
*/
mapper.updateByPrimaryKeySelective(employee);
sqlSession.commit();
}
(2).按条件修改:
@Test
public void testUpdateByExample() {
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
//条件
EmployeeExample example = new EmployeeExample();
Criteria criteria = example.createCriteria();
criteria.andDeptIdEqualTo(4);
//要修改的内容
Employee employee = new Employee();
employee.setAge(26);
employee.setEmail("@qq.com");
/*
* updateByExampleSelective(employee, example):
* 1. 按照条件 example 更新 employee 中不为 null 的字段
* 2. sql 语句:update employee SET age = ?, email = ? WHERE ( dept_id = ? )
*/
mapper.updateByExampleSelective(employee, example);
sqlSession.commit();
}
注意:updateByExampleSelective 方法表示修改对应 bean 属性不为 null 的内容,而 updateByExample 方法表示修改所有字段内容,如果当前的 bean 部分属性值为 null,那么也会将数据库表对应的字段内容修改为 NULL.
5.统计:
@Test
public void testCount() {
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
EmployeeExample example = new EmployeeExample();
Criteria criteria = example.createCriteria();
criteria.andAgeBetween(18, 25);
criteria.andDeptIdGreaterThan(2);
Criteria criteria2 = example.createCriteria();
criteria2.andLastNameLike("%C%");
/*
* example.or(criteria2):
* 1.使用example.or() 可以将多个条件用 or 连起来
* 2.sql 语句:select count(*) from employee WHERE ( age between ? and ? and dept_id > ? ) or( last_name like ? )
*/
example.or(criteria2);
int count = mapper.countByExample(example);
System.out.println("count:" + count);
}
完整测试代码
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;
import cn.edu.pzhu.cg.dao.EmployeeMapper;
import cn.edu.pzhu.cg.mybatis.bean.Employee;
import cn.edu.pzhu.cg.mybatis.bean.EmployeeExample;
import cn.edu.pzhu.cg.mybatis.bean.EmployeeExample.Criteria;
public class MyBatisTest {
private SqlSession sqlSession;
@Before
public void init() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
sqlSession = sqlSessionFactory.openSession();
}
@After
public void destory() {
if(sqlSession != null) {
sqlSession.close();
}
}
@Test
public void testCount() {
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
EmployeeExample example = new EmployeeExample();
Criteria criteria = example.createCriteria();
criteria.andAgeBetween(18, 25);
criteria.andDeptIdGreaterThan(2);
Criteria criteria2 = example.createCriteria();
criteria2.andLastNameLike("%C%");
/*
* example.or(criteria2):
* 1.使用example.or() 可以将多个条件用 or 连起来
* 2.sql 语句:select count(*) from employee WHERE ( age between ? and ? and dept_id > ? ) or( last_name like ? )
*/
example.or(criteria2);
int count = mapper.countByExample(example);
System.out.println("count:" + count);
}
@Test
public void testUpdateByPrimaryKeySelective() {
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
Employee employee = new Employee();
employee.setId(4);
employee.setLastName("DD");
employee.setDeptId(1);
/*
* updateByPrimaryKeySelective(employee):
* 按照主键修改 employee 中不为 null 的字段
*
* sql 语句:update employee SET last_name = ?, dept_id = ? where id = ?
*/
mapper.updateByPrimaryKeySelective(employee);
sqlSession.commit();
}
@Test
public void testUpdateByExample() {
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
//条件
EmployeeExample example = new EmployeeExample();
Criteria criteria = example.createCriteria();
criteria.andDeptIdEqualTo(4);
//要修改的内容
Employee employee = new Employee();
employee.setAge(26);
employee.setEmail("@qq.com");
/*
* updateByExampleSelective(employee, example):
* 1. 按照条件 example 更新 employee 中不为 null 的字段
* 2. sql 语句:update employee SET age = ?, email = ? WHERE ( dept_id = ? )
*/
mapper.updateByExampleSelective(employee, example);
sqlSession.commit();
}
@Test
public void testQuaeryExample() {
//条件查询:查询出 lastName 中带有 'C' 和 age = 22 的 employee
//1.获取对应的 mapper
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
//2.获取查询条件的 example 对象
EmployeeExample example = new EmployeeExample();
//3.拼凑查询条件
Criteria criteria = example.createCriteria();
criteria.andLastNameLike("%C%");
criteria.andAgeEqualTo(22);
//4.获取结果集
List<Employee> emps = mapper.selectByExample(example);
for (Employee employee : emps) {
System.out.println(employee);
}
}
@Test
public void testQuery() {
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
//xxxxExample 就是封装查询条件的,传入 null 表示查询所有
List<Employee> emps = mapper.selectByExample(null);
for (Employee employee : emps) {
System.out.println(employee);
}
}
@Test
public void testDelete() {
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
EmployeeExample example = new EmployeeExample();
Criteria criteria = example.createCriteria();
criteria.andAgeLessThan(18);
mapper.deleteByExample(example);
sqlSession.commit();
}
@Test
public void testInsert() {
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
Employee employee = new Employee();
employee.setLastName("BB");
employee.setAge(21);
employee.setEmail("bb@163.com");
employee.setDeptId(1);
mapper.insert(employee);
sqlSession.commit();
}
@Test
public void testCreateMBG() 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);
}
}