이전 글 "Mybatis 시리즈 심층 소개(8)---매퍼 매핑 파일 구성 선택, resultMap"에서는 mybatis의 쿼리에 대해 간략하게 소개했습니다. 이번 글에서는 mybatis의 강력한 동적 SQL을 소개하겠습니다.
그러면 다음과 같은 질문이 떠오릅니다. 동적 SQL이란 무엇입니까? 동적 SQL의 역할은 무엇입니까?
JDBC를 사용하는 기존 방식에서는 복잡한 SQL 문을 결합할 때 주의를 기울이지 않으면 공백을 누락해도 오류가 발생한다고 생각합니다. Mybatis의 동적 SQL 기능은 이러한 문제를 해결하기 위해 설계되었으며 if, choose, when, else, Trim, where, set 및 foreach 태그를 통해 매우 유연한 SQL 문으로 결합될 수 있어 개발자의 효율성이 향상됩니다. 마이바티스 동적 SQL의 매력을 느껴보자:
1. if: 당신도 판단할 수 있고 나도 할 수 있다!
if를 이해하지 못하는 프로그래머라면 mybatis에서도 if를 사용할 수 있습니다:
<select id="findUserById" resultType="user"> select * from user where <if test="id != null"> id=#{id} </if> and deleteFlag=0;</select>
위의 예 : 들어오는 ID가 비어 있지 않으면 SQL은 id = #{id}를 연결합니다. 이 내용은 그냥 보시면 다들 아실 거라 생각해서 자세히 설명하지 않겠습니다.
주의 깊은 사람은 다음과 같은 문제를 발견할 것입니다. "당신이 틀렸습니다! 전달한 ID가 null이면 최종 SQL 문은 select * from user where 및 deleteFlag=0이 됩니다. 여기에 뭔가 문제가 있습니다. "
네, 이때 마이바티스의 where 태그가 본격적으로 등장합니다:
2. where, 저와 함께 SQL 문 스플라이싱 조건 모두 구름 속에 있어요!
위의 예를 다음과 같이 수정해 보겠습니다.
<select id="findUserById" resultType="user"> select * from user <where> <if test="id != null"> id=#{id} </if> and deleteFlag=0; </where> </select>
어떤 사람들은 "뭐하는 거야? 대체 뭐하는 거야?"라고 묻습니다. ! 위와 비교하면 그냥 추가 where 태그가 아닌가요? 이것도 select * from user where 및 deleteFlag=0을 표시합니까? "
사실 표면적으로는 추가 where 태그일 뿐입니다. , 그러나 본질적으로 mybatis는 AND 또는 OR을 만나면 이를 처리하는 방법을 알고 있습니다. 실제로 트림 태그를 통해 이 처리 규칙을 사용자 정의할 수 있습니다.
3. 다듬기 : 내 영토는 내가 정한다!
위의 where 태그는 실제로 다음과 같이 트림으로 표현될 수 있습니다:
<trim prefix="WHERE" prefixOverrides="AND |OR "> ... </trim>
즉, WHERE 뒤에 AND가 오는 경우 또는 When OR 연산을 수행하려면 AND 또는 OR을 제거하세요. WHERE 외에도 실제로 더 고전적인 구현인 SET이 있습니다.
4. 세트: 저를 믿으세요. 실수하지 않을 거예요!
<update id="updateUser" parameterType="com.dy.entity.User"> update user set <if test="name != null"> name = #{name}, </if> <if test="password != null"> password = #{password}, </if> <if test="age != null"> age = #{age} </if> <where> <if test="id != null"> id = #{id} </if> and deleteFlag = 0; </where></update>
문제가 다시 발생합니다. "null이 아닌 이름만 있는 경우 이 SQL은 업데이트 세트 이름 = #{name}이 됩니다. 여기서 ... .. ? 이름 뒤에 쉼표가 있으면 오류가 발생합니다! "
네, 이때는 mybatis에서 제공하는 set 태그를 사용하면 됩니다. set 태그를 통해 다음 내용이 수정됩니다.
<update id="updateUser" parameterType="com.dy.entity.User"> update user <set> <if test="name != null">name = #{name},</if> <if test="password != null">password = #{password},</if> <if test="age != null">age = #{age},</if> </set> <where> <if test="id != null"> id = #{id} </if> and deleteFlag = 0; </where></update>
这个用trim 可表示为:
<trim prefix="SET" suffixOverrides=","> ...</trim>
WHERE是使用的 prefixOverrides(前缀), SET是使用的 suffixOverrides (后缀), 看明白了吧!
5. foreach: 你有for, 我有foreach, 不要以为就你才屌!
java中有for, 可通过for循环, 同样, mybatis中有foreach, 可通过它实现循环,循环的对象当然主要是java容器和数组。
<select id="selectPostIn" resultType="domain.blog.Post"> SELECT * FROM POST P WHERE ID in <foreach item="item" index="index" collection="list" open="(" separator="," close=")"> #{item} </foreach></select>
将一个 List 实例或者数组作为参数对象传给 MyBatis,当这么做的时候,MyBatis 会自动将它包装在一个 Map 中并以名称为键。List 实例将会以“list”作为键,而数组实例的键将是“array”。同样, 当循环的对象为map的时候,index其实就是map的key。
6. choose: 我选择了你,你选择了我!
Java中有switch, mybatis有choose。
<select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <choose> <when test="title != null"> AND title like #{title} </when> <when test="author != null and author.name != null"> AND author_name like #{author.name} </when> <otherwise> AND featured = 1 </otherwise> </choose></select>
以上例子中: 当title和author都不为null的时候, 那么选择二选一(前者优先), 如果都为null, 那么就选择 otherwise中的, 如果tilte和author只有一个不为null, 那么就选择不为null的那个。
纵观mybatis的动态SQL, 强大而简单, 相信大家简单看一下就能使用了。
好啦,本次就写到这!下篇文章将结合mybatis的源码分析一次sql语句执行的整个过程。
以上就是深入浅出Mybatis系列(九)---强大的动态SQL的内容,更多相关内容请关注PHP中文网(www.php.cn)!