SpringBoot 框架整合 (二) : MyBatis + Mapper + mybatis-generator
Mapper介紹
前言
使用MyBatis在我們通過xml集中配置SQL,並通過建立介面Mapper檔案來完成持久化DAO層(mybatis內部使用的是動態代理,所以我們不需要自己編寫實現類 ),不需要實現dao的實現層,系統會自動根據方法名在對映檔案中找對應的sql。。
然而在實際開發中,單表操作非常多,如果你也想像JPA、JDBC那樣做一個所謂的BaseDao。那麼可以實現一個通用Mapper來達到目的。現在有現成的通用Mapper外掛,我們無需重新創造輪子(程式碼是開源的,你也可以自己在其基礎上修改)。
使用通用Mapper外掛
外掛程式碼在tk.mybatis.mapper.generator包下面,一共有如下兩個類:
MapperCommentGenerator:該類用於生成資料庫備註欄位的註釋,以及實體類欄位的註解。
MapperPlugin:外掛的實現類,該類預設使用上面這個註釋生成器,外掛遮蔽了一般的CRUD方法(保留了Example),外掛可以生成實體的@Table註解。
在Maven中配置(pom.xml):
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId >
<version>1.1.1</version>
</dependency>
Mapper介面
先定義一個公用的介面類MyMapper.java:
package com.ailianshuo.mybatisxml.utility;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;
/**
*
* @author ailianshuo
* @date 2017年9月2日
* @param <T>
*/
public interface MyMapper<T> extends Mapper<T>,MySqlMapper<T> {
}
專案裡所有實體介面都實現公共介面。例如:
public interface UserMapper extends MyMapper<User> {
}
一旦繼承了Mapper,繼承的Mapper就擁有了以下通用的方法:
//根據實體類不為null的欄位進行查詢,條件全部使用=號and條件
List select(T record);//根據實體類不為null的欄位查詢總數,條件全部使用=號and條件
int selectCount(T record);//根據主鍵進行查詢,必須保證結果唯一
//單個欄位做主鍵時,可以直接寫主鍵的值
//聯合主鍵時,key可以是實體類,也可以是Map
T selectByPrimaryKey(Object key);//插入一條資料
//支援Oracle序列,UUID,類似Mysql的INDENTITY自動增長(自動回寫)
//優先使用傳入的引數值,引數值空時,才會使用序列、UUID,自動增長
int insert(T record);//插入一條資料,只插入不為null的欄位,不會影響有預設值的欄位
//支援Oracle序列,UUID,類似Mysql的INDENTITY自動增長(自動> 回寫)
//優先使用傳入的引數值,引數值空時,才會使用序列、UUID,自動增長
int insertSelective(T record);//根據實體類中欄位不為null的條件進行刪除,條件全部使用=號and條件
int delete(T key);//通過主鍵進行刪除,這裡最多隻會刪除一條資料
//單個欄位做主鍵時,可以直接寫主鍵的值
//聯合主鍵時,key可以是實體類,也可以是Map
int deleteByPrimaryKey(Object key);//根據主鍵進行更新,這裡最多隻會更新一條資料
//引數為實體類
int updateByPrimaryKey(T record);//根據主鍵進行更新
//只會更新不是null的資料
int updateByPrimaryKeySelective(T record);
介面定義有以下特點:
Mapper 介面方法名和 **Mapper.xml 中定義的每個 sql 的 id 同名。
Mapper 介面方法的輸入引數型別和 **Mapper.xml 中定義的 sql 的parameterType 型別相同。
Mapper 介面的返回型別和 **Mapper.xml 中定義的 sql 的 resultType 型別相同
配置application.properties
mapper.plugin = tk.mybatis.mapper.generator.MapperPlugin
mapper.Mapper = tk.mybatis.mapper.common.Mapper
mybatis.type-aliases-package=com.study.model
#分模組放
mybatis.mapper-locations=classpath:mapper/*/*.xml
mapper.mappers=com.ailianshuo.mybatisxml.utility.MyMapper
mapper.not-empty=false
mapper.identity=MYSQL
整合Mybatis-
配置
pom.xml
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<!--這裡使用mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
application.properties
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=1111
實體類
泛型(實體類)的型別必須符合要求
實體類按照如下規則和資料庫表進行轉換,註解全部是JPA中的註解:
- 表名預設使用類名,駝峰轉下劃線,如UserInfo預設對應的表名為user_info.
- 表名可以使用@Table(name = “tableName”)進行指定,對不符合第一條預設規則的可以通過這種方式指定表名.
- 欄位預設和@Column一樣,都會作為表字段,表字段預設為Java物件的Field名字駝峰轉下劃線形式.
- 可以使用@Column(name = “fieldName”)指定不符合第3條規則的欄位名
- 使用@Transient註解可以忽略欄位,新增該註解的欄位不會作為表字段使用.
- 建議一定是有一個@Id註解作為主鍵的欄位,可以有多個@Id註解的欄位作為聯合主鍵.
- 預設情況下,實體類中如果不存在包含@Id註解的欄位,所有的欄位都會作為主鍵欄位進行使用(這種效率極低).
- 實體類可以繼承使用,可以參考測試程式碼中的com.github.abel533.model.UserLogin2類.
- 由於基本型別,如int作為實體類欄位時會有預設值0,而且無法消除,所以實體類中建議不要使用基本型別.
這三種方式不能同時使用,同時存在時按照 序列>UUID>主鍵自增的優先順序進行選擇.下面是具體配置方法:
- 使用序列可以新增如下的註解:
//可以用於數字型別,字串型別(需資料庫支援自動轉型)的欄位
@SequenceGenerator(name="Any",sequenceName="seq_userid")
@Id
private Integer id;
- 使用UUID時:
//可以用於任意字串型別長度超過32位的欄位
@GeneratedValue(generator = "UUID")
private String countryname;
- 使用主鍵自增:
//不限於@Id註解的欄位,但是一個實體類中只能存在一個(繼承關係中也只能存在一個)
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
mybatis-generator自動生成程式碼
在pom.xml中新增plugin
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<configurationFile>${basedir}/src/main/resources/generatorConfig.xml</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.43</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>3.4.0</version>
</dependency>
</dependencies>
</plugin>
其中generatorConfig.xml的位置,大家根據實際情況自行調整
generatorConfig.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>
<context id="baseset" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<!-- 根據Mapper生成實體類,xml檔案 -->
<plugin type="tk.mybatis.mapper.generator.MapperPlugin">
<property name="mappers" value="com.ailianshuo.project.utility.MyMapper"/>
</plugin>
<!-- 連線字串 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/test"
userId="root"
password="1111">
</jdbcConnection>
<!-- 指定生成“entity實體類、mybatis對映xml檔案、mapper介面”的具體位置 -->
<javaModelGenerator targetPackage="com.ailianshuo.mybatisxml.entity.baseset" targetProject="src/main/java" >
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<sqlMapGenerator targetPackage="mapper.baseset" targetProject="src/main/resources" >
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<javaClientGenerator targetPackage="com.ailianshuo.mybatisxml.mapper.baseset" targetProject="src/main/java" type="XMLMAPPER" >
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 具體要生成的表,如果有多個表,複製這一段,改下表名即可 -->
<table tableName="baseset_user" domainObjectName="BasesetUser" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
<generatedKey column="id" sqlStatement="Mysql" identity="true"/>
</table>
</context>
</generatorConfiguration>
執行mybatis-generator
eclipse
如果是在eclipse 中,選擇pom.xml檔案,擊右鍵先擇Run AS——>Maven Build… ——>在Goals框中輸入:mybatis-generator:generate
命令列
如果在命令列輸入Maven命令即可,注意:一定是當前專案目錄(在pom.xml這一級目錄)下執行該命令:
mvn mybatis-generator:generate
即可(前提是配置了mvn)
執行結果:
測試
新增mapperscan
在SpringbootMybatisxmlApplication.java (Application.java):
package com.ailianshuo.mybatisxml;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.ailianshuo.mybatisxml.mapper")
public class SpringbootMybatisxmlApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootMybatisxmlApplication.class, args);
}
}
或者在Mapper介面中上面加@Mapper
這樣才可以使用註解的方式呼叫
建立測試類
BasesetUserTest.java
package com.ailianshuo.mybatisxml.test;
import java.util.List;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.ailianshuo.mybatisxml.SpringbootMybatisxmlApplication;
import com.ailianshuo.mybatisxml.entity.baseset.BasesetUser;
import com.ailianshuo.mybatisxml.mapper.baseset.BasesetUserMapper;
@RunWith(SpringJUnit4ClassRunner. class)
@SpringBootTest(classes=SpringbootMybatisxmlApplication. class)
public class BasesetUserTest {
@Autowired
protected BasesetUserMapper userMapper;
@org.junit.Test
public void insert() throws Exception {
BasesetUser user = new BasesetUser();
user.setUsername("ailianshuo");
user.setPassword("ailianshuo");
user.setEnable(1);
//insert
userMapper.insert(user);
int id = user.getId();//獲得自動生成的主鍵
//selectAll
List<BasesetUser> users = userMapper.selectAll();
for (BasesetUser _user : users) {
System.out.println(_user.getId()+":"+_user.getUsername());
}
/*
//update
User user2=new User();
user2.setName("wangxiaoxiao");
user2.setId(id);
userMapper.update(user2);
//delete
userMapper.delete(id);
*/
}
}
執行:右擊–>Run–>Juit Test:
例項專案下載
請到這裡下載