TKMybatis的介紹和使用詳解
一、什么是 TKMybatis
TKMybatis 是基于 Mybatis 框架開發(fā)的一個(gè)工具,內(nèi)部實(shí)現(xiàn)了對(duì)單表的基本數(shù)據(jù)操作,只需要簡(jiǎn)單繼承 TKMybatis 提供的接口,就能夠?qū)崿F(xiàn)無(wú)需編寫任何 sql 即能完成單表操作。
二、TKMybatis 使用
2.1 Springboot 項(xiàng)目中加入依賴
<!--通用mapper起步依賴-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.4</version>
</dependency>
在 POJO 類中加入依賴
<!--每個(gè)工程都有Pojo,都需要用到該包對(duì)應(yīng)的注解-->
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0</version>
<scope>compile</scope>
</dependency>
在啟動(dòng)類中配置 @MapperScan 掃描
@SpringBootApplication
@MapperScan(basePackages = {"com.tom.order.mapper"})
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
2.2?使用講解
2.2.1 實(shí)體類中使用
在實(shí)體類中,常用的注解和意義為:
@Table:描述數(shù)據(jù)庫(kù)表信息,主要屬性有name(表名)、schema、catalog、uniqueConstraints等。
@Id:指定表主鍵字段,無(wú)屬性值。
@Column:描述數(shù)據(jù)庫(kù)字段信息,主要屬性有name(字段名)、columnDefinition、insertable、length、nullable(是否可為空)、precision、scale、table、unique、updatable等。
@ColumnType:描述數(shù)據(jù)庫(kù)字段類型,可對(duì)一些特殊類型作配置,進(jìn)行特殊處理,主要屬性有jdbcType、column、typeHandler等。
其他注解如:@Transient、@ColumnResult、@JoinColumn、@OrderBy、@Embeddable等暫不描述
2.2.2 dao中使用
單表操作,只需要繼承 tk.mybatis 下的 Mapper 接口即可使用
import tk.mybatis.mapper.common.Mapper;
@Repository
public interface BrandMapper extends Mapper<Brand> {
}
查看具體使用:內(nèi)部都已經(jīng)封裝了基本的單表操作


?2.2.3 Service 層中使用
| 操作 | 類型 | 介紹 |
| 增加 | Mapper.insert(record); | 保存一個(gè)實(shí)體,null的屬性也會(huì)保存,不會(huì)使用數(shù)據(jù)庫(kù)默認(rèn)值 |
| Mapper.insertSelective(record); | 保存一個(gè)實(shí)體,忽略空值,即沒(méi)提交的值會(huì)使用使用數(shù)據(jù)庫(kù)默認(rèn)值 | |
| 刪除 | Mapper.delete(record); | 根據(jù)實(shí)體屬性作為條件進(jìn)行刪除,查詢條件使用等號(hào) |
| Mapper.deleteByExample(example) | 根據(jù)Example條件刪除數(shù)據(jù) | |
| Mapper.deleteByPrimaryKey(key) | 根據(jù)主鍵字段進(jìn)行刪除,方法參數(shù)必須包含完整的主鍵屬性 | |
| 修改 | Mapper.updateByExample(record,example) | 根據(jù)Example條件更新實(shí)體`record`包含的全部屬性,null值會(huì)被更新 |
| Mapper.updateByExampleSelective(record, example) | 根據(jù)Example條件更新實(shí)體`record`包含的不是null的屬性值 | |
| Mapper.updateByPrimaryKey(record) | 根據(jù)主鍵更新實(shí)體全部字段,null值會(huì)被更新 | |
| Mapper.updateByPrimaryKeySelective(record) | 根據(jù)主鍵更新屬性不為null的值 | |
| 查詢 | Mapper.select(record) | 根據(jù)實(shí)體中的屬性值進(jìn)行查詢,查詢條件使用等號(hào) |
| Mapper.selectAll() | 查詢?nèi)拷Y(jié)果 | |
| Mapper.selectByExample(example) | 根據(jù)Example條件進(jìn)行查詢 | |
| Mapper.selectByPrimaryKey(key) | 根據(jù)主鍵字段進(jìn)行查詢,方法參數(shù)必須包含完整的主鍵屬性,查詢條件使用等號(hào) | |
| Mapper.selectCount(record) | 根據(jù)實(shí)體中的屬性查詢總數(shù),查詢條件使用等號(hào) | |
| Mapper.selectCountByExample(example) | 根據(jù)Example條件進(jìn)行查詢總數(shù) | |
| Mapper.selectOne(record) |
根據(jù)實(shí)體中的屬性進(jìn)行查詢,只能有一個(gè)返回值,有多個(gè)結(jié)果是拋出異常,查詢條件使用等號(hào)。 但是如果存在某個(gè)屬性為int,則會(huì)初始化為0??赡苡绊懙綄?shí)際使用 |
|
2.3 實(shí)際案例
2.3.1 dao 層使用
import tk.mybatis.mapper.common.Mapper;
/**
* DAO 使用通用Mapper
* DSO接口需要繼承 tk.mybatis.mapper.common.Mapper
*/
@Repository
public interface BrandMapper extends Mapper<Brand> {
}
2.3.2 service 層使用
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Example;
import java.util.List;
@Service
public class BrandServiceImpl implements BrandService {
@Autowired
private BrandMapper brandMapper;
public Example createExample(Brand brand) {
// 自定義條件搜索對(duì)象 Example
Example example = new Example(Brand.class);
Example.Criteria criteria = example.createCriteria(); //條件構(gòu)造器
if (brand != null) {
if (!StringUtils.isEmpty(brand.getName())) {
criteria.andLike("name", '%' + brand.getName() + '%');
}
if (!StringUtils.isEmpty(brand.getLetter())) {
criteria.andEqualTo("letter", brand.getLetter());
}
}
return example;
}
@Override
public List<Brand> findAll() {
return brandMapper.selectAll();
}
@Override
public List<Brand> findList(Brand brand) {
Example example = createExample(brand);
return brandMapper.selectByExample(example);
}
@Override
public Brand findById(Integer id) {
return brandMapper.selectByPrimaryKey(id);
}
/**
* 分頁(yè)查詢
* @param page 當(dāng)前頁(yè)
* @param size 每頁(yè)顯示的條數(shù)
* @return
*/
@Override
public PageInfo<Brand> pageSearch(Integer page, Integer size) {
// 分頁(yè)實(shí)現(xiàn)
// 后面的查詢必須是緊跟集合查詢
PageHelper.startPage(page, size);
// 查詢集合
List<Brand> brands = brandMapper.selectAll();
return new PageInfo<Brand>(brands);
}
@Override
public PageInfo<Brand> pageSearchAndCondition(Brand brand, Integer page, Integer size) {
// 開始分頁(yè)
PageHelper.startPage(page, size);
// 搜索數(shù)據(jù)
Example example = createExample(brand);
List<Brand> list = brandMapper.selectByExample(example);
return new PageInfo<Brand>(list);
}
/**
* 增加品牌
* @param brand
*/
@Override
public void add(Brand brand) {
// 使用通用 Mapper.insertSelective
// 方法中但凡帶有selective就會(huì)忽略空值
int i = brandMapper.insertSelective(brand);
}
/**
* 根據(jù)id修改品牌
* @param brand
*/
@Override
public void update(Brand brand) {
// 使用通用mapper.update();
brandMapper.updateByPrimaryKeySelective(brand);
}
/**
* 根據(jù)id刪除
* @param id
*/
@Override
public void del(Integer id) {
brandMapper.deleteByPrimaryKey(id);
}
}
三、擴(kuò)展介紹
使用
public interface BaseMapper<T> extends tk.mybatis.mapper.common.BaseMapper<T>, IdsMapper<T>, MySqlMapper<T>, OracleMapper<T> {
}
pom.xml引入
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.5</version>
</dependency>
注:為了演示所以同時(shí)引用了MySqlMapper和OracleMapper 正常情況是只能引用一種因?yàn)樗麄冇幸粋€(gè)相同的方法insertList(List list)
泛型(實(shí)體類)的類型必須符合要求
實(shí)體類按照如下規(guī)則和數(shù)據(jù)庫(kù)表進(jìn)行轉(zhuǎn)換,注解全部是JPA中的注解:
- 表名默認(rèn)使用類名,駝峰轉(zhuǎn)下劃線(只對(duì)大寫字母進(jìn)行處理),如UserInfo默認(rèn)對(duì)應(yīng)的表名為user_info。
- 表名可以使用@Table(name = “tableName”)進(jìn)行指定,對(duì)不符合第一條默認(rèn)規(guī)則的可以通過(guò)這種方式指定表名。
- 字段默認(rèn)和@Column一樣,都會(huì)作為表字段,表字段默認(rèn)為Java對(duì)象的Field名字駝峰轉(zhuǎn)下劃線形式。
- 可以使用@Column(name = “fieldName”)指定不符合第3條規(guī)則的字段名。
- 使用@Transient注解可以忽略字段,添加該注解的字段不會(huì)作為表字段使用。
- 建議一定是有一個(gè)@Id注解作為主鍵的字段,可以有多個(gè)@Id注解的字段作為聯(lián)合主鍵。
所有的mapper繼承此類將具有以下通用方法
查詢方法
BaseSelectMapper下的通用方法
| 方法名稱 | 作用 |
|---|---|
| List selectAll(); | 查詢?nèi)繑?shù)據(jù) |
| T selectByPrimaryKey(Object key); | 通過(guò)主鍵查詢 |
| T selectOne(T record); | 通過(guò)實(shí)體查詢單個(gè)數(shù)據(jù) |
| List select(T record); | 通過(guò)實(shí)體查詢多個(gè)數(shù)據(jù) |
| int selectCount(T record); | 通過(guò)實(shí)體查詢實(shí)體數(shù)量 |
| boolean existsWithPrimaryKey(Object key); | 通過(guò)主鍵查詢此主鍵是否存在 |
SelectByIdsMapper下的通用方法
| 方法名稱 | 作用 |
|---|---|
| List selectByIds(String var1); | 通過(guò)多個(gè)主鍵查詢數(shù)據(jù) |
添加方法
BaseInsertMapper下的通用方法
?
| 方法名稱 | 作用 |
|---|---|
| int insert(T record); | 全部添加 |
| int insertSelective(T record); | 選擇性(不為null)的添加 |
MySqlMapper下的通用方法
| 方法名稱 | 作用 |
|---|---|
| int insertList(List list); | 批量插入 |
| int insertUseGeneratedKeys(T record); | 如果主鍵為自增可使用此方法獲取添加成功的主鍵 |
OracleMapper下的通用方法
| 方法名稱 | 作用 |
|---|---|
| int insertList(List list); | 批量插入 |
修改方法
BaseUpdateMapper下的通用方法
| 方法名稱 | 作用 |
|---|---|
| int updateByPrimaryKey(T record); | 按照實(shí)體進(jìn)行修改 |
| int updateByPrimaryKeySelective(T record); | 按照實(shí)體進(jìn)行有選擇的修改 |
刪除方法
BaseDeleteMapper下的通用方法
| 方法名稱 | 作用 |
|---|---|
| int delete(T record); | 按照實(shí)體進(jìn)行刪除 |
| int deleteByPrimaryKey(Object o); | 按照主鍵進(jìn)行刪除 |
IdsMapper下的通用方法
| 方法名稱 | 作用 |
|---|---|
| int deleteByIds(String var1); | 按照主鍵批量刪除 |
到此這篇關(guān)于TKMybatis的介紹和使用詳解的文章就介紹到這了,更多相關(guān)TKMybatis 使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于ChatGPT+SpringBoot實(shí)現(xiàn)智能聊天AI機(jī)器人接口并上線至服務(wù)器的方法
ChatGPT是一款基于自然語(yǔ)言處理技術(shù)的聊天機(jī)器人,ChatGPT可以模擬真實(shí)的人類對(duì)話,并能夠更貼近用戶的需求,提供更有價(jià)值的服務(wù),這篇文章主要介紹了基于ChatGPT+SpringBoot實(shí)現(xiàn)智能聊天AI機(jī)器人接口并上線至服務(wù)器,需要的朋友可以參考下2023-02-02
springboot日期轉(zhuǎn)換器實(shí)現(xiàn)實(shí)例解析
如何使用SpEL表達(dá)式實(shí)現(xiàn)動(dòng)態(tài)分表查詢
java使用POI讀取properties文件并寫到Excel的方法
PowerJob的TimingStrategyHandler工作流程源碼解讀
Java實(shí)戰(zhàn)之吃貨聯(lián)盟訂餐系統(tǒng)

