Mybatis进行动态sql操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zc_ad/article/details/85251400

使用mybatis进行动态sql操作其实有两种:1.用script标签包围,然后像xml语法一样书写。2.用Provider去实现SQL拼接,下面分别介绍这两种方法的使用。

1.用script标签包围

这种方法使用起来很简单,可以使用if when foreach等元素,它支持的元素有:

trim
where
set
foreach
if
choose
when
otherwise
bind

列举两个例子,经常使用到的when与foreach

 

when:

其中test表达式中如果为true,才会将and type = #{type}语句拼接进去

@Select("<script> " +
    "SELECT * from t_sys_smart_device where 1 = 1 \n" +
    "<when test='type != null'> " +
    "and type = #{type}\n" +
    "</when>" +
    "and deleted_at is null" +
    "</script>")
List<SmartDeviceEntity> queryDevicesByType(@Param("type") Integer type);

foreach

collection:可用通过@Param注解指定参数名,参数List
item:参数调用名称,参数List的单个值
open:在循环前添加前缀
close:在循环后添加后缀
index:索引、下标
separator:分隔符,每次循环完成后添加此分隔符

@Select("<script>" +
    "SELECT * FROM t_sys_account"
    "where union_id in"
    "<foreach item='unionId' index='index' collection='unionIds' open='(' separator=',' close=')'>" +
    "#{unionId}" +
    "</foreach>" +
    "AND user.deleted_at IS NULL" +
    "</script>")
List<String> queryUsers(@Param("unionIds") List<String> unionIds);

 

2.用Provider去实现SQL拼接

MyBatis提供了多个注解如:@InsertProvider,@UpdateProvider,@DeleteProvider和@SelectProvider,这个注解都可以建立动态sql。

主要用到的两个属性:
 

type:指定所在的类
method:指定类所在的方法

 

举一个例子,动态插入数据,其插入的字段是动态的。

/**第一list段是所插元素的字段名,第二个list是所插入数据的集合*/
@InsertProvider( type = SalaryProvider.class,method = "insertSalary")
void insertData(List<String> headers, List<String> datas);
/**
 * Created by XiChuan on 2018-12-25.
 */
public class SalaryProvider {
    /**动态插入sql*/
    /**使用<script>不可以的原因,在字段上会有'wage1' 存在,会报错*/
    public String insertSalary(List<String> headers,List<String> datas){
        StringBuilder sql = new StringBuilder();
        sql.append("insert into t_pub_salary_temp(");
	
	//插入字段
        headers.stream().forEach(header -> sql.append(header+","));
        sql.deleteCharAt(sql.length()-1);   //将最后一个','去掉

        sql.append(") values(");
	
	//插入数据
        datas.stream().forEach(data -> sql.append("'"+data+"',"));
        sql.deleteCharAt(sql.length()-1);   //将最后一个','去掉

        sql.append(");");

        String insertSql = sql.toString();
        System.out.println("sql:"+insertSql);
        return insertSql;   //返回sql
    }
}

猜你喜欢

转载自blog.csdn.net/zc_ad/article/details/85251400
今日推荐