Mybatis动态sql语句及模糊查询札记

6 篇文章 2 订阅
4 篇文章 0 订阅

1 单条件模糊查询

  • sql中字符串拼接模糊匹配
<select id="getComponentByName" parameterType="String" resultMap="component">
	SELECT * FROM dmp_component WHERE name like CONCAT(CONCAT('%',#{name}),'%')
</select>
  • 忽略大小写匹配
<select id="getComponentByName" parameterType="String" resultMap="component">
	SELECT * FROM dmp_component where upper(code_name) like CONCAT(CONCAT(‘%’,upper(#{codeName})),’%’)
</select>

这里稍微岔开话题,Mysql默认的字符检索策略:utf8_general_ci,表示不区分大小写;此情况下,当用户认证系统中若查询字段是关键字时,大小写可能都能登录成功,如下语句返回的结果也是一样。

select * from user where username = 'admin' and password = 'admin';
select * from user where username = 'Admin' and password = 'admin';
select * from user where username = 'ADMIN' and password = 'admin';

因此我们在创建表时,应设置表的collate属性为utf8_general_cs或者utf8_bin;如果已经创建表,则直接修改字段的Collation属性为utf8_general_cs或者utf8_bin。utf8_general_cs表示区分大小写,utf8_bin表示二进制比较,同样也区分大小写 。(Mysql5.6.10版本不支持utf8_genral_cs)

2 多条件查询动态sql语句

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

  • if标签
    mybatis 中的if标签有些类似于EL表达式的使用,test中可以直接写入类中的属性或者key值。
<select id="selectComponentByNameAndType" resultMap="component"> 
	SELECT 
	* 
	FROM 
	dmp_component 
	WHERE 1=1 
	<if test="name != null and name != ''"> 
		and name = #{name} 
	</if> 
	<if test="type != null and type != ''"> 
		and type = #{type} 
	</if> 
</select> 
  • where标签
    where标签 替换了上述代码中的 WHERE 1=1 。 mybatis中的where 标签会判断标签内是否有内容, 如果有内容则自动生成where 并把 where 后面的第一个and 和一个空格,or和一个空格 去掉。
<select id="selectFIleByNameAndType" resultMap="HdfsFile">
   SELECT 
   * 
   FROM
   dmp_hdfs_file
   <where>
	   <if test="name != null and name != ''">
	   	and name = #{name}
	   </if>
	   <if test="type != null and type != ''">
	   	and type= #{type}
	   </if>
   </where>
  </select>
  • choose , when 和 otherwise 标签
    当所有条件不满足时,执行otherwise标签的内容。
<select id="selectComponentCat" resultMap="componentCategory">
   SELECT 
   * 
   FROM
   dmp_component_category
   <where>
   <choose>
    <when test="category_id != null and category_id != ''">
       and category_id = #{categoryId}
    </when>
    <when test="name != null and name != ''">
       and name = #{name}
    </when>
    <otherwise>
      category = #{category}
    </otherwise>
   </choose>
   </where>
  </select>

choose跟 JAVA 中的if-else(也有说switch)效果差不多,是按照条件的顺序进行匹配,当 when 中有条件满足的时候,就会跳出 choose,即所有的 when 和 otherwise 条件中,只有一个会输出,当所有的when条件都不满足时,输出 otherwise 中的内容。所以上述语句的意思非常简单。

  • set标签
    set标签常用于update操作,并且会自动过滤其他无关字段
 <update id="updateComponent" >
  UPDATE 
  dmp_component
  <set>
    <if test="codeName != null and codeName != ''">
       codeName = #{codeName }
    </if>
    <if test="platform != null and platform != ''">
       , platform = #{platform}
    </if>
  </set>
  WHERE id = #{id} 
  </update>
  • foreach标签
    foreach 用于处理数组或者list集合,下面是一个批量更新List的例子
<update id="updateModel">
    <foreach separator=";" collection="list" item="meta" index="index">
        update dmp_model
        <set>
           expriment_id=#{meta.exprimentId}
        </set>
           where id =#{meta.id}
    </foreach>
</update>

注,如果运用了set语法,mysql的批量更新是要我们主动去配置数据库连接的,连接地址需加上&allowMultiQueries=true
如:

type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/dmp_experiment?characterEncoding=utf-8&allowMultiQueries=true
username: root
password: 123456

批量添加例子如下:

<insert id="insertParameter">
  INSERT INTO 
  dmp_parameter
  (tab, label, value_name, value_type, value_note, value_data) 
  VALUES
  <foreach collection="list" item="meta" separator=","> 
   (#{meta.tab},#{meta.label},#{meta.valueName},#{meta.valueType},#{meta.valueNote},#{meta.valueData})
  </foreach>
</insert>

若参数为数组, 则collection只能为“array” ;参数为List集合,则collection只能为 “list” ,item指代集合中的每一个对象,上述写作meta。separator=”,”的含义是每条数据以 , 分割。 其他动态语句中有属性 open 和 close, 其含义是指在遍历开始和结束时分别添加其内容。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis是一个开源的持久层框架,它可以帮助开发者简化数据库操作的代码。MyBatis动态SQL语句是指在编写SQL语句时可以根据不同的条件动态生成不同的SQL语句MyBatis提供了以下几种方式来实现动态SQL语句: 1. if元素:通过if元素可以根据条件判断来生成不同的SQL语句片段。例如: ``` <select id="getUserList" parameterType="User" resultType="User"> SELECT * FROM user WHERE 1=1 <if test="name != null"> AND name = #{name} </if> <if test="age != null"> AND age = #{age} </if> </select> ``` 上述示例中,如果传入的User对象中name属性不为空,则会生成AND name = #{name}这段SQL语句。 2. choose、when、otherwise元素:通过choose、when、otherwise元素可以实现类似于switch语句的功能,根据不同的条件选择不同的SQL语句片段。例如: ``` <select id="getUserList" parameterType="User" resultType="User"> SELECT * FROM user WHERE 1=1 <choose> <when test="name != null"> AND name = #{name} </when> <when test="age != null"> AND age = #{age} </when> <otherwise> AND status = 'ACTIVE' </otherwise> </choose> </select> ``` 上述示例中,如果传入的User对象中name属性不为空,则会生成AND name = #{name}这段SQL语句;如果name为空而age不为空,则会生成AND age = #{age}这段SQL语句;如果name和age都为空,则会生成AND status = 'ACTIVE'这段SQL语句。 3. foreach元素:通过foreach元素可以实现对集合类型的参数进行遍历,并生成相应的SQL语句片段。例如: ``` <select id="getUserList" parameterType="List" resultType="User"> SELECT * FROM user WHERE id IN <foreach collection="list" item="id" open="(" separator="," close=")"> #{id} </foreach> </select> ``` 上述示例中,如果传入的List参数中包含[1, 2, 3]三个元素,则会生成SELECT * FROM user WHERE id IN (1, 2, 3)这段SQL语句。 这些是MyBatis动态SQL语句的几种常用方式,通过它们可以根据不同的条件生成不同的SQL语句,提高了SQL语句的灵活性和可复用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值