** ๐ 4.1๋จ๊ณ: , , , ์ค์ต โ ์กฐ๊ฑด ์กฐํฉ ๊ฒ์ ๊ธฐ๋ฅ **
(๐ StudentMapper1.xml
ํ์ฅ / DTO: main.Student
๊ธฐ๋ฐ)
๐ฏ ํ์ต ๋ชฉํ
ํญ๋ชฉ |
์ค๋ช
|
๋ชฉ์ |
์ฌ์ฉ์๊ฐ ์
๋ ฅํ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ ๋์ ์ผ๋ก WHERE์ ์ ๊ตฌ์ฑ |
ํต์ฌ ํ๊ทธ |
<if> , <choose> , <where> , <trim> |
์กฐ๊ฑด ์์ |
์ฑ(๊น), ํ๋
(1~4), ์ ํ๋ฒํธ ํฌํจ ์ฌ๋ถ |
โ
1. ์ ์ : ๊ฒ์ ์กฐ๊ฑด DTO ์ค๊ณ
โ ์ด๋ฏธ ์ฌ์ฉ ์ค์ธ main.Student
๋ฅผ ๊ทธ๋๋ก ํ์ฉํ ์ ์์ด.
Student s = new Student();
s.setIrum("๊น"); // ์ฑ์ผ๋ก ์์ํ๋ ์ด๋ฆ
s.setGrade(1); // 1ํ๋
s.setPhone("010"); // "010" ํฌํจ๋ ์ ํ๋ฒํธ
โ
2. ๋งคํผ XML ๋์ SQL ์ ์ ์์
<select id="searchStudentDynamic" parameterType="main.Student" resultType="main.Student">
SELECT * FROM student
<where>
<if test="irum != null and irum != ''">
irum LIKE CONCAT(#{irum}, '%')
</if>
<if test="grade != null">
AND grade = #{grade}
</if>
<if test="phone != null and phone != ''">
AND phone LIKE CONCAT('%', #{phone}, '%')
</if>
</where>
</select>
โ
3. ํ๊ทธ๋ณ ์ค๋ช
์์ฝ
ํ๊ทธ |
์ค๋ช
|
์ฌ์ฉ ์์น |
<if test="์กฐ๊ฑด"> |
ํด๋น ์กฐ๊ฑด์ด true์ผ ๊ฒฝ์ฐ์๋ง SQL ํฌํจ |
WHERE, SET ์ |
<where> |
๋ด๋ถ ์กฐ๊ฑด์ด ์์ ๋ ์๋์ผ๋ก WHERE ์ถ๊ฐ, AND/OR ์๋ ์ ๋ฆฌ |
SELECT, DELETE |
<trim prefix="SET" suffixOverrides=","> |
UPDATE ๊ตฌ๋ฌธ ๋ฑ์์ ๋ง์ง๋ง ์ผํ ์ ๊ฑฐ |
UPDATE |
<choose> , <when> , <otherwise> |
if-else์ฒ๋ผ ํ๋๋ง ์ ํ |
๋์ ์กฐ๊ฑด ๋ถ๊ธฐ |
โ
4. Java ํธ์ถ ์์ (๋์ ์กฐ๊ฑด ๊ตฌ์ฑ)
Student s = new Student();
s.setIrum("๊น"); // ์ฑ์ด '๊น'์ผ๋ก ์์
s.setGrade(1); // 1ํ๋
๋ง
// s.setPhone("010"); // ์๋ตํ๋ฉด ์กฐ๊ฑด์ ํฌํจ๋์ง ์์
List<Student> result = session.selectList("student.searchStudentDynamic", s);
for (Student stu : result) {
System.out.println(stu.getHakbun() + " / " + stu.getIrum());
}
โ
5. SQL ๋ก๊ทธ ์์ (log4j)
Preparing: SELECT * FROM student WHERE irum LIKE ? AND grade = ?
Parameters: ๊น(String), 1(Integer)
โ
6. ๋์ ์กฐ๊ฑด ์กฐ๋ฆฝ ์ ์ฃผ์์ฌํญ
ํญ๋ชฉ |
๋ฌธ์ |
ํด๊ฒฐ ๋ฐฉ๋ฒ |
์ฒซ ์กฐ๊ฑด์ด ์์ผ๋ฉด AND ๊ฐ ์์ ์ด |
๊ตฌ๋ฌธ ์ค๋ฅ ๋ฐ์ |
<where> ์ฌ์ฉ ์ ์๋ ์ ๋ฆฌ๋จ |
๋ง์ง๋ง ์ผํ๊ฐ ๋จ๋ ๊ฒฝ์ฐ (SET ) |
๊ตฌ๋ฌธ ์ค๋ฅ ๋ฐ์ |
<trim suffixOverrides=","> ๋ก ์ ๊ฑฐ |
์ฌ๋ฌ ์กฐ๊ฑด ์ค ํ๋๋ง ์ฌ์ฉํ๊ณ ์ถ์ ๋ |
if ์ค๋ณต ์ฌ์ฉ |
<choose> ๋ก ๋จ์ผ ์ ํ ๋ถ๊ธฐ ์ฒ๋ฆฌ |
โ
์ค์ต ์ฒดํฌ๋ฆฌ์คํธ
ํญ๋ชฉ |
ํ์ธ |
XML์ <where> , <if> ๊ฐ ์ ํํ ๊ตฌ์ฑ๋์ด ์๋๊ฐ |
โ
|
๋น ์กฐ๊ฑด์ WHERE์ ์ ํฌํจ๋์ง ์๋๊ฐ |
โ
|
์กฐ๊ฑด๋ณ๋ก SELECT ์ฟผ๋ฆฌ๊ฐ ๋์ ์ผ๋ก ์กฐ๋ฆฝ๋๋๊ฐ |
โ
|
log4j๋ก ์ค์ ์คํ๋ SQL์ ํ์ธํ๋๊ฐ |
โ
|
โ
ํ์ฅ ์ค์ต ์์ด๋์ด
๊ธฐ๋ฅ |
๋ฐฉ๋ฒ |
ํ๋
๋๋ ์ฃผ์๋ก ์กฐ๊ฑด ๊ฒ์ |
<if> ์ถ๊ฐ |
์ฑ๋ณ(์ฃผ๋ฏผ๋ฒํธ 8๋ฒ์งธ ์๋ฆฌ) ์ ํ ๋ถ๊ธฐ |
<choose> ์ฌ์ฉ |
์ ํ๋ฒํธ ๋์๋ฆฌ๊ฐ ํน์ ๋ฒํธ |
LIKE CONCAT('%', #{phoneTail}) |
โ
4.2๋จ๊ณ: ์ฌ์ฉ โ ๋ค์ค ํ๋ฒ ์กฐํ ์ค์ต
(๐ StudentMapper1.xml
ํ์ฅ)
๐ฏ ํ์ต ๋ชฉํ
ํญ๋ชฉ |
์ค๋ช
|
๋ชฉ์ |
์ฌ๋ฌ ๊ฐ์ ํ๋ฒ์ ํ ๋ฒ์ ์กฐํ (IN ์กฐ๊ฑด) |
ํต์ฌ ํ๊ทธ |
<foreach> |
์ค์ต ๋์ |
List<Integer> , int[] , List<Student> ๋ฑ ์ ๋ฌ๋ฐ์ ๋ฆฌ์คํธ ์ฒ๋ฆฌ |
โ
1. ๋งคํผ XML ์์: ๋ค์ค ํ๋ฒ ์กฐํ (IN ์กฐ๊ฑด)
<!-- โ
id: Java ์ฝ๋์์ ์ด SQL์ ํธ์ถํ ๋ ์ฌ์ฉํ ์ด๋ฆ -->
<!-- โ
parameterType="list": Java์์ List<Integer> ํํ๋ก ๊ฐ์ ์ ๋ฌ๋ฐ์ -->
<!-- โ
resultType="main.Student": ๊ฒฐ๊ณผ๋ Student ๊ฐ์ฒด๋ก ์๋ ๋งคํ๋จ -->
<select id="getStudentsByHakbunList" parameterType="list" resultType="main.Student">
<!-- โ
์ ์ฒด SQL์ ์์ -->
SELECT * FROM student
WHERE hakbun IN
<!-- โ
<foreach>: List ์์ ๊ฐ๋ค์ ํ๋์ฉ ๊บผ๋ด์ ๋ฐ๋ณต ์ถ๋ ฅํด์ฃผ๋ ํ๊ทธ -->
<!-- โ
item="id": ๋ฐ๋ณต๋ฌธ์์ ์ฌ์ฉํ ๋ณ์๋ช
(list์์ ๊บผ๋ธ ๊ฐ ์์๋ฅผ id๋ผ๊ณ ๋ถ๋ฆ) -->
<!-- โ
collection="list": Java์์ ๋๊ฒจ์ค List์ ์ด๋ฆ (๋ณดํต ๊ทธ๋ฅ list๋ก ์) -->
<!-- โ
open="(" / close=")": ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋ง๋ค์ด์ง ๊ฒฐ๊ณผ ์๋ค์ ๊ดํธ ๋ถ์ -->
<!-- โ
separator=",": ์์ ์ฌ์ด๋ง๋ค ,(์ผํ)๋ฅผ ์๋์ผ๋ก ๋ถ์ฌ์ค -->
<!-- โ
๊ฒฐ๊ณผ์ ์ผ๋ก (101, 102, 103) ๊ฐ์ SQL ์กฐ๊ฑด์ด ์์ฑ๋จ -->
<foreach item="id" collection="list" open="(" separator="," close=")">
#{id}
<!-- โ
#{id}๋ ํ๋์ฉ ๊บผ๋ธ ๊ฐ์ ์ค์ SQL์ ๋ฐ์ธ๋ฉํจ (PreparedStatement๋ก ์ฒ๋ฆฌ๋จ) -->
</foreach>
</select>
์์ฑ |
์ค๋ช
|
collection="list" |
Java์์ ์ ๋ฌ๋ฐ๋ ๋ฆฌ์คํธ (List ๋๋ ๋ฐฐ์ด) |
item="id" |
๋ฃจํ ๋ด์์ ์ฌ์ฉ๋ ๋ณ์๋ช
|
open="(" , close=")" |
IN ์ ๊ดํธ ์ฒ๋ฆฌ |
separator="," |
ํญ๋ชฉ ๊ตฌ๋ถ์ (์ผํ) |
โ
2. Java ํธ์ถ ์ฝ๋ ์์
java
๋ณต์ฌํธ์ง
List<Integer> hakbunList = Arrays.asList(1001, 1002, 1003);
List<Student> list = session.selectList("student.getStudentsByHakbunList", hakbunList);
for (Student s : list) {
System.out.println(s.getHakbun() + " / " + s.getIrum());
}
โ
3. ๋ก๊ทธ ์ถ๋ ฅ ์์ (log4j ์ค์ ์)
sql
๋ณต์ฌํธ์ง
Preparing: SELECT * FROM student WHERE hakbun IN (?, ?, ?)
Parameters: 1001(Integer), 1002(Integer), 1003(Integer)
โ
4. ๋ค๋ฅธ collection ์ ํ ์ง์
Java ์ ๋ฌ๊ฐ |
parameterType |
collection ๊ฐ |
List<Integer> |
list |
collection="list" |
int[] |
array |
collection="array" |
Map<String, List<Integer>> |
map |
collection="mapKey" |
โ
5. ์ค์ต ์ฒดํฌ๋ฆฌ์คํธ
ํญ๋ชฉ |
์ค๋ช
|
ย |
XML์ <foreach> ๋ฌธ๋ฒ์ด ์ ํํ ์์ฑ๋์๋๊ฐ |
โ
|
ย |
๊ดํธ ๋ฐ ์ผํ ์ฒ๋ฆฌ (open/close/separator)๊ฐ ์ ํํ๊ฐ |
โ
|
ย |
์ ๋ฌํ ๋ฆฌ์คํธ๊ฐ ์ ๋งคํ๋๋๊ฐ (#{id} ) |
โ
|
ย |
๋ก๊ทธ์์ IN (?, ?, ?) ํ์์ผ๋ก ์ถ๋ ฅ๋๋๊ฐ |
โ
|
ย |
โ
ํ์ฅ ์ค์ต ์์ด๋์ด
๊ธฐ๋ฅ |
์ค๋ช
|
๋ค์ค ํ๋ฒ ์ญ์ |
DELETE FROM student WHERE hakbun IN <foreach> ... |
๋ค์ค ์ด๋ฆ ๊ฒ์ |
WHERE irum IN <foreach> |
์ฌ๋ฌ ์กฐ๊ฑด์ <foreach> ๋ก ์กฐํฉ |
grade IN (...) + hakgwa IN (...) |
๐ง ์ค๋ฌด ํ
<foreach>
๋ ๊ผญ open=
, close=
, separator=
๋ฅผ ์จ์ ๊ตฌ๋ฌธ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํด์ผ ํด
- ์ ๋ฌ๋๋ ๋ฆฌ์คํธ๊ฐ
null
์ด๋ฉด ์คํ ์ NPE ๋๋ SQL ์ค๋ฅ ๋ฐ์ โ ์ฌ์ null ์ฒดํฌ ํ์
collection
์ด๋ฆ์ list
, array
, mapKey
๋ฑ ์ํฉ์ ๋ง๊ฒ ์ง์ ํด์ผ ํจ
โ
4.3๋จ๊ณ: ๋์ INSERT โ null/๋น๊ฐ ์ ์ธํ๊ณ INSERT ์ฒ๋ฆฌ
(๐ StudentMapper1.xml
ํ์ฅ / DTO: main.Student
๊ธฐ์ค)
๐ฏ ํ์ต ๋ชฉํ
ํญ๋ชฉ |
์ค๋ช
|
๋ชฉ์ |
๊ฐ์ด ์๋ ํ๋๋ง INSERT ๋๋๋ก ์ ์ฐํ SQL ์์ฑ |
ํต์ฌ ํ๊ทธ |
<trim> , <if> |
์ฌ์ฉ ์ํฉ |
INSERT ์ null ํ๋๋ ์ ์ธํ๊ณ INSERT ์ํํ๊ณ ์ถ์ ๋ |
โ
1. ๋งคํผ XML โ ๋์ INSERT ์์
<insert id="insertStudentDynamic" parameterType="main.Student">
INSERT INTO student
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="hakbun != null">hakbun,</if>
<if test="irum != null and irum != ''">irum,</if>
<if test="hakgwa != null">hakgwa,</if>
<if test="addr != null">addr,</if>
<if test="phone != null">phone,</if>
<if test="jumin != null">jumin,</if>
<if test="grade != null">grade,</if>
</trim>
VALUES
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="hakbun != null">#{hakbun},</if>
<if test="irum != null and irum != ''">#{irum},</if>
<if test="hakgwa != null">#{hakgwa},</if>
<if test="addr != null">#{addr},</if>
<if test="phone != null">#{phone},</if>
<if test="jumin != null">#{jumin},</if>
<if test="grade != null">#{grade},</if>
</trim>
</insert>
โ
2. Java ํธ์ถ ์ฝ๋ ์์
Student s = new Student();
s.setHakbun(2027);
s.setIrum("๋ฐ์๋น");
s.setHakgwa("AIํ๊ณผ");
// ์ฃผ์์ ์ฃผ๋ฏผ๋ฒํธ๋ ์
๋ ฅํ์ง ์์ (null)
int result = session.insert("student.insertStudentDynamic", s);
session.commit();
System.out.println("์
๋ ฅ ๊ฒฐ๊ณผ: " + result);
โ
์ ์ฝ๋ ์คํ ์, addr
, jumin
์ INSERT ๊ตฌ๋ฌธ์์ ์๋์ผ๋ก ์ ์ธ๋จ
โ
log4j๋ฅผ ํตํด SQL ๋ก๊ทธ์์ ๋์ ์ผ๋ก ๊ตฌ์ฑ๋ INSERT ๋ฌธ ํ์ธ ๊ฐ๋ฅ
โ
3. ๋ก๊ทธ ์ถ๋ ฅ ์์ (log4j ์ค์ ์)
==> Preparing: INSERT INTO student (hakbun, irum, hakgwa) VALUES (?, ?, ?)
==> Parameters: 2027(Integer), ๋ฐ์๋น(String), AIํ๊ณผ(String)
โ
4. ํ๊ทธ๋ณ ๊ธฐ๋ฅ ์ค๋ช
์์ฝ
ํ๊ทธ |
์ค๋ช
|
<if test="..."> |
์กฐ๊ฑด์ ๋ง์กฑํ ๋๋ง ํด๋น SQL ์กฐ๊ฐ ์ฝ์
|
<trim> |
์ผํ(,) ์ ๊ฑฐ ์ฒ๋ฆฌ: suffixOverrides="," |
prefix/suffix |
( , ) ๋ฑ์ผ๋ก ์ฟผ๋ฆฌ ๊ดํธ ๊ฐ์ธ๊ธฐ |
โ
5. ์ค์ต ์ฒดํฌ๋ฆฌ์คํธ
ํญ๋ชฉ |
์ค๋ช
|
ํ์ธ |
null/๋น๊ฐ ํ๋๊ฐ ์๋์ผ๋ก ์ ์ธ๋๋๊ฐ |
โ
|
ย |
SQL ๊ตฌ๋ฌธ์ด ์ ํจํ ํํ๋ก ์กฐ๋ฆฝ๋๋๊ฐ |
โ
|
ย |
๋ง์ง๋ง ์ผํ๊ฐ ์๋์ผ๋ก ์ ๊ฑฐ๋๋๊ฐ |
โ
|
ย |
log4j๋ก ์ค์ SQL ์กฐํฉ ํ์ธํ๋๊ฐ |
โ
|
ย |
๋๋ฝ๋ ํ๋๋ DB์ null ๋ก ์ ์ฅ๋๋๊ฐ (๊ธฐ๋ณธ๊ฐ ์์ ์) |
โ
|
ย |
โ
ํ์ฅ ์ค์ต ์์ด๋์ด
๊ธฐ๋ฅ |
์ค๋ช
|
ํ์๊ฐ๋ง ๋์ INSERT + ์ ํ ํ๋๋ง if ์ฒ๋ฆฌ |
hakbun , irum ์ ํ์, ๋๋จธ์ง๋ optional |
์ ํจ์ฑ ๊ฒ์ฌ ์ถ๊ฐ |
null์ด๊ฑฐ๋ ๊ณต๋ฐฑ์ผ ๊ฒฝ์ฐ insert ์ ์ธ |
๋์ INSERT + ์๋ ํค ๋ฐํ (4.4๋จ๊ณ) |
useGeneratedKeys="true" ์ ์ฉ ๊ฐ๋ฅ |
๐ง ์ค๋ฌด ํ
- ๋ฐ๋์
suffixOverrides=","
๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด SQL ๋ฌธ๋ฒ ์ค๋ฅ ๋ฐ์ ๊ฐ๋ฅ
insert
ํ commit()
์ ์์ผ๋ฉด DB์ ๋ฐ์๋์ง ์์
- log4j ์ค์ ์ผ๋ก ๋์ SQL ์กฐ๋ฆฝ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๋ ์ต๊ด ์ค์
โ
4.4๋จ๊ณ: SQL ์ฌ์ฌ์ฉ โ + ์ค์ต
(๐ StudentMapper1.xml
๊ธฐ์ค / DTO: main.Student
)
๐ฏ ํ์ต ๋ชฉํ
ํญ๋ชฉ |
์ค๋ช
|
๋ชฉ์ |
๋ฐ๋ณต๋๋ SELECT ์ปฌ๋ผ, WHERE ์กฐ๊ฑด์ ํ ๊ณณ์ ์ ์ํ๊ณ ์ฌ์ฌ์ฉ |
์ฃผ์ ํ๊ทธ |
<sql> , <include> |
๊ธฐ๋ ํจ๊ณผ |
์ฝ๋ ์ค๋ณต ์ ๊ฑฐ, ์ ์ง๋ณด์ ํธ์์ฑ ํฅ์ |
โ
1. ๊ณตํต SELECT ์ปฌ๋ผ ์ ์ (๊ธฐ๋ณธ ํ๋์
)
๐ง StudentMapper1.xml
์๋จ์ ์ถ๊ฐ:
<sql id="studentBaseColumns">
hakbun, irum, hakgwa, addr, phone, jumin, grade
</sql>
โ
์ด ์ปฌ๋ผ์
์ SELECT๋ฌธ์์ ๋ฐ๋ณตํด์ ์ฐ๋ ๋ถ๋ถ์ ์ฌ์ฌ์ฉํ๊ธฐ ์ํจ์ด์ผ.
โ
2. ๊ณตํต WHERE ์กฐ๊ฑด ์ ์ (๋์ ์กฐ๊ฑด ์กฐ๋ฆฝ)
<sql id="dynamicStudentWhere">
<where>
<if test="irum != null and irum != ''">
irum LIKE CONCAT(#{irum}, '%')
</if>
<if test="grade != null">
AND grade = #{grade}
</if>
<if test="phone != null and phone != ''">
AND phone LIKE CONCAT('%', #{phone}, '%')
</if>
</where>
</sql>
โ
๊ณตํต ๊ฒ์ ์กฐ๊ฑด์ ์ ์ํ์ฌ ์ฌ๋ฌ SELECT ๋ฌธ์์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํด.
โ
3. ์ค์ SELECT ๋ฌธ์์ <include>
๋ก ์ฌ์ฌ์ฉํ๊ธฐ
<select id="searchStudentReusable" parameterType="main.Student" resultType="main.Student">
SELECT
<include refid="studentBaseColumns"/>
FROM student
<include refid="dynamicStudentWhere"/>
</select>
โ
4. Java ํธ์ถ ์ฝ๋ ์์
Student s = new Student();
s.setIrum("๊น"); // '๊น'์ผ๋ก ์์ํ๋ ์ด๋ฆ
s.setGrade(2); // 2ํ๋
๋ง
List<Student> list = session.selectList("student.searchStudentReusable", s);
for (Student stu : list) {
System.out.println(stu.getHakbun() + " / " + stu.getIrum());
}
โ
5. SQL ๋ก๊ทธ ์์ (log4j ์ถ๋ ฅ)
==> Preparing: SELECT hakbun, irum, hakgwa, addr, phone, jumin, grade FROM student WHERE irum LIKE ? AND grade = ?
==> Parameters: ๊น(String), 2(Integer)
โ
6. ์ค์ต ์ฒดํฌ๋ฆฌ์คํธ
ํญ๋ชฉ |
์ค๋ช
|
์ฒดํฌ |
<sql id="..."> ๋ก ๊ณตํต ๋ธ๋ก์ ์ ์ํ๋๊ฐ |
โ
|
ย |
<include refid="..."/> ๋ก ๋ถ๋ฌ์ค๊ณ ์๋๊ฐ |
โ
|
ย |
์ปฌ๋ผ ๋ฆฌ์คํธ ๋ฐ ์กฐ๊ฑด์ด ๋ฐ๋ณต๋์ง ์๊ณ ํ ๊ณณ์ ๊ด๋ฆฌ๋๋๊ฐ |
โ
|
ย |
log4j ์ถ๋ ฅ์ผ๋ก SQL ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๋๊ฐ |
โ
|
ย |
โ
์ค๋ฌด ํ
ํญ๋ชฉ |
ํ |
์ปฌ๋ผ์ด ๋ง๊ณ ์ฌ๋ฌ ๋งคํผ์ ๊ณตํต์ด๋ฉด |
BaseColumns ๋ฅผ ๋ณ๋์ xml๋ก ๋ถ๋ฆฌ ๊ฐ๋ฅ (๊ณ ๊ธ) |
์ฌ๋ฌ ๊ฒ์ ์กฐ๊ฑด์ด ์ ์ฌํ ๊ฒฝ์ฐ |
๊ณตํต WHERE์ ์ <sql> ๋ก ๊ด๋ฆฌํด๋๋ฉด ๋งค์ฐ ํธ๋ฆฌ |
<sql> ์์์๋ ๋ค๋ฅธ <sql> ์ค์ฒฉ ๋ถ๊ฐ |
์กฐ๋ฆฝ์ <include> ๋ก๋ง ๊ฐ๋ฅ |
โ
์์ ๊ตฌ์กฐ ์ ๋ฆฌ (์์ฝ์ฉ)
<sql id="studentBaseColumns">
hakbun, irum, hakgwa, addr, phone, jumin, grade
</sql>
<sql id="dynamicStudentWhere">
<where>
<if test="...">...</if>
</where>
</sql>
<select id="searchStudentReusable" ...>
SELECT <include refid="studentBaseColumns"/>
FROM student
<include refid="dynamicStudentWhere"/>
</select>