Mybatis模糊查询和动态sql语句的用法

 更新时间:2019年03月27日 10:37:24   作者:LLY19960418   我要评论
今天小编就为大家分享一篇关于Mybatis模糊查询和动态sql语句的用法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

Mybatis 模糊查询和动态sql语句

模糊查询

对金沙国际官网最常用的操作就是查询了,但是如何使用Mybatis进行模糊查询呢?下面先看一个简单的模糊查询

  <select id="select01" resultMap="BasicResultMap">
   SELECT 
   * 
  FROM
   oa_employee 
  WHERE emp_name LIKE #{asd} 
  </select>

这是一条伪模糊查询, 因为没有实现真正的模糊 “%”。参数为字符串,所以#{}中内容不被限制。但是应该如何插入 % 字符呢。 我们首先想到的是传递字符串参数时将%插入到字符串中 “张%”,但是这种方法操作略微繁琐了一些。 下面提供了使用sql方法的策略

 <select id="select01" resultMap="BasicResultMap">
   SELECT 
   * 
  FROM
   oa_employee 
  WHERE emp_name LIKE CONCAT( #{asd} ,'%')
  </select>

另外一种不推荐的写法给大家

<select id="select01" resultMap="BasicResultMap">
   SELECT 
   * 
  FROM
   oa_employee 
  WHERE emp_name LIKE '${emp_name}%'
  </select>

#{} 是采用预编译的写法,也就是JDBC中的PerpareStatement,这种写法可以防止sql注入,但${}这种写法是不采用预编译,其中的参数写成类中的属性或者map的key值或者为接口中注解的参数名。

mybatis 提供了bind 标签。下面举个例子

 <select id="select01" resultMap="BasicResultMap">
  <bind name="emp_name" value="'%'+ _parameter.getEmp_name() +'%'"/>
   SELECT 
   * 
  FROM
   oa_employee 
  WHERE emp_name LIKE #{emp_name}
  </select>

他是在#{}表达式自动填入value值,值得注意的是“_parameter.getEmp_name()” 调用的方法是对象中作为查询参数的属性的get方法

多条件查询

多种条件查询的要点是判断查询条件是否为空,拼接sql语句。在mybatis中提供了if标签和where 标签。 下面来介绍两种标签的用法。

if标签

<select id="select01" resultMap="BasicResultMap"> 
SELECT 
* 
FROM 
oa_employee 
WHERE 1=1 
<if test="emp_name != null and emp_name != ''"> 
and emp_name = #{emp_name } 
</if> 
<if test="emp_sex != null and emp_sex != ''"> 
and sex = #{emp_sex} 
</if> 
</select> 

mybatis 中的if标签有些类似于EL表达式的使用,test中可以直接写入类中的属性或者key值。

where标签

<select id="select01" resultMap="BasicResultMap">
   SELECT 
   * 
   FROM
   oa_employee 
   <where>
   <if test="emp_name != null and emp_name != ''">
    and emp_name = #{emp_name }
   </if>
   <if test="emp_sex != null and emp_sex != ''">
    and sex = #{emp_sex}
   </if>
   </where>
  </select>

这里的where标签 替换了前一段代码的 where 1=1 。 mybatis中的where 标签会判断标签内是否有内容, 如果有内容就自动生成where 并把 where 后面的第一个and +一个空格,or+一个空格 去掉。

choose , when 和 otherwise 标签

<select id="select01" resultMap="BasicResultMap">
   SELECT 
   * 
   FROM
   oa_employee 
   <where>
   <choose>
    <when test="emp_name != null and emp_name != ''">
       and emp_name = #{emp_name }
    </when>
     <when test="emp_sex != null and emp_sex != ''">
       and sex = #{emp_sex}
    </when>
    <otherwise>
      emp_id = 50
    </otherwise>
   </choose>
   </where>
  </select>

当所有条件不满足时,执行otherwise标签的内容。

trim标签

<select id="select01" resultMap="BasicResultMap">
   SELECT 
   * 
   FROM
   oa_employee 
    <trim prefix="where" prefixOverrides="and |or ">
    <if test="emp_name != null and emp_name != ''">
      and emp_name = #{emp_name }
    </if>
    <if test="emp_sex != null and emp_sex != ''">
       and sex = #{emp_sex}
    </if>
  </trim>

trim标签的属性及其含义

  • - prefix : 标签之间有内容在最前面加入
  • - prefixOverrides: 检查内容的最前面是否匹配,匹配就删除
  • - suffix: 标签之间有内容在最后面加入
  • - suffixOverrides:检查内容的最后面是否匹配,匹配就删除

set标签

set标签常用于update操作,并且会自动抹掉无关的,

 <update id="update01" >
  UPDATE 
   oa_employee 
  <set>
    <if test="emp_name != null and emp_name != ''">
       emp_name = #{emp_name}
    </if>
    <if test="emp_sex != null and emp_sex != ''">
      ,sex = #{emp_sex}
    </if>
  </set>
  WHERE emp_id = 50 
  </update>

foreach标签

foreach 用于处理数组或者list集合,下面是一个批量添加的例子

 <insert id="insert01">
  INSERT INTO 
  oa_employee 
  ( emp_name, sex, fk_dept_id) 
  VALUES
  <foreach collection="list" item="employee" separator=","> 
   (#{employee.emp_name},#{employee.emp_sex},#{employee.fk_dept_id})
  </foreach>
  </insert>

其中 如果参数为数组 则collection只能为“array” 参数为List集合则collection只能为 “list” item类似JSTL 中的var的作用, 指代容器中的每一个对象。separator=”,”的含义是每条数据以 , 分割。 未注明的属性有 open 和 close 他们的含义是在遍历开始和结束时分别添加其内容。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对澳门金沙网上娱乐的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • InvocationHandler中invoke()方法的调用问题分析

    InvocationHandler中invoke()方法的调用问题分析

    这篇文章主要介绍了InvocationHandler中invoke()方法的调用问题分析,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • 解决SpringMVC接收不到ajaxPOST参数的问题

    解决SpringMVC接收不到ajaxPOST参数的问题

    今天小编就为大家分享一篇解决SpringMVC接收不到ajaxPOST参数的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • MapTask工作机制图文详解

    MapTask工作机制图文详解

    今天小编就为大家分享一篇关于MapTask工作机制图文详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Java+opencv3.2.0实现重映射

    Java+opencv3.2.0实现重映射

    这篇文章主要为大家详细介绍了Java+opencv3.2.0实现重映射的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • Spring Boot使用模板引擎JSP实例解析

    Spring Boot使用模板引擎JSP实例解析

    这篇文章主要介绍了Spring Boot使用模板引擎JSP实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 浅谈Arrays.asList() 和ArrayList类型区别

    浅谈Arrays.asList() 和ArrayList类型区别

    下面小编就为大家带来一篇Arrays.asList() 和ArrayList类型区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • java 多态性详解及常见面试题

    java 多态性详解及常见面试题

    这篇文章主要介绍了java 多态性详解及常见面试题的相关资料,这里对java 的多态性做了资料整理,并列举常见的关于多态性的面试题,需要的朋友可以参考下
    2016-11-11
  • 详解Spring中Bean的加载的方法

    详解Spring中Bean的加载的方法

    本篇文章主要介绍了Spring中Bean的加载的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • Eclipse下基于Java的OpenCV开发环境配置教程

    Eclipse下基于Java的OpenCV开发环境配置教程

    这篇文章主要为大家详细介绍了Eclipse下基于Java的OpenCV开发环境配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • java 文件名截取方法

    java 文件名截取方法

    在实际开发应用中会应到截取文件名,本文将介绍java中文件名的截取,需要了解的朋友可以参考下
    2012-11-11

最新评论