Mybatisが使用する動的SQL文


Mybatisが使用する動的SQL文
 
一:紹介
 
        Mybatis動的SQL文は、必要に応じてSQL文を動的に接続するのに役立ちます.主にプロファイルにラベルを使用して実装されます.
 
二:具体的な使い方
 
       2.1 where
 
              2.1.1機能
              文の役割は主にSQL文の中のwhereの中の条件判断を簡略化することであり、where要素の役割はwhere要素を書き込む場所で1つのwhereを出力することであり、もう1つの利点はwhere要素の中の条件出力がどのようなものかを考慮する必要がなく、MyBatisは知能的に処理してくれ、もしすべての条件が満たさなければMyBatisはすべての記録を検出することができます.出力後がandの先頭であれば、MyBatisは最初のandを無視し、もちろんorの先頭であれば、MyBatisも無視します.また、where要素ではスペースの問題を考慮する必要はありません.MyBatisはスマートに追加します.
 
              2.1.2マッピングファイルの構成:
    <select id="getBlogByConditionDynamic" resultMap="oneToManyNested">
        select t1.id blog_id, t1.title, t2.id post_id, t2.section
        from blog t1 left outer join post t2 on t1.id = t2.blog_id
        <where>
            <if test="title != null and title !=''">
                and t1.title like '%'||#{title}||'%'
            </if>
            <if test="section != null and section != ''">
                and t2.section like '%'||#{section}||'%'
            </if>
        </where>
    </select>
              2.1.3インタフェースのマッピング方法:
    List<Blog> getBlogByConditionDynamic(@Param("title") String title, @Param("section") String section);
              2.1.4試験方法:
 
    @Test
    public void testGetBlogByConditionDynamic() throws Exception {
        List<Blog> blogList = blogMapper.getBlogByConditionDynamic("", "section");
        Assert.assertNotNull(blogList);
    }
       3.1 if
 
              3.1.1機能
              簡単な条件判断はif文を用いていくつかの簡単な条件選択を実現することができる.判断はつなぎ合わせ、そうでなければ無視する.
              3.1.2マッピングファイルの構成:
    <select id="getBlogDynamic" resultMap="oneToManyNested">
        select t1.id blog_id, t1.title, t2.id post_id, t2.section
        from blog t1 left outer join post t2 on t1.id = t2.blog_id where 1=1
        <if test="title != null and title !=''">
            and t1.title like '%'||#{title}||'%'
        </if>
        <if test="section != null and section != ''">
            and t2.section like '%'||#{section}||'%'
        </if>
    </select>
              3.1.3インタフェースのマッピング方法:
    List<Blog> getBlogDynamic(@Param("title") String title, @Param("section") String section);
              3.1.4試験方法:
public class BlogMapperTest {

    private BlogMapper blogMapper;

    public BlogMapperTest() {
        blogMapper = MybatisUtil.getSqlSession().getMapper(BlogMapper.class);
    }

    @Test
    public void testGetBlogDynamic() throws Exception {
        List<Blog> blogList = blogMapper.getBlogDynamic("title", "section");
        Assert.assertNotNull(blogList);
    }

              
             
       4.1 choose
        4.1.1機能
              choose要素の役割はJAVAのswitch文に相当し、基本的にJSTLのchooseの役割や使い方と同じで、通常はwhenやotherwiseと組み合わせられています.when要素はwhenの中の条件が満たされたときにその中の内容を出力することを表し、JAVAの中のswitchの効果とあまり差がないのは条件の順序に従って、whenの中で条件が満たされたとき、chooseを飛び出して、つまりすべてのwhenとotherwiseの条件の中で、1つだけ出力して、すべての私が条件が満たされていないときにotherwiseの中の内容を出力します.
              4.1.2マッピングファイルの構成:
    <select id="getBlogByTitleOrSection" resultMap="oneToManyNested">
        select t1.id blog_id, t1.title, t2.id post_id, t2.section
        from blog t1 left outer join post t2 on t1.id = t2.blog_id where 1=1
        <choose>
            <when test="title != null and title !=''">
                and t1.title like '%'||#{title}||'%'
            </when>
            <when test="section != null and section != ''">
                and t2.section like '%'||#{section}||'%'
            </when>
            <otherwise>
                and t1.title is not null and t2.section is not null
            </otherwise>
        </choose>
    </select>
              4.1.3インタフェースのマッピング方法:
    List<Blog> getBlogByTitleOrSection(@Param("title") String title, @Param("section") String section);
              4.1.4試験方法:
 
    @Test
    public void testGetBlogByTitleOrSection() throws Exception {
        List<Blog> blogList = blogMapper.getBlogByTitleOrSection("", "");
        Assert.assertNotNull(blogList);
    }
              5.1 set
 
                     5.1.1機能
                     set要素は主に更新操作に用いられるが、その主な機能とwhere要素は実は差が少なく、主に含まれる文の前にsetを出力し、含まれる文がカンマで終わるとカンマを無視し、setに含まれる内容が空であるとエラーになる.set要素があれば、変更したフィールドを動的に更新することができます.
                     5.1.2マッピングファイルの構成:
    <update id="updateBlogTitleSet" parameterType="blog">
        update blog
        <set>
            <if test="title != null and title != ''">
                 title = #{title}
            </if>
            <if test="id != null and id != ''">
                , id = #{id}
            </if>
        </set>
        where id = #{id}
    </update>
                     5.1.3インタフェースのマッピング方法:
    int updateBlogTitleSet(Blog blog);
                     5.1.4試験方法:
 
    @Test
    public void testUpdateBlogTitleSet() throws Exception {
        Blog blog = new Blog(1, "");
        int flag = this.blogMapper.updateBlogTitleSet(blog);
        Assert.assertEquals(true, flag > 0);
    }
       6.1 trim
 
                     6.1.1機能
                     trim要素の主な機能は、自分が含むコンテンツの前にいくつかの接頭辞を付けることができ、その後にいくつかの接尾辞を付けることができ、それに対応する属性はprefixとsuffixである.コンテンツを含む最初のコンテンツを上書きすることもできます.すなわち、無視することもできます.最後のコンテンツを上書きすることもできます.対応する属性はprefixOverridesとsuffixOverridesです.trimにはこのような機能があるだけに、where要素の代わりにtrimを非常に簡単に利用することもできます.
                     6.1.2マッピングファイルの構成:
    <select id="getBlogByConditionDynamicTrim" resultMap="oneToManyNested">
        select t1.id blog_id, t1.title, t2.id post_id, t2.section
        from blog t1 left outer join post t2 on t1.id = t2.blog_id
        <trim prefix="where" prefixOverrides="and | or">
            <if test="title != null and title !=''">
                and t1.title like '%'||#{title}||'%'
            </if>
            <if test="section != null and section != ''">
                and t2.section like '%'||#{section}||'%'
            </if>
        </trim>
    </select>
                     6.1.3インタフェースのマッピング方法:
    List<Blog> getBlogByConditionDynamicTrim(@Param("title") String title, @Param("section") String section);
                     6.1.4試験方法:
 
    @Test
    public void testGetBlogByConditionDynamicTrim() throws Exception {
        List<Blog> blogList = blogMapper.getBlogByConditionDynamicTrim("title", "section");
        Assert.assertNotNull(blogList);
    }
       7.1 foreach
 
              7.1.1機能
foreachは主にin条件の構築に用いられ、SQL文で1つのセットを反復することができます.foreach要素の属性は主にitem,index,collection,open,separator,closeである.itemはセット内の各要素が反復するときの別名を表し、indexは反復中に反復するたびに反復する位置を表す名前を指定し、openは文がどのように始まるかを表し、separatorは反復するたびにどのような記号を区切りとして、closeはどのように終わるかを表します.foreachを使用する場合、最も重要なのはcollectionプロパティです.このプロパティは指定する必要がありますが、場合によっては値が異なります.主に3つのケースがあります.
単一パラメータでパラメータタイプがリストの場合collection属性値はlist
単一パラメータでパラメータタイプがarray配列である場合、collectionのプロパティ値はarrayです.
入力されたパラメータが複数の場合、私たちはそれらを1つのMapにカプセル化する必要があります.もちろん、単一のパラメータもmapにカプセル化することができます.実際にパラメータを入力するとき、MyBatisの中でもそれをMapにカプセル化することができます.mapのkeyはパラメータ名です.だからこのときcollection属性値は、入ってきたListやarrayオブジェクトが自分でカプセル化したmapの中にあるkeyです
 Arrayを例にとると、
              7.1.2マッピングファイルの構成:
	<select id="dynamicForeach2Test" resultType="Blog">
		select * from t_blog where id in
		<foreach collection="array" index="index" item="item" open="(" separator="," close=")">
			#{item}
		</foreach>
	</select>
              7.1.3インタフェースのマッピング方法:
public List<Blog> dynamicForeach2Test(int[] ids);
              7.1.4試験方法:
	@Test
	public void dynamicForeach2Test() {
		SqlSession session = MybatisUtil.getSqlSessionFactory().openSession();
		BlogMapper blogMapper = session.getMapper(BlogMapper.class);
		int[] ids = new int[] {1,3,6,9};
		List<Blog> blogs = blogMapper.dynamicForeach2Test(ids);
	}

三:補充
        詳細:Mybatisディレクトリ
        githubアドレス:https://github.com/andyChenHuaYing/scattered-items/tree/master/items-mybatis         ソースのダウンロードアドレス:http://download.csdn.net/detail/chenghuaying/8713311