Mybatis-Plus極大簡(jiǎn)化了我們的開(kāi)發(fā),作為mybatis的增強(qiáng)版,Mybatis-Plus確實(shí)幫我們減少了很多SQL語(yǔ)句的編寫(xiě),通過(guò)其提供的API,可以方便地完成增刪查改操作。但是,其實(shí)除了Mybatis-Plus以外,還有一個(gè)技術(shù)tk-mybatis可以達(dá)到同樣的效果,只不過(guò)隨著MP的興起,tk-mybatis已經(jīng)被漸漸淡忘,就像曾經(jīng)的JSP+Servlet。
因此,為了證明tk-mybatis曾經(jīng)存在過(guò),這篇文章就詳細(xì)介紹一下tk-mybatis的使用方法。
目錄
第一步:準(zhǔn)備數(shù)據(jù)庫(kù)
第二步:創(chuàng)建一個(gè)springboot項(xiàng)目
第三步:添加tk-mybatis的依賴(lài)
第四步:修改配置文件
第五步:創(chuàng)建數(shù)據(jù)庫(kù)表對(duì)應(yīng)的實(shí)體類(lèi)
第六步:持久層接口繼承自Mapper接口
第七步:使用tk-mybatis的API完成crud
擴(kuò)展:使用tk-mybatis整合PageHelper實(shí)現(xiàn)分頁(yè)查詢(xún)
1、添加PageHelper依賴(lài)
2、設(shè)置分頁(yè)攔截器
3、在所有代碼之前開(kāi)啟分頁(yè)
第一步:準(zhǔn)備數(shù)據(jù)庫(kù)
創(chuàng)建數(shù)據(jù)庫(kù)tkmybatis,然后執(zhí)行項(xiàng)目resources目錄下的tkmybatis.sql腳本文件。
第二步:創(chuàng)建一個(gè)springboot項(xiàng)目
本篇文章將創(chuàng)建一個(gè)名為tkmybatis的springboot項(xiàng)目用于演示tkmybatis的使用。
第三步:添加tk-mybatis的依賴(lài)
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.1.5</version>
</dependency>
項(xiàng)目完整的依賴(lài)如下
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.9</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>tkmybatis</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
<mysql.version>8.0.28</mysql.version>
<druid.version>1.1.21</druid.version>
<lombok.version>1.18.22</lombok.version>
<mybatis.version>2.2.2</mybatis.version>
<tkmybatis.version>1.1.5</tkmybatis.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!--數(shù)據(jù)庫(kù)連接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!--tk.mybatis-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>${tkmybatis.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
第四步:修改配置文件
在application.yml中配置數(shù)據(jù)源和日志的顯示級(jí)別
spring:
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/tkmybatis
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
logging:
level:
springfox: error
com.example.tkmybatis: debug
第五步:創(chuàng)建數(shù)據(jù)庫(kù)表對(duì)應(yīng)的實(shí)體類(lèi)
package com.example.tkmybatis.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import javax.persistence.Id;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 歌曲
* @author heyunlin
* @version 1.0
*/
@Data
public class Song implements Serializable {
private static final long serialVersionUID = 18L;
@Id
private String id;
/**
* 歌曲名
*/
private String name;
/**
* 歌手
*/
private String singer;
/**
* 描述信息
*/
private String note;
/**
* 最后一次修改時(shí)間
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime lastUpdateTime;
}
第六步:持久層接口繼承自Mapper接口
package com.example.tkmybatis.mapper;
import com.example.tkmybatis.entity.Song;
import org.springframework.stereotype.Repository;
import tk.mybatis.mapper.common.Mapper;
/**
* @author heyunlin
* @version 1.0
*/
@Repository
public interface SongMapper extends Mapper<Song> {
}
在這點(diǎn)上,其實(shí)和mybatis-plus很像,mybatis-plus里是繼承BaseMapper<T>接口,然后使用BaseMapper<T>接口中預(yù)定義實(shí)現(xiàn)的簡(jiǎn)單crud方法。
但是,tk-mybatis的各個(gè)API在繼承關(guān)系上又和mybatis-plus完全不同,tk-mybatis中,一個(gè)接口中只定義一個(gè)方法(把接口隔離原則體現(xiàn)的淋漓盡致ovo)。
package tk.mybatis.mapper.common;
public interface Mapper<T> extends
BaseMapper<T>,
ExampleMapper<T>,
RowBoundsMapper<T>,
Marker {
}
可以發(fā)現(xiàn),Mapper接口繼承了很多個(gè)接口BaseMapper、ExampleMapper和RowBoundsMapper,而B(niǎo)aseMapper又繼承了基本的增刪查改的Mapper接口BaseSelectMapper、BaseInsertMapper、BaseUpdateMapper和BaseDeleteMapper。
這幾個(gè)接口又繼承了相應(yīng)的插入、刪除、更新或查詢(xún)的接口,每個(gè)接口中只定義一個(gè)方法。
BaseMapper.java
package tk.mybatis.mapper.common;
import tk.mybatis.mapper.common.base.BaseDeleteMapper;
import tk.mybatis.mapper.common.base.BaseInsertMapper;
import tk.mybatis.mapper.common.base.BaseSelectMapper;
import tk.mybatis.mapper.common.base.BaseUpdateMapper;
public interface BaseMapper<T> extends
BaseSelectMapper<T>,
BaseInsertMapper<T>,
BaseUpdateMapper<T>,
BaseDeleteMapper<T> {
}
BaseSelectMapper.java
package tk.mybatis.mapper.common.base;
import tk.mybatis.mapper.common.base.select.*;
public interface BaseSelectMapper<T> extends
SelectOneMapper<T>,
SelectMapper<T>,
SelectAllMapper<T>,
SelectCountMapper<T>,
SelectByPrimaryKeyMapper<T>,
ExistsWithPrimaryKeyMapper<T> {
}
第七步:使用tk-mybatis的API完成crud
tk-mybatis中兩個(gè)重要的API相關(guān)說(shuō)明:
- tk.mybatis.mapper.entity.Example
- tk.mybatis.mapper.entity.Example.Criteria
1、創(chuàng)建Example對(duì)象
2、通過(guò)Example的靜態(tài)方法createCriteria()獲取Criteria對(duì)象
接下來(lái)通過(guò)測(cè)試類(lèi)測(cè)試tkmybatis的API方法
package com.example.tkmybatis;
import com.example.tkmybatis.entity.Song;
import com.example.tkmybatis.mapper.SongMapper;
import com.example.tkmybatis.util.StringUtils;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import tk.mybatis.mapper.entity.Example;
import java.util.List;
@SpringBootTest
class TkMybatisTests {
@Autowired
private SongMapper songMapper;
@Test
void testInsert() {
Song song = new Song();
song.setId(StringUtils.uuid());
song.setName("稻香");
song.setSinger("周杰倫");
// 添加
songMapper.insert(song);
// 選擇性添加
// 拼接sql語(yǔ)句時(shí)會(huì)在每個(gè)字段設(shè)置前添加null判斷,只有不為null才設(shè)置到set子句
songMapper.insertSelective(song);
}
@Test
void testUpdate() {
Song song = new Song();
song.setId(StringUtils.uuid());
song.setName("稻香");
song.setSinger("周杰倫");
// 通過(guò)主鍵修改
songMapper.updateByPrimaryKey(song);
// 通過(guò)主鍵選擇性修改
songMapper.updateByPrimaryKeySelective(song);
}
@Test
void testUpdateByExample() {
Song song = new Song();
song.setId(StringUtils.uuid());
song.setName("稻香");
song.setSinger("周杰倫");
Example example = new Example(Song.class);
Example.Criteria criteria = example.createCriteria();
criteria.andCondition("name = ", song.getName());
// 通過(guò)Example中設(shè)置的條件修改
songMapper.updateByExample(song, example);
// 通過(guò)Example中設(shè)置的條件選擇性地修改
songMapper.updateByExampleSelective(song, example);
}
@Test
void testSelect() {
Song song = new Song();
song.setName("稻香");
song.setSinger("周杰倫");
// 根據(jù)song中設(shè)置字段作為條件查詢(xún)條件
List<Song> select = songMapper.select(song);
// 根據(jù)主鍵查詢(xún)(也就是@Id注解標(biāo)注的字段)
Song selectByPrimaryKey = songMapper.selectByPrimaryKey("123");
// 查詢(xún)?nèi)? List<Song> selectAll = songMapper.selectAll();
// 同select()方法,當(dāng)能夠確定查詢(xún)結(jié)果中最多只有一條記錄時(shí)可以使用此方法
Song selectOne = songMapper.selectOne(song);
// 根據(jù)song中設(shè)置字段作為條件查詢(xún)條件,返回符合條件的記錄數(shù)
int selectCount = songMapper.selectCount(song);
}
@Test
void testSelectByExample() {
Example example = new Example(Song.class);
Example.Criteria criteria = example.createCriteria();
example.setOrderByClause("last_update_time");
criteria.andCondition("name = ", "稻香");
criteria.andCondition("singer = ", "周杰倫");
List<Song> list = songMapper.selectByExample(example);
int count = songMapper.selectCountByExample(example);
}
}
擴(kuò)展:使用tk-mybatis整合PageHelper實(shí)現(xiàn)分頁(yè)查詢(xún)
和mybatis-plus不同,tk-mybatis并沒(méi)有幫我們實(shí)現(xiàn)分頁(yè)功能,需要整合PageHelper來(lái)實(shí)現(xiàn)分頁(yè)查詢(xún)。
1、添加PageHelper依賴(lài)
<!-- 分頁(yè)插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.4</version>
</dependency>
2、設(shè)置分頁(yè)攔截器
package com.example.tkmybatis.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.github.pagehelper.PageInterceptor;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
import java.util.Properties;
/**
* Mybatis配置類(lèi)
* @author heyunlin
* @version 1.0
*/
@Configuration
@MapperScan("com.example.tkmybatis.mapper")
public class MybatisConfig {
@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource getDataSource() {
return DataSourceBuilder.create().type(DruidDataSource.class).build();
}
/**
* 定義創(chuàng)建Session工廠(chǎng)Bean的方法
* @return SqlSessionFactoryBean
*/
@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean() {
// 定義MyBatis的Session工廠(chǎng)對(duì)象,用于產(chǎn)生MyBatis全局的會(huì)話(huà)工廠(chǎng)
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
// 設(shè)置數(shù)據(jù)源
sqlSessionFactoryBean.setDataSource(getDataSource());
Properties properties = new Properties();
properties.setProperty("reasonable", "true");
properties.setProperty("pageSizeZero", "true");
properties.setProperty("supportMethodsArguments", "true");
// 創(chuàng)建分頁(yè)攔截器
PageInterceptor interceptor = new PageInterceptor();
interceptor.setProperties(properties);
// 添加分頁(yè)攔截器
sqlSessionFactoryBean.setPlugins(interceptor);
return sqlSessionFactoryBean;
}
}
3、在所有代碼之前開(kāi)啟分頁(yè)
在所有代碼之前添加PageHelper.startPage(int page, int size)方法開(kāi)啟分頁(yè)。例如:
package com.example.tkmybatis;
import com.example.tkmybatis.dto.SongPagerDTO;
import com.example.tkmybatis.entity.Song;
import com.example.tkmybatis.mapper.SongMapper;
import com.example.tkmybatis.util.StringUtils;
import com.github.pagehelper.PageHelper;
import org.apache.ibatis.session.RowBounds;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import tk.mybatis.mapper.entity.Example;
import java.util.List;
@SpringBootTest
class TkMybatisTests {
@Autowired
private SongMapper songMapper;
@Test
void testSelectByPage() {
// 模擬后臺(tái)傳的參數(shù)
SongPagerDTO pagerDTO = new SongPagerDTO();
pagerDTO.setName("愛(ài)");
PageHelper.startPage(pagerDTO.getPage(), pagerDTO.getRows());
Example example = new Example(Song.class);
Example.Criteria criteria = example.createCriteria();
if (StringUtils.isNotEmpty(pagerDTO.getName())) {
criteria.andLike("name", "%".concat(pagerDTO.getName()).concat("%"));
}
List<Song> list = songMapper.selectByExample(example);
int count = songMapper.selectCountByExample(example);
// 封裝查詢(xún)結(jié)果返回
}
}
整個(gè)項(xiàng)目的結(jié)構(gòu)如下
好了,文章就分享到這里了,文章設(shè)計(jì)代碼已經(jīng)上傳到git倉(cāng)庫(kù),按需獲取文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-655315.html
tkmybatis使用詳解案例項(xiàng)目https://gitee.com/he-yunlin/tkmybatis.git文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-655315.html
到了這里,關(guān)于tk-mybatis使用介紹,springboot整合tk-mybatis、PageHelper實(shí)現(xiàn)分頁(yè)查詢(xún)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!