Mybatis 动态SQL
admin
2024-02-17 17:01:26
0

Mybatis @SelectProvider

  • 1 @SelectProvider 使用
    • 1 TestMapper.java
    • 2 Test.java
  • 2 模拟 Mybatis Plus
    • 1 BasicWrapper.java
    • 2 QueryWrapper.java
    • 3 Query.java
    • 4 Test.java

注解作用
@SelectProvider动态查询SQL
@InsertProvider动态新增SQL
@UpdateProvider动态更新SQL
@DeleteProvider动态删除SQL

@Select 与 @SelectProvider 只是在定义注解的方式上有所不同, 一个是动态SQL一个是静态SQL。

1 @SelectProvider 使用

1 TestMapper.java

package com.xu.test.mybatis;import java.util.List;import org.apache.ibatis.annotations.SelectProvider;/*** @author Administrator* @date 2022年11月26日12点09分*/
public interface TestMapper {/*** 根据性别获取老师信息** @param sex* @return* @date 2022年11月26日12点09分*/@SelectProvider(type = Test.class, method = "list")List list(Integer sex);}

2 Test.java

package com.xu.test.mybatis;import org.apache.ibatis.jdbc.SQL;/*** @author Administrator* @date 2022年11月26日12点09分*/
public class Test {/*** 根据性别获取老师信息** @param sex* @return* @date 2022年11月26日12点09分*/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 写一个适用于所有表的查询的方法。

1 BasicWrapper.java

import java.util.LinkedList;
import java.util.List;/*** @author Administrator*/
public class BasicWrapper {public String last;public Class bean;public String table;public String[] field;public List 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;/*** @author Administrator*/
public class QueryWrapper 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;/*** @author Administrator*/
@Data
public class Query {private String table;private String fields;private String orderBy;private String condition;}

4 Test.java

package com.xu.test.mybatis;import org.apache.ibatis.jdbc.SQL;/*** @author Administrator* @date 2022年11月26日12点09分*/
public class Test {public static void main(String agrs[]) {QueryWrapper wrapper = new QueryWrapper<>("teacher");wrapper.eq("sex", 1);wrapper.eq(StringUtils.isNotBlank(name), "name", name);wrapper.orderBy("create_time desc");List list = processMapper.list(wrapper);}}

相关内容

热门资讯

绝版了!马斯克宣布停产特斯拉M... 快科技1月29日消息,在特斯拉2025年第四季度财报电话会议上,马斯克宣布,特斯拉将在2026年第二...
紫金、洛钼、江铜等超660亿海... 来源:界面新闻 2025年以来,紫金矿业(601899.SH)、洛阳钼业(603993.SH)...
原创 A... 在股市里,每一次新股上市都像是一场未知的冒险。而就在恒运昌登陆A股前夕,不少幸运中签的股民却陷入了“...
【评论】金矿企业顺周期扩张提速... 界面新闻记者 | 侯瑞宁 界面新闻编辑 | 刘春 黄金牛市下,两大矿业巨头近日在全球收购金矿资产...
水贝知名金店每日仅能提款500... 转自:贝壳财经 【#水贝知名金店每日仅能提款500元#,#杰我睿平台提出打折清偿方案#】近日,一场因...
原创 官... 文丨西部君 随着江苏2025年主要经济数据公布,全国31个省、自治区、直辖市(以下统称31省份)过去...
建设银行:唐朔正式就任副行长 北京商报讯(记者 孟凡霞 周义力)1月28日,建设银行发布公告,2025年12月23日,该行董事会审...
从万科退休20天后,郁亮疑似失... (文/孙梅欣 编辑/张广凯) 有市场消息称,万科前董事会主席、执行总裁郁亮近期疑似失联,时间已有半...
【看新股】燧原科技拟IPO:国... 转自:新华财经 新华财经北京1月29日电 近日,上海燧原科技股份有限公司(以下简称“燧原科技”或“公...
金价飙升下,银行火速上调积存金... 黄金价格在持续创造历史,银行在紧急出手控制风险。本周,国际金价连破四个关口,现货黄金在1月28日首次...
每天都喝!男子一查已是晚期!医... 68岁的刘大伯是小区里有名的“茶罐子”。清晨五点,他先烧一壶水,把昨晚泡过的铁观音再冲一遍,咕咚咕咚...
华大基因预计去年净利润同比大幅... 北京华大基因的展位在第三届中国国际供应链促进博览会上。 IC供图 1月27日晚间,华大基因发布202...
美联储如期按兵不动,美股波动不... 当地时间1月28日周三,美联储公布利率决议,美联储如期按兵不动。美股波动不大,美债和数字货币小幅波动...
原创 周... 说到娱乐圈中的明星,周深无疑是近年来一直保持高质量表现的代表之一。这几年,他在多个舞台上展现出不凡的...
美股收盘:存储股走强希捷劲升1... 财联社1月29日讯(编辑 赵昊)周三(1月28日),美股三大指数涨跌不一。 截至收盘,道琼斯指数涨0...
洛阳市孟津人民医院中西医结合解... 近日,洛阳市孟津人民医院康复医学科“中西医结合、针药并用”,仅用10天时间就为一位66岁的女患者缓解...
银行金条,“三周没到货了”,啥... “金条早就没货了,这几天朝阳区的工行网点都提不出金条,需要排队等。”27日,工商银行(下称工行)北京...
刚刚!美联储宣布:不降息!黄金... 【导读】美联储不降息,黄金、白银走高 中国基金报记者 泰勒 兄弟姐妹们啊,泰勒熬夜加班,一起关注一下...
天奇自动化工程股份有限公司20... 来源:上海证券报 证券代码:002009 证券简称:天奇股份 公告编号:2026-005 天奇自动...