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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

最新评论