mybatis3通过注解provider进行动态sql

Mybatis基于注解方式实现CRUD(增删查改)操作,相较于传统的XML方式,能有效地简化代码,并更有利于代码维护,且可读性更高!

一般使用注解实现简单的SQL进行增删查改是十分方便的,但是如果需要动态绑定参数,就需要结合xml的标签嵌入。

 

如批量删除

// @Delete("DELETE FROM s_userspacedetail where userSpaceDetailId in (#{strID})") 该方法只能删除一个
@Delete("")
  int delectByUserSpaceDetailId(@Param("arrID")int[]  arrID);

 

如模糊查询

@Select("")
public List selectAll(@Param("UserID") int UserID, @Param("strName") String strName);

 

 

其实我使用注解执行sql就是因为讨厌xml的标签,那么mybatis3就提供provider可以实现动态SQL

(简单来说就是通过java形式实现动态SQL)

 mybatis3提供了4个**provider注解,分别对应增删改查,分别是:

InsertProvider、DeleteProvider、UpdateProvider、SelectProvider

这些注解都有统一的2个入参,一个是type,一个是method。

type参数的值是你动态sql的类class文件,method是类中的方法名。

如批量删除

@DeleteProvider(type = UserSpaceDetailProvider.class,method ="delectByUserSpaceDetailId" )
int delectByUserSpaceDetailId(@Param("arrID")int[]  arrID);

package com.shao.mypan.mapper.sqlprovider;

import org.apache.ibatis.jdbc.SQL;
import org.springframework.util.ObjectUtils;

/**
 * @author HuaShao
 * @date 2020/8/23 - 9:29
 *
 * 注意mybatis3的新特性
 * Mapper指定type参数指定的Class类,必须要能够通过无参的构造函数来初始化。
 * Mapper指定method参数指定的方法,必须是public的,返回值必须为String,可以为static
 *
 * model案例:
 * UserMapper.java
 *
 *     @SelectProvider(type = SqlProvider.class, method = "selectAllUser")
 *
 *     @ResultMap("userMap")
 *
 *      public List getAllUser();
 *----------------------------------------------
 * SqlProvider.java
 *
 *      public String selectAllUser() {
 *
 *         return "select * from user";
 *
 *     }
 */

public class UserSpaceDetailProvider {

   public String delectByUserSpaceDetailId(int[]  arrID){
        //StringBuffer 字符串变量(线程安全)   StringBuilder 字符串变量(非线程安全)
       StringBuilder sb = new StringBuilder();
       sb.append("DELETE FROM s_userspacedetail where userSpaceDetailId in ( ");
       String strID="";
       int i=0;
       do{
           sb.append(arrID[i]);
           i++;
           if(ilength){
               sb.append(",");
           }
       }while(ilength);
       sb.append(")") ;

       return sb.toString();

   }
}

或者使用mybatis的SQL类进行SQL查询

return new SQL() {
       {
           DELETE_FROM("userspacedetail");
           WHERE("userSpaceDetailId in (#{strId}");
       }
   }.toString();

你可能感兴趣的:(Mybatis)