文章目录
MyBatis逆向工程简介
MyBatis Generator简称MBG,是一个专门为MyBatis框架使用者定制的代码生成器,可以快速的根据表生成对应的映射文件,接口,以及bean类。支持基本的增删改查,以及QBC风格的条件查询。但是表连接、存储过程等这些复杂sql的定义需要我们自己编写。
MBG的使用,根据表生成对应的映射文件,Mapper接口,以及bean类
创建Maven工程
回顾:MyBatis框架快速入门(一),搭建MyBatis开发环境
1.引入依赖与插件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.Test</groupId>
<artifactId>Test_MyBatisGenerator</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<!-- 依赖 MyBatis 核心包 -->
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<!--Mybatis依赖的日志包-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- MySQL 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.8</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<!-- 控制 Maven 在构建过程中相关配置 -->
<build>
<!-- 构建过程中用到的插件 -->
<plugins>
<!-- 具体插件,逆向工程的操作是以构建过程中插件形式出现的 -->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.0</version>
<!-- 插件的依赖 -->
<dependencies>
<!-- 逆向工程的核心依赖 -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.2</version>
</dependency>
<!-- MySQL 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.8</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
2.编写MBG的配置文件 generatorConfig.xml
用于配置映射文件,接口,以及bean类的生成策略
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!--MBG的配置文件-->
<!-- targetRuntime=“MyBatis3“ 生成带条件的增删改查(动态sql)
targetRuntime=“MyBatis3Simple“ 生成基本的增删改查
-->
<context id="DBTables" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是;false:否 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection
driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatis"
userId="root"
password="1998">
</jdbcConnection>
<!-- 默认 false,把 JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true 时把
JDBC DECIMAL和 NUMERIC 类型解析为 java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!--javaBean的生成策略
targetProject:生成实体类的路径
targetPackage:生成的实体类的所在包名
-->
<javaModelGenerator targetProject=".\src\main\java"
targetPackage="com.test.entity">
<!-- enableSubPackages:是否让 schema 作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!--映射文件的生成策略
targetProject:XxxMapper.xml 映射文件生成的路径 -->
<sqlMapGenerator targetProject=".\src\main\java"
targetPackage="com.test.mapper">
<!-- enableSubPackages:是否让 schema 作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- dao接口(映射器)的生成策略
targetPackage:Mapper 接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetProject=".\src\main\java"
targetPackage="com.test.mapper">
<!-- enableSubPackages:是否让 schema 作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 数据表与javaBean的映射
数据库表名字和实体类对应的映射指定 -->
<table tableName="user" domainObjectName="User" />
<table tableName="role" domainObjectName="Role" />
</context>
</generatorConfiguration>
3.执行逆向生成操作
进入maven工程控制台
执行逆向生成操作后,生成的对应映射文件,接口,以及bean类。
(生成的实体类的所在包,没有会自动创建)
4.整理所生成的资源,使其更符合开发规范
回顾:MyBatis框架快速入门(一),搭建MyBatis开发环境
回顾:MyBatis框架快速入门(二),使用映射器接口代理对象的方式实现单表的增删改查与配置文件参数的深入学习
整理资源
扩展:SSM整合问题与单独使用Mybatis框架映射配置文件的规范问题
基于聚合工程SSM整合开发,如需使用Mybatis逆向工程,一般可以另外创建一个专门用来逆向生成资源的maven工程(这个工程不是父模块的子模块),通过以上配置生成资源后,再整理到聚合工程中的相应子模块。
发现问题:
-
在SSM整合中,映射配置文件可无需遵守这个规范,也能实现CRUD。
如:映射配置文件名和映射器接口名相同 但不在同一目录下(目录结构)。
-
MBG的使用只涉及Mybatis框架,不考虑SSM整合
核心配置文件,采用自动注册映射器接口的方式
映射配置文件如不遵守该规范
即映射配置文件名和映射器接口名相同 但不在同一目录下(目录结构)。
执行CRUD操作,会报错:
测试增删改查
role表
user表
测试类 MBGTest
public class MBGTest{
private InputStream inputStream;
private SqlSession sqlSession;
private UserMapper userMapper;
private RoleMapper roleMapper;
@Before//在使用@Test注解标注的public void方法执行之前执行
public void init() throws IOException {
//读取核心配置文件(SqlMapConfig.xml),得到输入流
inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//创建构造者对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//构造者根据输入流构造一个工厂,得到SqlSessionFactory工厂对象【构造者模式】
SqlSessionFactory factory = builder.build(inputStream);
//工厂对象生产一个SqlSession对象【工厂模式】
sqlSession = factory.openSession();
//使用SqlSession对象获取映射器UserMapper接口的代理对象由代理对象完成功能【代理模式】
userMapper = sqlSession.getMapper(UserMapper.class);
roleMapper = sqlSession.getMapper(RoleMapper.class);
}
@After//在使用@Test注解标注的public void方法执行之后执行
public void destory() throws IOException {
sqlSession.close();
inputStream.close();
}
}
简单的增删改查操作
selectByPrimaryKey
根据主键id查询
/**查询操作
* 根据主键id查询
*/
@Test
public void SimpleCRUDTest1() {
User user1 = userMapper.selectByPrimaryKey(30);
//select id, username, birthday, sex, address from user where id = ?
System.out.println(user1);
}
insert
与 insertSelective
添加操作
/**
* 添加操作
* insert(Role record):会插入对象(Role)的所有数据。
* 如添加对象(Role)有属性为空,则插入的数据也为空。
* 如果数据库数据表中该属性对应字段设置了默认值,这个默认值就无效了(已经被空值覆盖了)。
*
* insertSelective(Role record):只会插入含有数据的属性。
* 即数据库数据表中字段设置了默认值,不会存在被空值覆盖的情况。
*
*/
@Test
public void SimpleCRUDTest3() {
Role role = new Role();
role.setId(100);
//没有给roleName属性赋值,使用insert插入,如果数据库中该对应字段有默认值,将覆盖为空
role.setRoleDesc("我要一个打五个 insert");
roleMapper.insert(role);
//insert into role (ID, ROLE_NAME, ROLE_DESC ) values (?, ?, ? )
Role role2 = new Role();
role2.setId(200);
//没有给roleName属性赋值,使用insertSelective插入,不会插入该数据,如果数据库中该对应字段有默认值,则还是该默认值。
role2.setRoleDesc("我要一个打五个 insertSelective");
roleMapper.insertSelective(role2);
//insert into role ( ID, ROLE_DESC ) values ( ?, ? )
sqlSession.commit();
}
ROLE_NAME字段的默认值是 全能选手
…
其他操作见名知意
较复杂的条件查询/动态Sql (QBC风格的带条件查询)
selectByExample
拼装查询条件,模糊查询
/**
* 拼装查询条件,模糊查询 查询用户的地址带有 山 的用户信息
*/
@Test
public void dynamicCRUDTest1() {
//封装用户查询条件的example
UserExample userExample = new UserExample();
//创建一个Criteria,用户拼装查询条件
UserExample.Criteria criteria = userExample.createCriteria();
criteria.andAddressLike("%山%");
List<User> users = userMapper.selectByExample(userExample);
//select id, username, birthday, sex, address from user WHERE ( address like ? )
for (User user : users) {
System.out.println(user);
}
}
拼装查询条件 and
/**
* 拼装查询条件 and 查询用户的地址带有 山,和性别是男 的用户信息
*/
@Test
public void dynamicCRUDTest2() {
UserExample userExample = new UserExample();
UserExample.Criteria criteria = userExample.createCriteria();
criteria.andAddressLike("%山%");
criteria.andSexEqualTo("男");
List<User> users = userMapper.selectByExample(userExample);
//select id, username, birthday, sex, address from user WHERE ( address like ? and sex = ? )
for (User user : users) {
System.out.println(user);
}
}
拼装查询条件 and and
/**
* 拼装查询条件 and and 查询用户的地址带有 山, 和性别是男, id在33-35之间 的用户信息
*
* 注: criteria.andIdBetween(33,35):33-35之间 包含33,,35
*/
@Test
public void dynamicCRUDTest3() {
UserExample userExample = new UserExample();
UserExample.Criteria criteria = userExample.createCriteria();
criteria.andAddressLike("%山%");
criteria.andSexEqualTo("男");
criteria.andIdBetween(33,35);
List<User> users = userMapper.selectByExample(userExample);
//select id, username, birthday, sex, address from user WHERE ( address like ? and sex = ? and id between ? and ? )
for (User user : users) {
System.out.println(user);
}
}
拼装查询条件 and or
/**
* 拼装查询条件 and or 查询用户的地址带有 山,或者性别是女 的用户信息
*/
@Test
public void dynamicCRUDTest4() {
//封装用户查询条件的example
UserExample userExample = new UserExample();
//创建一个Criteria,用户拼装查询条件
UserExample.Criteria criteria = userExample.createCriteria();
criteria.andAddressLike("%山%");
//创建一个新的Criteria,拼装or条件
UserExample.Criteria criteria1 = userExample.createCriteria();
criteria1.andSexEqualTo("女");
//用户查询条件example拼装or条件 (如还有or条件,则再创建一个新的Criteria,拼装or条件)
userExample.or(criteria1);
List<User> users = userMapper.selectByExample(userExample);
//select id, username, birthday, sex, address from user WHERE ( address like ? ) or( sex = ? )
for (User user : users) {
System.out.println(user);
}
}