シーン:
データベース開発にJDBCまたは他の同様のフレームワークを使用する場合、通常、必要に応じて手動でSQLをアセンブルする必要があります。考えるのは非常に苦痛であり、Mybatisフレームワークによって提供されるSQLステートメントの動的アセンブルの機能は次のようになります。非常に便利です。この問題の良い解決策です。
概要:
動的SQLはMyBatisフレームワークの強力な機能です。MyBatis3は強力なOGNLベースの式を使用して、動的SQLを完成させることができます。以前のバージョンで理解する必要のある要素のほとんどを削除し、元のバージョンの半分未満で完成させることができます。要素。必要な作業。
SQL要素:
SQL要素 | 説明する |
---|---|
<if> | 単一の条件付き分岐判断に使用される判断ステートメント |
<choose>(<when>、<otherwise>) | 多条件分岐判断に使用される、Javaのswitch ... case...defaultステートメントに相当します |
<どこ> | SQLステートメントのどこの条件付き判断を簡素化する |
<トリム> | 冗長なキーワードを柔軟に削除できます |
<セット> | 動的更新ステートメントの解決 |
<foreach> | ループステートメント。ステートメントなどの列挙条件でよく使用されます。 |
<バインド> | OGNL式から変数を作成し、それをコンテキストにバインドします。これは、SQLでファジークエリに一般的に使用されます。 |
<if>:
動的SQLを使用するための最も一般的なシナリオは、条件に基づいてwhere句の一部を含めることです。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.mapper.BookMapper">
<resultMap id="BookType" type="org.example.po.Book">
<id property="id" column="id"></id>
<result property="bookName" column="bookName"></result>
<result property="price" column="price"></result>
<result property="publisher" column="publisher"></result>
</resultMap>
<select id="bookSelectById" parameterType="int" resultMap="BookType">
select * from t_book
<where>
<if test="id!=null and id!=''">
id=#{id}
</if>
</where>
</select>
<select id="bookSelectByname" parameterType="string" resultMap="BookType">
select * from t_book
<where>
<if test="bookNmae!=null and bookName!=''">
bookName LIKE concat('%',#{bookName},'%')
</if>
</where>
</select>
</mapper>
<選択>:
すべての条件を使用するのではなく、複数の条件の1つを使用したい場合があります。この状況では、MyBatisはchoose要素を提供します。これは、Javaのswitchステートメントに少し似ています。
クエリを1つ書いたので、公式Webサイトのコードを引用しました。
<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>
<どこ>:
<where>タグはwhere1= 1と同等です。これは、主にSQLステートメントのwhere条件の判断を簡素化するために使用され、冗長なキーワードによって引き起こされる構文エラーを心配することなく、インテリジェントに処理できます。コード参照<if>タグコード。
<トリム>:
このタグが最も柔軟だと思います。trim要素は、タグに戻り値があるかどうかも自動的に識別します。戻り値がある場合は、含まれているコンテンツにプレフィックスまたはサフィックスを追加します(最初に、 )、使用されるプロパティは
1. プレフィックス(プレフィックス)、サフィックス(サフィックス)
コンテンツの最初または最後のコンテンツを含むシンボルを削除することもできます。使用される属性は次のとおりです。
2 、prefixOverride(プレフィックスカバレッジ)、 suffixOverride(サフィックスカバレッジ)
この関数は非常に強力であり、where要素を置き換えてwhere要素と同じ効果を実現するために使用できると言えます。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.mapper.BookMapper">
<resultMap id="BookType" type="org.example.po.Book">
<id property="id" column="id"></id>
<result property="bookName" column="bookName"></result>
<result property="price" column="price"></result>
<result property="publisher" column="publisher"></result>
</resultMap>
<update id="bookUpdate" parameterType="book">
UPDATE t_book
<trim prefix="set" suffixOverrides=",">
<if test="bookName!=null and bookName!=''">bookName=#{bookName},</if>
<if test="price!=null and price!=''">price=#{price},</if>
<if test="publisher!=null and publisher!=''">publisher=#{publisher}</if>
WHERE id=#{id}
</trim>
</update>
</mapper>
<セット>:
set要素は主に更新操作に使用されます。その主な機能はwhere要素の機能と似ています。主に包含ステートメントの前にセットを入力します。包含ステートメントがコンマで終わる場合、括弧は自動的に無視されます。また、if要素を使用して、変更が必要なフィールドを動的に更新できます。フィールドを変更する必要がない場合、フィールドは更新できなくなります。
上記のコードを次のように変更します。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.mapper.BookMapper">
<resultMap id="BookType" type="org.example.po.Book">
<id property="id" column="id"></id>
<result property="bookName" column="bookName"></result>
<result property="price" column="price"></result>
<result property="publisher" column="publisher"></result>
</resultMap>
<update id="bookUpdate" parameterType="book">
UPDATE t_book
<!-- <trim prefix="set" suffixOverrides=",">-->
<!-- <if test="bookName!=null and bookName!=''">bookName=#{bookName},</if>-->
<!-- <if test="price!=null and price!=''">price=#{price},</if>-->
<!-- <if test="publisher!=null and publisher!=''">publisher=#{publisher}</if>-->
<!-- WHERE id=#{id}-->
<!-- </trim>-->
<set>
<if test="bookName!=null and bookName!=''">bookName=#{bookName},</if>
<if test="price!=null and price!=''">price=#{price},</if>
<if test="publisher!=null and publisher!=''">publisher=#{publisher},</if>
</set>
WHERE id=#{id}
</update>
</mapper>
<foreach>:
foreach要素は通常、in条件ステートメントを作成するときに使用され、次のように使用されます。
(1) 。item:反復時の各要素のエイリアスを表します。
(2) 。index:反復プロセスの各反復の位置を示す名前を指定します
(3) 。open:ステートメントが何で始まるかを示します(inステートメントは "(")で始まります)
(4) 。separator:上記の記号が繰り返されるたびに区切り記号として使用されることを示します(inステートメントは区切り記号として「、」を使用します)
(5) 。close:ステートメントの終わりを示します(inステートメントは ")"で終わります)
(注:このopen、separator、およびcloseは基本的に固定形式です)
(6)。 コレクション:最も重要でエラーが発生しやすいプロパティを示し、特別な注意が必要です。この属性を指定する必要があります。この属性の値は、場合によって異なります。主に次の3つの場合があります。
1)入力パラメーターが単一パラメーターで、パラメーター・タイプがリストの場合、コレクション属性の値はリストです。
2)。入力パラメーターが単一パラメーターで、パラメータータイプが配列の場合、コレクション属性値は配列です。
3)入力パラメータがマルチパラメータの場合、処理のためにマップとしてカプセル化する必要があります
フォーマット:
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
<where>
<foreach item="item" index="id" collection="list"
open="ID in (" separator="," close=")" nullable="true">
#{item}
</foreach>
</where>
</select>
<バインド>:
bind要素は通常、ファジークエリを必要とするステートメントで使用されます。bind要素はpattern_usernameという名前の変数を定義するために使用され、valueの属性値は連結されたクエリ文字列です。ここで、_parameter.getTitle()は渡されたパラメーターを表します。(または、ユーザー名などの対応するパラメーター変数名を直接書き込みます)。
<select id="selectBlogsLike" resultType="Blog">
<bind name="pattern_username" value="'%' + _parameter.getTitle() + '%'" />
SELECT * FROM BLOG
WHERE title LIKE #{pattern}
</select>