MyBatis의 강력한 기능 중 하나는 동적 SQL입니다. JDBC 또는 기타 유사한 프레임워크를 사용해 본 경험이 있다면 다양한 조건에 따라 SQL 문을 연결하는 데 따른 어려움을 이해하게 될 것입니다. 예를 들어, 스플라이스할 때 필요한 공백을 추가하는 것을 잊지 않도록 주의하고, 목록의 마지막 열 이름에서 쉼표를 제거하도록 주의하십시오. 이러한 어려움을 완전히 없애려면 동적 SQL 기능을 활용하십시오.
과거에는 동적 SQL을 사용하는 것이 쉽지 않았지만 마이바티스는 어떤 SQL 매핑 문에서도 사용할 수 있는 강력한 동적 SQL 언어를 제공하여 이러한 상황을 개선했습니다.
동적 SQL 요소는 JSTL 또는 XML 기반 텍스트 프로세서와 유사합니다. 이전 버전의 MyBatis에서는 이해하는 데 시간이 걸리는 요소가 많았습니다. MyBatis 3에서는 요소 유형이 크게 단순화되었습니다. 이제 원래 요소의 절반만 배우면 됩니다. MyBatis는 강력한 OGNL 기반 표현식을 사용하여 대부분의 다른 요소를 제거합니다.
먼저 User 엔터티 클래스를 생성합니다
public class User { private Integer id; private String username; private String userEmail; private String userCity; private Integer age;}
사용자 테이블을 생성합니다
CREATE TABLE user ( id int(11) NOT NULL AUTO_INCREMENT, username varchar(255) DEFAULT NULL, user_email varchar(255) DEFAULT NULL, user_city varchar(255) DEFAULT NULL, age int(11) DEFAULT NULL, PRIMARY KEY (id))
인터페이스 메소드 정의
public List<User> findByUser(User user);
해당 Mapper.xml 인터페이스 정의는 다음과 같습니다
<select id="findByUser" resultType="com.example.mybatis.entity.User"> select id, username, user_email userEmail, user_city userCity, age from user where <if test="username != null and username != ''"> username = #{username} </if> <if test="userEmail != null and userEmail != ''"> and user_email = #{userEmail} </if> <if test="userCity != null and userCity != ''"> and user_city = #{userCity} </if></select>
if 태그 테스트가 true이면 if 태그의 SQL 문이 연결됩니다.
username, userEmail, userCity가 비어 있지 않으면 아래와 같이 SQL이 splicing됩니다
select id, username, user_email userEmail, user_city userCity, age from user where username = ? and user_email = ? and user_city = ?
username만 비어 있지 않으면 SQL이 다음과 같이 splicing됩니다
select id, username, user_email userEmail, user_city userCity, age from user where username = ?
하지만 이 방법의 문제 단점, 현재 사용자 이름이 비어 있다고 가정하면 userEmail과 userCity 모두 비어 있지 않습니다.
동적 SQL 코드를 분석해 보겠습니다. username에 할당된 값이 없습니다. 즉, username==null이므로 "username=#{username}" 코드는 SQL 문에 추가되지 않습니다. 동적 SQL은 다음과 같습니다:
select id, username, user_email userEmail, user_city userCity, age from user where and user_email = ? and user_city = ?
where 바로 뒤에 and가 옵니다. 이는 명백한 문법 오류입니다. 이때 where
바로 뒤에는 and
가 있어야 합니다. 삭제되었습니다. 이 문제를 해결하려면 where
태그를 사용하면 됩니다. where
后面的and
删掉。为了解决这个问题,可以使用where
标签。
将上面的SQL改成如下所示
<select id="findByUser" resultType="com.example.mybatis.entity.User"> select id, username, user_email userEmail, user_city userCity, age from user <where> <if test="username != null and username != ''"> username = #{username} </if> <if test="userEmail != null and userEmail != ''"> and user_email = #{userEmail} </if> <if test="userCity != null and userCity != ''"> and user_city = #{userCity} </if> </where> </select>
如果where
标签里面的if
标签有满足条件的,那么where
标签就会被拼接成where语句,若if
标签拼接的SQL最前面有and语句,那么这个and将会被删除。使用这种方法, 会自动删除SQL中不需要的关键字,所以一般 if 标签和 where 标签会组合起来使用。
trim
标签中的 prefix
和 suffix
属性会被用于生成实际的 SQL 语句,会和标签内部的语句拼接。
如果语句的前面或后面遇到 prefixOverrides
或 suffixOverrides
属性中指定的值,MyBatis 会自动将它们删除。在指定多个值的时候,别忘了每个值后面都要有一个空格,保证不会和后面的 SQL 连接在一起。
prefix:给拼接的SQL语句加一个前缀
suffix:给拼接的SQL语句加一个后缀
prefixOverrides:拼接的SQL语句前面遇到 prefixOverrides
,MyBatis 会自动将它们删除
suffixOverrides:拼接的SQL语句后面遇到 suffixOverrides
,MyBatis 会自动将它们删除
下面使用trim
标签来实现where
标签的功能
<select id="findByUser" resultType="com.example.mybatis.entity.User"> select id, username, user_email userEmail, user_city userCity, age from user <trim prefix="where" prefixOverrides="and"> <if test="username != null and username != ''"> username = #{username} </if> <if test="userEmail != null and userEmail != ''"> and user_email = #{userEmail} </if> <if test="userCity != null and userCity != ''"> and user_city = #{userCity} </if> </trim> </select>
如果username为空,userEmail和userCity不为空,那么if
标签拼接的SQL语句如下所示
and user_email = #{userEmail} and user_city = #{userCity}
因为trim
标签设置了prefixOverrides=”and”,而上面的SQL前面有and语句,所以需要将上面的and语句删掉,又因为trim
标签设置了prefix=”where”,所以需要在拼接的SQL语句前面加一个where语句
最后trim
where user_email = #{userEmail} and user_city = #{userCity}
where
태그의 if
태그가 조건을 충족하면 where 태그는 where 문으로 연결됩니다. <code>if
태그와 연결된 SQL의 앞에 and 문이 있으면 and가 삭제됩니다. 이 방법을 사용하면 SQL에서 불필요한 키워드가 자동으로 삭제되므로 일반적으로 태그와 where 태그를 조합하여 사용하는 경우가 많습니다. trim
태그의 prefix
및 suffix
속성은 실제 SQL 문을 생성하는 데 사용됩니다. 태그 문장 접합 내부와 결합됩니다.
prefixOverrides
또는 suffixOverrides
속성에 지정된 값이 명령문 전후에 발견되면 MyBatis는 자동으로 해당 값을 삭제합니다. 여러 값을 지정할 때 후속 SQL과 연결되지 않도록 각 값 뒤에 공백을 두는 것을 잊지 마십시오.
접두사: 연결된 SQL 문에 접두사 추가 prefixOverrides
가 발견되면 MyBatis는 자동으로 이를 삭제합니다
suffixOverrides: 스플라이스 이후에 suffixOverrides
가 발견되면 SQL 문, MyBatis가 자동으로 삭제합니다아래 trim
태그를 사용하여 where
태그의 기능을 구현하세요
<select id="findByUser" resultType="com.example.mybatis.entity.User"> select id, username, user_email userEmail, user_city userCity, age from user <where> <choose> <when test="username != null and username != ''"> username = #{username} </when> <when test="userEmail != null and userEmail != ''"> and user_email = #{userEmail} </when> <when test="userCity != null and userCity != ''"> and user_city = #{userCity} </when> </choose> </where> </select>
태그 접합을 위한 SQL 문이 다음과 같습니다🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">public int updateUser(User user);</pre><div class="contentsignin">로그인 후 복사</div></div>🎜<code>trim
태그가 prefixOverrides="and"로 설정되어 있고 위의 SQL에 and 문이 있으므로 앞에 있으므로 위와 문을 삭제해야 하며 trim
태그가 prefix="where"로 설정되어 있으므로 접합된 문 앞에 where 문을 추가해야 합니다. SQL 문🎜🎜마지막으로 trim
태그의 SQL 문이 아래와 같이 이어집니다🎜<update id="updateUser" parameterType="com.example.mybatis.entity.User"> update user <set> <if test="username != null and username != ''"> username=#{username}, </if> <if test="userEmail != null and userEmail != ''"> user_email=#{userEmail}, </if> <if test="userCity != null and userCity != ''"> user_city=#{userCity}, </if> <if test="age != null"> age=#{age} </if> </set> where id=#{id} </update>
public List<User> getUsersByIds(List<Integer> ids);
<!-- collection: 指定要遍历的集合 默认情况下 如果为Collection类型的,key为collection; 如果为List类型的,key为list 如果是数组类型,key为array 可以通过@Param("ids")来指定key item: 将当前遍历的元素赋值给指定的变量 open: 给遍历的结果添加一个开始字符 close: 给遍历的结果添加一个结束字符 separator: 每个元素之间的分隔符 --><select id="getUsersByIds" resultType="com.example.mybatis.entity.User"> select * from user where id in <foreach collection="list" item="id" open="(" close=")" separator=","> #{id} </foreach></select>
接口定义如下所示
public List<User> getUsersByIds(List<Integer> ids);
接口对应的 Mapper.xml 定义如下所示
<!-- collection: 指定要遍历的集合 默认情况下 如果为Collection类型的,key为collection; 如果为List类型的,key为list 如果是数组类型,key为array 可以通过@Param("ids")来指定key item: 将当前遍历的元素赋值给指定的变量 open: 给遍历的结果添加一个开始字符 close: 给遍历的结果添加一个结束字符 separator: 每个元素之间的分隔符 --><select id="getUsersByIds" resultType="com.example.mybatis.entity.User"> select * from user where id in <foreach collection="list" item="id" open="(" close=")" separator=","> #{id} </foreach></select>
用于批量插入
接口定义如下所示
public int addUserList(List<User> users);
接口对应的 Mapper.xml 定义如下所示
<insert id="addUserList" parameterType="com.example.mybatis.entity.User"> insert into user (username, user_email, user_city, age) values <foreach item="user" collection="list" separator=","> (#{user.username}, #{user.userEmail}, #{user.userCity}, #{user.age}) </foreach></insert><!--返回自增主键--><insert id="addUserList" parameterType="com.example.mybatis.entity.User" useGeneratedKeys="true" keyProperty="id"> insert into user (username, user_email, user_city, age) values <foreach item="user" collection="list" separator=","> (#{user.username}, #{user.userEmail}, #{user.userCity}, #{user.age}) </foreach></insert><!--还可以这样写--><!-- 这种方式需要数据库连接属性设置allowMultiQueries=true 这种分号分隔多个SQL还可以用于其他的批量操作,如修改、删除 --><insert id="addUserList" parameterType="com.example.mybatis.entity.User"> <foreach item="user" collection="list" separator=";"> insert into user (username, user_email, user_city, age) values (#{user.username}, #{user.userEmail}, #{user.userCity}, #{user.age}) </foreach></insert><!--如果是Oracle数据库,则需要这样写--><insert id="addUserList" parameterType="com.example.mybatis.entity.User"> <foreach item="user" open="begin" close="end;" collection="list"> insert into user (username, user_email, user_city, age) values (#{user.username}, #{user.userEmail}, #{user.userCity}, #{user.age}); </foreach></insert>
위 내용은 MyBatis 동적 SQL 알아보기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!