• MyBatis动态SQL(一)


    MyBatis 的强大特性之一便是它的动态 SQL。动态 SQL 元素和 JSTL 或基于类似 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多元素需要花时间了解。MyBatis 3 大大精简了元素种类,现在只需学习原来一半的元素便可。MyBatis 采用功能强大的基于 OGNL 的表达式来淘汰其它大部分元素。

    1.if标签

    映射文件配置:

      	<select id="query" resultMap="baseMap" parameterType="user">
    		select * from t_user
    		<!-- 这里的1=1方便测试 -->
    		 where 1=1
    		 <!-- 条件if标签通过判断name参数是否为空决定是否使用这个SQL语句 -->
    		<if test="name!=null" >
    			and name=#{name}
    		</if>
    	</select>
    

    测试代码name=null的情况下:

    @Test
    	public void test() {
    		List<User> list = mapper.query(new User());
    		for (User user : list) {
    			System.err.println("在name=null的情况下"+user);
    		}
    	}
    

    测试结果:
    在这里插入图片描述
    测试代码name!=null的情况下:

    @Test
    	public void test() {
    		User testUser = new User();
    		testUser.setName("zhangsan");
    		List<User> list = mapper.query(testUser);
    		for (User user : list) {
    			System.err.println("在name=null的情况下"+user);
    		}
    	}
    

    在这里插入图片描述

    2. choose,when,otherwise

    choose选择语句,差不多等同于java语句中的switch语句。通过创建多个标签元素来选择符合要求的元素。when表示在满足某种情况下调用该内容,otherwise表示在所有情况都不满足的情况下调用的内容。
    配置标签代码使用方式:

    <select id="query" resultMap="baseMap" parameterType="user">
    		select * from t_user
    		 where 1=1
    		 <!-- 如果满足其中的条件就调用其中的SQL语句 -->
    		<choose>
    			<when test="no!=null">
    				and no=#{no}
    			</when>
    			<when test="name!=null">
    				and name=#{name}
    			</when>
    			<otherwise>
    				<if test="age!=null" >
    					and age=#{age}
    				</if>
    			</otherwise>
    		</choose>
    	</select>
    

    3.where

    上述配置代码中为了方便测试我都在where后面添加1=1来方便测试,但是有时候我们对where是否使用也需要动态决定。这个时候就可以使用where标签来解决这个问题。

    <select id="queryById" resultType="user" parameterType="int">
    		select * 
    		from t_user 
    		<where>
    			<if test="no!=null" >
    					 no=#{no}
    				</if>
    		</where>
    	</select>
    

    这里满足条件就会自动添加where并调用其中的SQL代码。

    4.set

    set标签主要用于SQL更新UPDATE代码中,用法如下代码:

    <update id="update" parameterType="user">
    		update t_user 
    		<!-- 通过set来动态设置更新的参数 -->
    		<set>
    			<if test="name!=null">name=#{name}</if>
    			<if test="age!=null">age=#{age}</if>
    		</set>
    		where no = #{no} 
    	</update>
    

    5.trim

    trim标签是一个格式化标签,可以用来代替set或者where标签的功能。具体用法如下代码:

    <update id="update" parameterType="user">
    		update t_user 
    		<!-- <set>
    			<if test="name!=null">name=#{name}</if>
    			<if test="age!=null">age=#{age}</if>
    		</set> -->
    		<!-- prefix表示调用SQL语句时在最前面添加的前缀
    			prefixOverrides表示调用SQL语句时去掉的第一个指定内容
    			suffix表示调用SQL语句时在最后面添加的后缀
    			suffixOverride表示调用SQL语句时去掉的最后一个指定内容
    		 -->
    		<trim prefix="set" prefixOverrides="and | or">
    			<if test="name!=null"> and name=#{name}</if>
    			<if test="age!=null"> or age=#{age}</if>
    		</trim>
    		where no = #{no} 
    	</update>
    

    通过这个trim获得了跟set一样的效果,不过更具有灵活性。

  • 相关阅读:
    TP5框架 《防sql注入、防xss攻击》
    jsonp跨域的原理
    PHP程序发送HTTP请求代码
    encodeURI()和encodeURIComponent() 区别
    密码存储中MD5的安全问题与替代方案
    获取用户Ip地址通用方法常见安全隐患(HTTP_X_FORWARDED_FOR)
    PHP中的调试工具 --Xdebug安装与使用
    手机端页面自适应解决方案—rem布局(进阶版,附源码示例)
    thinkphp 微信授权登录 以及微信实现分享
    PHP中使用CURL之php curl详细解析和常见大坑
  • 原文地址:https://www.cnblogs.com/xj619/p/11182318.html
Copyright © 2020-2023  润新知