Mybatis实现动态SQL编写详细代码示例

 更新时间:2023年05月20日 10:16:06   作者:全子兄  
这篇文章主要为大家详细介绍了Mybatis中动态SQL的编写使用,动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决拼接SQL语句字符串时的痛点问题,感兴趣想要详细了解可以参考下文

介绍 

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

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

@SelectProvider 是 MyBatis 中的一个注解,用于指定一个类或者类的某个方法提供 SQL 查询语句。该注解常用于动态 SQL 的场景,例如根据不同的参数生成不同的查询语句。 使用 @SelectProvider 注解的方式可以让 MyBatis 在运行时根据注解指定的类或方法来生成对应的 SQL 查询语句,从而实现动态 SQL 功能。注解的语法如下:

@SelectProvider(type = XxxProvider.class, method = "xxxMethod")

其中,type 属性表示提供 SQL 查询语句的类,method 属性表示类中提供查询语句的方法。在查询时,MyBatis 会调用指定类中的指定方法来生成 SQL 查询语句,然后执行该查询语句并返回结果。 需要注意的是,提供 SQL 查询语句的类需要实现 org.apache.ibatis.builder.annotation.ProviderMethodResolver 接口,该接口中定义了查找提供 SQL 查询的方法的逻辑。同时,提供查询语句的方法需要返回一个字符串类型的 SQL 查询语句。 使用 @SelectProvider 注解可以让 MyBatis 的查询语句更加灵活,适用于各种复杂的查询场景。

1、@SelectProvider使用

1.TestMapper.java

public interface TestMapper {
    /**
     * 根据性别获取老师信息
     *
     * @param sex
     * @return
     */
    @SelectProvider(type = Test.class, method = "list")
    List<Teacher> list(Integer sex);
}
 

2.Test.java

public class Test {
    /**
     * 根据性别获取老师信息
     *
     * @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 写一个适用于所有表的查询的方法。

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);
	}
}

到此这篇关于Mybatis实现动态SQL编写详细代码示例的文章就介绍到这了,更多相关Mybatis动态SQL内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Java中自定义注解的使用

    详解Java中自定义注解的使用

    Annontation是Java5开始引入的新特征,中文名称叫注解,它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。本文主要介绍了自定义注解的使用,希望对大家有所帮助
    2023-03-03
  • Java实战之客户信息管理系统

    Java实战之客户信息管理系统

    这篇文章主要介绍了Java实战之客户信息管理系统,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • 一文了解SpringBoot是如何连接数据库的

    一文了解SpringBoot是如何连接数据库的

    Spring Boot提供了一系列的开箱即用的功能和特性,使得开发人员可以快速构建和部署应用程序,下面这篇文章主要给大家介绍了关于SpringBoot是如何连接数据库的相关资料,需要的朋友可以参考下
    2023-06-06
  • Mybatis防止sql注入的实例

    Mybatis防止sql注入的实例

    本文通过实例给大家介绍了Mybatis防止sql注入的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-06-06
  • 完美解决Spring声明式事务不回滚的问题

    完美解决Spring声明式事务不回滚的问题

    下面小编就为大家带来一篇完美解决Spring声明式事务不回滚的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • 解决使用mybatis取值,字段赋值错误的问题

    解决使用mybatis取值,字段赋值错误的问题

    这篇文章主要介绍了解决使用mybatis取值,字段赋值错误的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Springboot 异步任务和定时任务的异步处理

    Springboot 异步任务和定时任务的异步处理

    本文介绍了Springboot异步任务和定时任务的异步处理,Springboot 中,异步任务和定时任务是经常遇到的处理问题方式,为了能够用好这两项配置,不干扰正常的业务,需要对其进行异步化配置。怎么设置合理的异步处理线程就是其核心和关键,下文详情需要的朋友可以参考下
    2022-05-05
  • 搭建maven私有仓库的方法实现

    搭建maven私有仓库的方法实现

    Maven是一个流行的Java项目管理工具,它可以帮助我们管理项目的构建、报告和文档,本文主要介绍了搭建maven私有仓库的方法实现,感兴趣的可以了解一下
    2023-05-05
  • java数据结构基础:顺序队列和循环队列

    java数据结构基础:顺序队列和循环队列

    下面小编就为大家分享一篇java队列实现方法(顺序队列,循环队列),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-08-08
  • springboot整合couchbase集群的步骤

    springboot整合couchbase集群的步骤

    couchbase是一款开源的,分布式的nosql数据库,主要用于分布式缓存和数据存储领域,本文给大家介绍springboot整合couchbase集群的步骤,感兴趣的朋友一起看看吧
    2025-03-03

最新评论