文章目錄
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);
}
}