Mybatis實(shí)現(xiàn)動(dòng)態(tài)SQL編寫詳細(xì)代碼示例
介紹
| 注解 | 作用 |
|---|---|
| @SelectProvider | 動(dòng)態(tài)查詢SQL |
| @InsertProvider | 動(dòng)態(tài)新增SQL |
| @UpdateProvider | 動(dòng)態(tài)更新SQL |
| @DeleteProvider | 動(dòng)態(tài)刪除SQL |
@Select 與 @SelectProvider 只是在定義注解的方式上有所不同, 一個(gè)是靜態(tài)SQL,一個(gè)是動(dòng)態(tài)SQL。
@SelectProvider 是 MyBatis 中的一個(gè)注解,用于指定一個(gè)類或者類的某個(gè)方法提供 SQL 查詢語句。該注解常用于動(dòng)態(tài) SQL 的場(chǎng)景,例如根據(jù)不同的參數(shù)生成不同的查詢語句。 使用 @SelectProvider 注解的方式可以讓 MyBatis 在運(yùn)行時(shí)根據(jù)注解指定的類或方法來生成對(duì)應(yīng)的 SQL 查詢語句,從而實(shí)現(xiàn)動(dòng)態(tài) SQL 功能。注解的語法如下:
@SelectProvider(type = XxxProvider.class, method = "xxxMethod")
其中,type 屬性表示提供 SQL 查詢語句的類,method 屬性表示類中提供查詢語句的方法。在查詢時(shí),MyBatis 會(huì)調(diào)用指定類中的指定方法來生成 SQL 查詢語句,然后執(zhí)行該查詢語句并返回結(jié)果。 需要注意的是,提供 SQL 查詢語句的類需要實(shí)現(xiàn) org.apache.ibatis.builder.annotation.ProviderMethodResolver 接口,該接口中定義了查找提供 SQL 查詢的方法的邏輯。同時(shí),提供查詢語句的方法需要返回一個(gè)字符串類型的 SQL 查詢語句。 使用 @SelectProvider 注解可以讓 MyBatis 的查詢語句更加靈活,適用于各種復(fù)雜的查詢場(chǎng)景。
1、@SelectProvider使用
1.TestMapper.java
public interface TestMapper {
/**
* 根據(jù)性別獲取老師信息
*
* @param sex
* @return
*/
@SelectProvider(type = Test.class, method = "list")
List<Teacher> list(Integer sex);
}
2.Test.java
public class Test {
/**
* 根據(jù)性別獲取老師信息
*
* @param sex
* @return
*/
public String list(Integer sex) {
return new SQL() {
{
SELECT("*");
FROM("teacher");
if (null != sex) {
WHERE(" 1 = 1 sex = " + sex);
} else {
WHERE(" 1 = 1 ");
}
ORDER_BY("create_time desc");
}
}.toString();
}
}2、模擬Mybatis Plus
可以使用 SelectProvider 寫一個(gè)適用于所有表的查詢的方法。
1.BasicWrapper.java
import java.util.LinkedList;
import java.util.List;
public class BasicWrapper<T> {
public String last;
public Class<T> bean;
public String table;
public String[] field;
public List<String> condition = new LinkedList<>();
public String orderBy;
}2.QueryWrapper.java
import java.util.Arrays;
import org.apache.ibatis.jdbc.SQL;
import cn.hutool.core.collection.CollectionUtil;
public class QueryWrapper<T> extends BasicWrapper {
public QueryWrapper() {
}
public QueryWrapper(String table, String... field) {
super.bean = null;
super.table = table;
super.field = (null == field || field.length == 0) ? new String[]{"*"} : field;
}
public String list(QueryWrapper wrapper) {
Query query = wrapper.build();
return new SQL() {
{
SELECT(query.getFields());
FROM(query.getTable());
WHERE(" 1 = 1 " + query.getCondition());
ORDER_BY(query.getOrderBy());
}
}.toString();
}
public Query build() {
Query query = new Query();
query.setTable(super.table);
query.setFields((null == super.field || super.field.length == 0) ? "*" : String.join(", ", Arrays.asList(super.field)));
String condition = CollectionUtil.isEmpty(super.condition) ? " 1 = 1 " : String.join(" ", super.condition);
String last = null == super.last ? "" : super.last;
query.setCondition(condition + " " + last);
return query;
}
public QueryWrapper orderBy(String sql) {
super.orderBy = sql;
return this;
}
public QueryWrapper orderBy(boolean condition, String sql) {
if (condition) {
super.orderBy = sql;
}
return this;
}
public QueryWrapper apply(String sql) {
super.condition.add(" and (" + sql + ") ");
return this;
}
public QueryWrapper apply(boolean condition, String sql) {
if (condition) {
super.condition.add(" and (" + sql + ") ");
}
return this;
}
public QueryWrapper eq(String filed, Object value) {
super.condition.add(" and " + filed + " = " + value);
return this;
}
public QueryWrapper eq(boolean condition, String filed, Object value) {
if (condition) {
if (value instanceof String) {
super.condition.add(" and " + filed + " = '" + value + "'");
} else {
super.condition.add(" and " + filed + " = " + value);
}
}
return this;
}
public QueryWrapper last(String value) {
super.last = " " + value;
return this;
}
public QueryWrapper last(boolean condition, String value) {
if (condition) {
super.last = " " + value;
}
return this;
}
public QueryWrapper like(String filed, Object value) {
super.condition.add(" and " + filed + " like %" + value + "%");
return this;
}
public QueryWrapper likeLeft(String filed, Object value) {
super.condition.add(" and " + filed + " like %" + value + "%");
return this;
}
public QueryWrapper likeRight(String filed, Object value) {
super.condition.add(" and " + filed + " like %" + value + "%");
return this;
}
public QueryWrapper like(boolean condition, String filed, Object value) {
if (condition) {
super.condition.add(" and " + filed + " like %" + value + "%");
}
return this;
}
public QueryWrapper likeLeft(boolean condition, String filed, Object value) {
if (condition) {
super.condition.add(" and " + filed + " like %" + value + "%");
}
return this;
}
public QueryWrapper likeRight(boolean condition, String filed, Object value) {
if (condition) {
super.condition.add(" and " + filed + " like %" + value + "%");
}
return this;
}
}
3.Query.java
import lombok.Data;
@Data
public class Query {
private String table;
private String fields;
private String orderBy;
private String condition;
}
4.Test.java
import org.apache.ibatis.jdbc.SQL;
public class Test {
public static void main(String agrs[]) {
QueryWrapper<Teacher> wrapper = new QueryWrapper<>("teacher");
wrapper.eq("sex", 1);
wrapper.eq(StringUtils.isNotBlank(name), "name", name);
wrapper.orderBy("create_time desc");
List<Teacher> list = processMapper.list(wrapper);
}
}到此這篇關(guān)于Mybatis實(shí)現(xiàn)動(dòng)態(tài)SQL編寫詳細(xì)代碼示例的文章就介紹到這了,更多相關(guān)Mybatis動(dòng)態(tài)SQL內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)戰(zhàn)之客戶信息管理系統(tǒng)
這篇文章主要介紹了Java實(shí)戰(zhàn)之客戶信息管理系統(tǒng),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04
一文了解SpringBoot是如何連接數(shù)據(jù)庫的
Spring Boot提供了一系列的開箱即用的功能和特性,使得開發(fā)人員可以快速構(gòu)建和部署應(yīng)用程序,下面這篇文章主要給大家介紹了關(guān)于SpringBoot是如何連接數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下2023-06-06
Springboot?異步任務(wù)和定時(shí)任務(wù)的異步處理
本文介紹了Springboot異步任務(wù)和定時(shí)任務(wù)的異步處理,Springboot?中,異步任務(wù)和定時(shí)任務(wù)是經(jīng)常遇到的處理問題方式,為了能夠用好這兩項(xiàng)配置,不干擾正常的業(yè)務(wù),需要對(duì)其進(jìn)行異步化配置。怎么設(shè)置合理的異步處理線程就是其核心和關(guān)鍵,下文詳情需要的朋友可以參考下2022-05-05
java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):順序隊(duì)列和循環(huán)隊(duì)列
下面小編就為大家分享一篇java隊(duì)列實(shí)現(xiàn)方法(順序隊(duì)列,循環(huán)隊(duì)列),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-08-08

