Mybatis-动态SQL

动态SQL

if

<!-- resultType 和实体类关联起来 -->
<select id="listProduct" resultType="Product">
	select * from product_
	<if test="name!=null">
	<!-- #{name}会自动获取传进来对象的name属性值-->
		where name like concat('%',#{name},'%')
	</if>		 	
</select>
Map<String,Object> params = new HashMap<>(); 
params.put("name","a");
List<Product> ps2 = session.selectList("listProduct",params);
for (Product p : ps2) {
    System.out.println(p);
}      

where

<select id="listProduct" resultType="Product">
	select * from product_
	<if test="name!=null">
		where name like concat('%',#{name},'%')
	</if>
	<if test="price!=0">
		and price > #{price}
	</if>
</select>

当没有name参数,却有price参数的时候
在这里插入图片描述

<select id="listProduct" resultType="Product">
	select * from product_
	<where>
		<if test="name!=null">
			and name like concat('%',#{name},'%')
		</if>
		<if test="price!=null and price!=0">
			and price > #{price}
		</if>
	</where>
</select>

<where>标签会进行自动判断
如果任何条件都不成立,那么就在sql语句里就不会出现where关键字
如果有任何条件成立,会自动去掉多出来的 and 或者 or

同理,update语句里使用set标签

 <update id="updateProduct" parameterType="Product" >
     update product_
     <set>
         <if test="name != null">name=#{name},</if>
         <if test="price != null">price=#{price}</if>
           
     </set>
      
      where id=#{id}   
 </update>

trim

用来定制想要的功能,比如where标签就可以用

<trim prefix="WHERE" prefixOverrides="AND |OR ">
  ... 
</trim>

set标签就可以用

<trim prefix="SET" suffixOverrides=",">
  ...
</trim>

if else

使用where、choose包裹 when、when、otherwise

<select id="listProduct" resultType="Product">
	  SELECT * FROM product_ 
	  <where>
	  	<choose>
		  <when test="name != null">
		    and name like concat('%',#{name},'%')
		  </when>			  
		  <when test="price !=null and price != 0">
		    and price > #{price}
		  </when>			  		
	  	  <otherwise>
	  	  	and id >1
	  	  </otherwise>
	  	</choose>
	  </where>
</select>

foreach

SELECT * FROM product_ 
WHERE ID in
<foreach item="item" index="index" collection="list"
    open="(" separator="," close=")">
    #{item}
</foreach>

参考 Oracle 的 in 语法

# 薪水要么等于3000要么等于6000
select * from employees where salary in(3000,6000)

bind

    <mapper namespace="com.how2java.pojo">
    
<!-- 		 本来的模糊查询方式 -->
<!--         <select id="listProduct" resultType="Product"> -->
<!--             select * from   product_  where name like concat('%',#{0},'%') -->
<!--         </select> -->
             
<!-- 		把模糊查询改为bind标签 -->   
	        <select id="listProduct" resultType="Product">
	            <bind name="likename" value="'%' + name + '%'" />
	            select * from   product_  where name like #{likename}
	        </select>
         
    </mapper>
Mybatis-plus是在Mybatis基础上进行封装的一个框架,它简化了平时开发过程中对常用接口的调用,可以省去一些繁琐的操作。然而,对于一些更为复杂的查询,Mybatis-plus可能无法满足需求,此时就需要我们自定义SQL语句来实现。通过在入口类的MybatisSqlSessionFactoryBuilder#build方法中注入mybatis-plus自定义的动态配置xml文件,可以实现自定义SQL语句和动态SQL的功能。具体的实现步骤如下: 1. 在应用启动时,在入口类的MybatisSqlSessionFactoryBuilder#build方法中将mybatis-plus的自定义动态配置xml文件注入到Mybatis中。 2. 在自定义的动态配置xml文件中,可以使用各种Mybatis-plus提供的方法来实现动态SQL的功能,比如IF标签、CHOOSE标签、FOREACH标签等。 3. 在自定义SQL语句中,可以结合Mybatis-plus的Wrapper类来实现条件查询,例如使用LambdaQueryWrapper来构建查询条件。 总结起来,Mybatis-plus提供了简化开发的接口,但对于一些更为复杂的查询,仍然需要我们自定义SQL语句和动态SQL来实现。通过注入自定义的动态配置xml文件,并结合Mybatis-plus提供的方法和Wrapper类,可以实现更加灵活和高效的数据查询。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [mybatis-plus/mybatis 自定义 sql 语句、动态 sql](https://blog.csdn.net/CREATE_17/article/details/109117091)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Mybatis Plus实现动态SQL语句的原理,你知道吗?](https://blog.csdn.net/weixin_38405253/article/details/119880820)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值