I.はじめに
前回の記事、私たちはMyBatisの共通リレーショナル・マッピングを導入し、本論文は、プロジェクトの記事は、動的SQLでMyBatisの一般的な使用方法についての合計、構造ここからプロジェクトに基づいて行われますhttps://gitee.com/weixiaohuai/springboot -mybatis.gitダウンロード。私は、上記述べ、SQL文の非常に柔軟なアセンブリすることができ、痛み、MyBatisの動的SQLは、状況に良い解決策になることができますなど、スプライシングSQLを決定するための様々な条件に遭遇した、私たち以前に無用MyBatisのを信じて、余分なカンマを削除する必要があります開発効率を向上させます。
第二に、動的SQL
MyBatisの動的SQLは、ラベルの多くを上げるなど、設定、トリミング、foreachのは、SQLは、など、のは1つのラベルによってそれぞれ1つの使用を説明させた場合、選択し、かのように:
[A]ラベルの場合
一般的に条件を継ぐために使用される判決文では、このようなフィルタ条件としていくつかのシナリオに満たされています。
(1)マッパーインターフェース:
/**
* if
*/
List<Map<String, Object>> testIf(@Param("sid") Integer sid, @Param("sname") String sname);
(2)マッパーマッピングファイル:
<!--if-->
<select id="testIf" resultType="java.util.Map">
select *
from tbl_student t
where 1 = 1
<if test="sid != null and sid != ''">
and t.s_id = #{sid}
</if>
<if test="sname != null and sname != ''">
and t.s_name = #{sname}
</if>
</select>
(3)テストケース:
@Test
public void testIf() {
List<Map<String, Object>> list1 = studentMapper.testIf(null, "学生5");
for (Map<String, Object> map : list1) {
System.out.println(map);
}
List<Map<String, Object>> list2 = studentMapper.testIf(1, "");
for (Map<String, Object> map : list2) {
System.out.println(map);
}
List<Map<String, Object>> list3 = studentMapper.testIf(2, "学生2");
for (Map<String, Object> map : list3) {
System.out.println(map);
}
}
(4)試験結果:
[B]ラベルを選択してください
もし同じように機能し、/それ以外のサブタブを備えています。
(1)マッパーインターフェース:
/**
* choose
*/
List<Map<String, Object>> testChoose(@Param("sid") Integer sid, @Param("sname") String sname);
(2)マッパーマッピングファイル:
<!--choose(when/otherwise)-->
<select id="testChoose" resultType="java.util.Map">
select *
from tbl_student t
where 1 = 1
<choose>
<when test="sid != null and sid != ''">
and t.s_id = #{sid}
</when>
<when test="sname != null and sname != ''">
and t.s_name = #{sname}
</when>
<otherwise>
and t.s_id in (1,2)
</otherwise>
</choose>
</select>
(3)テストケース:
@Test
public void testChoose() {
List<Map<String, Object>> list1 = studentMapper.testChoose(null, "学生5");
for (Map<String, Object> map : list1) {
System.out.println(map);
}
List<Map<String, Object>> list2 = studentMapper.testChoose(1, "");
for (Map<String, Object> map : list2) {
System.out.println(map);
}
List<Map<String, Object>> list3 = studentMapper.testChoose(2, "学生2");
for (Map<String, Object> map : list3) {
System.out.println(map);
}
List<Map<String, Object>> list4 = studentMapper.testChoose(null, null);
for (Map<String, Object> map : list4) {
System.out.println(map);
}
}
(4)試験結果:
[C]標識
(1)マッパーインターフェース:
/**
* where
*/
List<Map<String, Object>> testWhere01(@Param("sid") Integer sid, @Param("sname") String sname);
List<Map<String, Object>> testWhere02(@Param("sid") Integer sid, @Param("sname") String sname);
(2)マッパーマッピングファイル:
<select id="testWhere01" resultType="map">
/*假设只有第二个条件满足,此时sql: select * from tbl_student t where and t.s_name = 'xxx' 明显不正确
此时,可以使用where标签来帮助我们去掉多余的and
*/
select *
from tbl_student t
where
<if test="sid != null and sid != ''">
t.s_id = #{sid}
</if>
<if test="sname != null and sname != ''">
and t.s_name = #{sname}
</if>
</select>
<!--where-->
<select id="testWhere02" resultType="map">
select *
from tbl_student t
<where>
<if test="sid != null and sid != ''">
and t.s_id = #{sid}
</if>
<if test="sname != null and sname != ''">
and t.s_name = #{sname}
</if>
</where>
</select>
(3)テストケース:
@Test
public void testWhere01() {
List<Map<String, Object>> list1 = studentMapper.testWhere01(null, "学生5");
for (Map<String, Object> map : list1) {
System.out.println(map);
}
}
@Test
public void testWhere02() {
List<Map<String, Object>> list1 = studentMapper.testWhere02(null, "学生5");
for (Map<String, Object> map : list1) {
System.out.println(map);
}
List<Map<String, Object>> list2 = studentMapper.testWhere02(1, "");
for (Map<String, Object> map : list2) {
System.out.println(map);
}
List<Map<String, Object>> list3 = studentMapper.testWhere02(2, "学生2");
for (Map<String, Object> map : list3) {
System.out.println(map);
}
List<Map<String, Object>> list4 = studentMapper.testWhere02(null, null);
for (Map<String, Object> map : list4) {
System.out.println(map);
}
}
(4)試験結果:
[D]セットタグ
あなたは自動的に「」余分なコンマSQLを削除することができます
(1)マッパーインターフェース:
/**
* set
*/
Integer testSet(@Param("sid") Integer sid, @Param("sname") String sname);
(2)マッパーマッピングファイル:
<!--set-->
<!--
set标签: 可以自动去除sql中的多余的逗号‘,’
-->
<update id="testSet">
update tbl_student t
/*此时执行的sql为: update tbl_student t SET s_name = ? WHERE s_id = ? */
<set>
<if test="sname != null and sname != ''">
s_name = #{sname},
</if>
</set>
<where>
s_id = #{sid}
</where>
</update>
(3)テストケース:
@Test
public void testSet() {
studentMapper.testSet(1, "zhangsan");
List<Map<String, Object>> list = studentMapper.testWhere01(1, null);
for (Map<String, Object> map : list) {
System.out.println(map);
}
}
(4)試験結果:
[E]トリムタブ
、SQL文は、一般的に過剰とキーワードを削除するために使用されるカンマを、またはスプライシングSQL文の前に「どこで」、「セット」と「値(」らの接頭辞、または追加「)」の接尾辞:タグをトリミングします。
接頭辞:へSQL文スプライシングプレフィックス
prefixOverrides:SQL文の始まりは「AND」、トリムタブは「AND」が削除されます場合は、プロパティは「AND」として指定されていると仮定して、SQL文のキーワードや文字の前を削除する
SQLステートメントに:接尾辞をスプライシングサフィックス
suffixOverrides:SQL文の次取り除くキーワードや文字
(1)マッパーインターフェース:
/**
* 使用trim实现where同样功能
*/
List<Map<String, Object>> testTrimWhere(@Param("sid") Integer sid, @Param("sname") String sname);
/**
* 使用trim实现set同样功能
*/
Integer testSetTrim(@Param("sid") Integer sid, @Param("sname") String sname);
(2)マッパーマッピングファイル:
<!--使用trim实现where等价的功能-->
<select id="testTrimWhere" resultType="map">
select *
from tbl_student t
/*
trim标签: 一般用于去除sql语句中多余的and关键字,逗号,或者给sql语句前拼接 “where“、“set“以及“values(“ 等前缀,或者添加“)“等后缀
prefix: 给sql语句拼接的前缀
prefixOverrides: 去除sql语句前面的关键字或者字符,假设该属性指定为”AND”,当sql语句的开头为”AND”,trim标签将会去除该”AND”
suffix: 给sql语句拼接的后缀
suffixOverrides: 去除sql语句后面的关键字或者字符
*/
<trim prefix="where" prefixOverrides="and | or">
<if test="sid != null and sid != ''">
and t.s_id = #{sid}
</if>
<if test="sname != null and sname != ''">
and t.s_name = #{sname}
</if>
</trim>
</select>
<!--使用trim实现set同样的功能-->
<update id="testSetTrim">
update tbl_student t
<trim prefixOverrides="," prefix="set" suffixOverrides=",">
<if test="sname != null and sname != ''">
,s_name = #{sname},
</if>
</trim>
<where>
s_id = #{sid}
</where>
</update>
(3)テストケース:
@Test
public void testTrimWhere() {
List<Map<String, Object>> list1 = studentMapper.testTrimWhere(null, "学生5");
for (Map<String, Object> map : list1) {
System.out.println(map);
}
List<Map<String, Object>> list2 = studentMapper.testTrimWhere(1, "");
for (Map<String, Object> map : list2) {
System.out.println(map);
}
List<Map<String, Object>> list3 = studentMapper.testTrimWhere(2, "学生2");
for (Map<String, Object> map : list3) {
System.out.println(map);
}
List<Map<String, Object>> list4 = studentMapper.testTrimWhere(null, null);
for (Map<String, Object> map : list4) {
System.out.println(map);
}
}
@Test
public void testSetTrim() {
studentMapper.testSetTrim(1, "zhangsan2");
List<Map<String, Object>> list = studentMapper.testWhere01(1, null);
for (Map<String, Object> map : list) {
System.out.println(map);
}
}
(4)試験結果:
[F]のforeachタグ
foreachのタグ:主に、条件での反復のセットを構築する際に使用されます。
アイテム:別名反復の各セットを表す要素
インデックスは:反復プロセスを表現するために名前を指定し、位置に各反復、
オープン:ステートメントを開始することを示しているものを、
セパレータ:区切り文字としてどのシンボルを表し、各繰り返しの間、
クローズ:何が終わりで表現されます。
(1)マッパーインターフェース:
/**
* foreach
*/
List<Map<String, Object>> testForEach(@Param("pkids") List<Integer> pkids);
(2)マッパーマッピングファイル:
<!--foreach-->
<select id="testForEach" resultType="map">
select * from tbl_student t
where 1 = 1
and t.s_id in
/*
foreach标签:主要用在构建in条件中,迭代一个集合
item: 表示集合中每一个元素进行迭代时的别名,
index: 指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,
open: 表示该语句以什么开始,
separator: 表示在每次进行迭代之间以什么符号作为分隔符,
close: 表示以什么结束。
*/
<foreach collection="pkids" open="(" close=")" separator="," index="index" item="pkid">
#{pkid}
</foreach>
</select>
(3)テストケース:
@Test
public void testForEach() {
List<Map<String, Object>> list = studentMapper.testForEach(Arrays.asList(1, 2, 3, 4, 5));
for (Map<String, Object> map : list) {
System.out.println(map);
}
}
(4)試験結果:
[G] SQLタグ
SQLフラグメント:事前に定義されたいくつかのそのSQL文。だから、他のSQLを直接使用することが必要なとき
ID:SQLは一意使用フラグメントを識別するを参照して、SQL断片取り込まれた標識に必要とされる<=「student_columnは」/ REFID挙げ>。
単一のフィールドの使用は表のSQL内で定義されていることを確認し、高い再利用性
(1)マッパーインターフェース:
/**
* sql
*/
List<Map<String, Object>> testSql();
(2)マッパーマッピングファイル:
<!--sql-->
<!--
sql片段:就是预先定义后的一些sql语句。等其他sql需要的时候直接拿来用
id : sql片段的唯一标识,在需要引用sql片段的时候使用 <include refid="student_column"/> 标签引入即可
尽量使用单表的字段来定义sql片段,重用性高
-->
<sql id="student_column">
s_id,
s_name
</sql>
<select id="testSql" resultType="map">
select
<include refid="student_column"/>
from tbl_student
</select>
(3)テストケース:
@Test
public void testSql() {
List<Map<String, Object>> list = studentMapper.testSql();
for (Map<String, Object> map : list) {
System.out.println(map);
}
}
(4)試験結果:
第三に、要約
これらは、知識と動的SQLの詳細MyBatisの部分の若干の使用、これが唯一のいくつかの洞察と教訓は、私が学んで助けたい、著者の上で学習されています。