spring Mybatis注解加判断

spring Mybatis注解加判断

spring Mybatis注解加判断

一、用script标签包围,然后像xml语法一样书写

  1. 判断参数是否为空或者为null,没有参数则不执行该语句
 @Select(
            {
                  "<script>",
                    "select * from teacher", "where 1=1",
                    "<if test='teacherName!=null and teacherName != \"\"'>", "and teacherName like '%${teacherName}%'", "</if>",
                    "<if test='sex!=null and sex != \"\"'>", "and sex = #{sex}", "</if>",
                    "<if test='type!=null and type !=\"\"'>", "and type = #{type}", "</if>",
                    "</script>"}
    )
    List<Teacher> findTeacherAll(@Param("teacherName") String teacherName,@Param("sex") String sex,@Param("type") String type);
  ==>  Preparing: select * from teacher where 1=1 and sex = ? 
 : ==> Parameters:(String)
 : <==      Total: 4
这里的@Param是用来判断的是否需要,我做的是下拉框选择传参,之前试过不加这个参数就造成下拉框选择传过来的参数都要作为条件这样导致语句查询不到想要的结果
注意:此处判断空时用到转义字符 name != \"\"
  1. 多个判断中取出一个类似于Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。
/**
  * @description 根据条件查询客户信息 (分页查询) 倒叙 
  * - asc 按升序排列 (不用写,默认使用这个) 
  * - desc 按降序排列 
  */
@Select({"<script>","select * from user","where 1=1",
        "<choose><when test='tel!=null'>","and tel = #{tel}","</when>",
        "<when test='customname!=null'>","and customname = #{customname}","</when>",
        "<when test='sendemail!=null'>","and send_email = #{sendemail}","</when>",
        "<when test='keywords!=null'>","and keywords like '%${keywords}%'","</when></choose>",
        "order by id desc limit #{pages},#{limit}",
        "</script>"})
public List<Custom> findCustomByForm(@Param("tel") String tel,@Param("customname") String customname,
            @Param("sendemail") String sendemail,@Param("keywords") String keywords,
            @Param("pages") Integer pages,@Param("limit") Integer limit);

**注意:有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。而使用if标签时,只要test中的表达式为 true,就会执行 if 标签中的条件。MyBatis 提供了 choose 元素。
if标签是与(and)的关系,而 choose 是或(or)的关系。

choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则 choose 结束。
当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的sql。类似于Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。

同样把所有可以限制的条件都写上,方面使用。choose会从上到下选择一个when标签的test为true的sql执行。安全考虑,我们使用where将choose包起来,放置关键字多于错误。**
二、用Provider去实现SQL拼接,例如:

public class OrderProvider {
  private final String TBL_ORDER = "tbl_order";
  public String queryOrderByParam(OrderPara param) {
    SQL sql = new SQL().SELECT("*").FROM(TBL_ORDER);
    String room = param.getRoom();
    if (StringUtils.hasText(room)) {
      sql.WHERE("room LIKE #{room}");
    }
    Date myDate = param.getMyDate();
    if (myDate != null) {
      sql.WHERE("mydate LIKE #{mydate}");
    }
    return sql.toString();
  }
}
public interface OrderDAO {
  @SelectProvider(type = OrderProvider.class, method = "queryOrderByParam")
  List<Order> queryOrderByParam(OrderParam param);
}

注意:方式1有个隐患就是当传入参数为空的时候,可能会造成全表查询。
复杂SQL用方式2会比较灵活(当然,并不建议写复杂SQL),而且可以抽象成通用的基类,使每个DAO都可以通过这个基类实现基本的通用查询,原理类似Spring JDBC Template。
功能,功能按钮位于编辑区域与预览区域中间;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值