MyBatis

My-Batis


MyBatis๋ž€?

Mybatis๋Š” ์ž๋ฐ” ์˜ค๋ธŒ์ ํŠธ์™€ SQL์‚ฌ์ด์˜ ์ž๋™ ๋งคํ•‘ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” ORM(Object relational Mapping)ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค.

SQL์„ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•ด์„œ ๊ด€๋ฆฌํ•˜๊ฒŒ ํ•ด์ค€๋‹ค. Hibernate๋‚˜ JAP(Java Persistence Api)์ฒ˜๋Ÿผ ์ƒˆ๋กœ์šด DBํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์ตํ˜€์•ผํ•˜๋Š” ๋ถ€๋‹ด ์—†์ด SQL์„ ๊ทธ๋Œ€๋กœ ์ด์šฉํ•˜๋ฉด์„œ
JDBC์ฝ”๋“œ ์ž‘์„ฑ์˜ ๋ถˆํŽธํ•จ๋„ ์ œ๊ฑฐํ•ด์ฃผ๊ณ  ๋„๋ฉ”์ธ ๊ฐ์ฒด๋‚˜ VO๊ฐ์ฒด๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค

java ์—์„œ mybatis ๋ฅผ ์‚ฌ์šฉํ•œ ๋…๋ฆฝ์ ์ธ DB์ ‘๊ทผ ํด๋ž˜์Šค ๊ฐœ๋ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.

  • ์ž๋ฐ”์—์„œ ์ œ๊ณตํ•˜๋Š” JDBC๋ฅผ ๋ณด๋‹ค ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ
  • SQL ์ฟผ๋ฆฌ๋ฌธ์„ ์ฝ”๋“œ ๋‚ด์—์„œ ์“ฐ์ง€ ์•Š๊ณ  Mapper ํŒŒ์ผ์—์„œ ๊ด€๋ฆฌํ•จ์œผ๋กœ์จ ์ฝ”๋“œ์™€ SQL ์ฟผ๋ฆฌ๋ฅผ ๋ถ„๋ฆฌ
  • SQL ์ฟผ๋ฆฌ ์ˆ˜์ • ์‹œ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜์ง€ ์•Š์•„๋„ ๋ผ ์œ ์ง€๋ณด์ˆ˜ ์‹œ ์•ˆ์ •์„ฑ์„ ๋†’์ž„
  • ์ฝ”๋“œ๋ฅผ ๊ฐ„์†Œํ™”ํ•˜์—ฌ ๊ฐ€์‹œ์„ฑ์„ ๋†’์—ฌ์คŒ

Spring-FrameWork์—์„œ ๋˜ํ•œ JDBC๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ My-Batis๊ฐ€ ์ฝ”๋“œ๋ฅผ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ
์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด My-Batis๋ฅผ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

์‰ฝ๊ฒŒ ๋งํ•˜์ž๋ฉด DB์™€ ์—ฐ๊ฒฐํ•˜๋Š” Connection๊ณผ sql์„ ์ž‘์„ฑํ•˜๋Š” ๋ถ€๋ถ„์„ mybatis์—์„œ ๋‚˜๋ˆ  ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

์•„ํŒŒ์น˜ ํ†ฐ์ผ“์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ibatis๋กœ ์‹œ์ž‘ํ•ด์„œ 3.0๋ฒ„์ ผ๋ถ€ํ„ฐ MyBatis๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋…๋ฆฝํ–ˆ๋‹ค.

Spring-FrameWork๋Š” Open-Source๋กœ ๋‹ค๋ฅธ FrameWork๋ฅผ ํ™•์žฅํ•˜์—ฌ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

MyBatis ์„ค์น˜


MyBatis ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์šด๋ฐ›์•„ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.

https://blog.mybatis.org/ ์˜ ์‚ฌ์ดํŠธ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‹ค์šด๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ•œ๊ธ€๋กœ ๋ฒˆ์—ญ๋œ https://mybatis.org/mybatis-3/ko/index.html๋„ ์žˆ๋‹ค.

MyBatis ์—ฐ๋™


MyBatis์˜ ํ•ต์‹ฌ MetaDate๋กœ DB์˜ ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ๋‹ด์€ config.xml์„ ์‚ฌ์šฉํ•˜์—ฌ Connection์„ ํ•œ๋‹ค.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
 		 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 		"http://mybatis.org/dtd/mybatis-3-config.dtd">
  						
<!--	
	mybatis-config.xml :: MyBatis Framework ์˜ ํ•ต์‹ฌ MetaData ๋กœ ์•„๋ž˜์˜ ์„ค์ •
	- properties ๊ด€๋ฆฌ : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ์‹œ ๊ณตํ†ต๋ถ€๋ถ„, ๊ฐ ํ™˜๊ฒฝ๋ณ„ ๋‹ค๋ฅธ ๊ฐ’๋“ค์€ Properties
	                           ํŒŒ์ผ์— ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌ.
	- ClassName ๊ด€๋ฆฌ : FQCN(Full Qualified Class Name) ์„ ๋ณ„์นญ(Alias)๊ด€๋ฆฌ
	- ๊ธฐํƒ€ ์„ค์ • : ํŠธ๋žœ์žญ์…˜์ฒ˜๋ฆฌ, ์ปค๋„ฅ์…˜ํ’€ ์„ค์ •, SQL ๋“ฑ ์—ฌ๋Ÿฌ ํ™˜๊ฒฝ์„ค์ •์„ ๋“ฑ๋ก,์„ค์ •...   
-->	  						

<!-- config.xml -->
<configuration>

  <properties resource="sql/jdbc.properties"/>
	
  <settings>
  <setting name="callSettersOnNulls" value="false"/>
  </settings>
	
  <typeAliases>
	<typeAlias alias="user" type="mybatis.service.domain.User"/>
  </typeAliases>

  <environments default="development">
  
    <environment id="development">
      <!-- Transaction Definition -->
      <transactionManager type="JDBC"/>
 	   <!-- javax.sql.DataSource Definition -->      
      <dataSource type="POOLED">
        <property name="driver"  value="oracle.jdbc.driver.OracleDriver"/>
        <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:xe"/>
        <property name="username"  value="ibatis"/>
        <property name="password" value="ibatis"/>
      </dataSource>
    </environment>
    
  </environments>

  <!-- SQL Definition :: file include -->
  <!-- ๊ฐ๊ฐ sql์— ๋งž๋Š” MetaData๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๊ฐœ๋ณ„์  ๋…๋ฆฝ ๊ฐœ๋ฐœ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ -->
  <mappers>
    <mapper resource="sql/UserMapper.xml"/>
    <mapper resource="sql/UserMapper01.xml"/>
    <mapper resource="sql/UserMapper02.xml"/>
    <mapper resource="sql/UserMapper03.xml"/>
    <mapper resource="sql/UserMapper04.xml"/>
    <mapper resource="sql/UserMapper05.xml"/>
    <mapper resource="sql/UserMapper06.xml"/>
    <mapper resource="sql/UserMapper07.xml"/>
    <mapper resource="sql/UserMapper08.xml"/>
    <mapper resource="sql/UserMapper09.xml"/>
    <mapper resource="sql/UserMapper10.xml"/>
  </mappers>
</configuration>
<?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">

<!--	
	UserMapper.xml :: SQL ๋ฅผ ๊ฐ–๋Š” MetaData 
	
	- MyBatis Framework ์€ XML MetaData ๋ฅผ ์‚ฌ์šฉ SQL๊ตฌ๋ฌธ์„ ๊ด€๋ฆฌ
	  (SQL์€ xml ์„ ํ†ตํ•ด ์ ์ ˆํžˆ ์บก์Аํ™” ๋˜์–ด ์• ํ”Œ๋ฆฌ์ผ€์ด์„  ์™ธ๋ถ€๋กœ ๋ถ„๋ฆฌํ•จ)
	- SQL๋ฌธ์˜ ์ž…๋ ฅ(?) / ์ถœ๋ ฅ(?)์„ ๋งคํ•‘ํ•œ๋‹ค.  <== ์•„๋ž˜์˜ select element ์ฐธ์กฐ
 -->		

<!-- UserMapper.xml -->			
<mapper namespace="UserMapper">

	<!-- ์œ„์˜  namespace ์ด์šฉ Application ์—์„œ UserMapper.~~ ๋กœ ์•„๋ž˜์˜ SQL ์„ ์ฐธ์กฐ  
	 	  :: ์•„๋ž˜์˜ query ์ˆ˜ํ–‰ ํ›„ ๊ฒฐ๊ณผ resultType ์— ์„ ์–ธ๋œ User Domain Object 
	 	   	  Field ( property )์— ์ž๋™์—ฐ๊ฒฐ(?,๋ฐ”์ธ๋”ฉ)
	 	  :: SQL / Query ์˜ Alias ์™€ User Domain Object ์˜ Field ์ด๋ฆ„ ๋™์ผํ•œ ๊ฒƒ ํ™•์ธ.  -->
  	
  	<select 	id="getUserList" 	resultType="mybatis.service.domain.User">
		SELECT
		user_id 			AS userId,
		user_name 	AS userName,
		password 		AS password,
		age 					AS age,
		grade				AS grade,
		reg_date 		AS regDate
		FROM users   											
  	</select>
  	
</mapper>

์œ„์™€ ๊ฐ™์ด ์‰ฝ๊ฒŒ sql์„ ๋‹ค๋ฃฐ์ค„ ์•ˆ๋‹ค๋ฉด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ MetaData๋กœ ๊ด€๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฟผ๋ฆฌ๋ฌธ ์ž‘์„ฑ


CRUD CRUD

ย  ๋œป SQL
C CREATE <select>
R READ <insert>
U UPDATE <update>
D DELETE <delete>

CRUD๋ชจ๋‘ ๊ฐ๊ฐ์— ๋งž๋Š” SQL ์ฟผ๋ฆฌ๋ฌธ์„ ์ž‘์„ฑํ•˜์—ฌ tag์•ˆ์— ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

CRUD ์†์„ฑ

์†์„ฑ ย 
id ์ฟผ๋ฆฌ๋ฌธ์˜ ์‹๋ณ„์ž
resultType select์‹œ ๊ฒฐ๊ณผ์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…
resultMap resultMap์œผ๋กœ ๋งตํ•‘๋œ ๋ฐ์ดํ„ฐ๋ฅผ select์‹œ ๊ฒฐ๊ณผ์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…
parameterType ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…

๋™์ SQL

MyBatis๋Š” ๋™์  sql๋กœ ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด ์ƒํ™ฉ์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ผ€์ด์Šค๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

ย  ย 
<if test=โ€์กฐ๊ฑดโ€>SQL</if> ์กฐ๊ฑด์ด ์ฐธ์ผ ๊ฒฝ์šฐ SQL๋ฌธ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
<choose>
<when test=โ€์กฐ๊ฑด1โ€>SQL</when>
<when test=โ€์กฐ๊ฑด2โ€>SQL</when>
<otherwise>SQL</otherwise>
<choose>
๊ฒ€์‚ฌํ•  ์กฐ๊ฑด์ด ์—ฌ๋Ÿฌ๊ฐœ์ผ ๊ฒฝ์šฐ ์‚ฌ์šฉ
์ž๋ฐ”์˜ switch๋ฌธ๊ณผ ์œ ์‚ฌํ•˜๋‹ค.
์ผ์น˜ํ•˜๋Š” ์กฐ๊ฑด์ด ์—†์œผ๋ฉด <otherwise>๋ฐ˜ํ™˜๋œ๋‹ค.
<where>
<if test=โ€์กฐ๊ฑด1โ€>SQL</if>
<if test=โ€์กฐ๊ฑด2โ€>SQL</if>
</where>
SQL๋ฌธ์˜ WHERE์ ˆ์„ ๋งŒ๋“ค๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
<where> ์•ˆ์˜ ์กฐ๊ฑด์‹์—์„œ ์ผ์น˜ํ•˜๋Š” ์กฐ๊ฑด์ด ์žˆ์œผ๋ฉด
WHERE์ ˆ์„ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•˜๊ณ  ์—†์œผ๋ฉด ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.
<trim prefix=โ€์ ‘๋‘์–ดโ€ prefixOverrides=โ€๋ฌธ์ž์—ด|๋ฌธ์ž์—ดโ€>
<if test=โ€์กฐ๊ฑด1โ€>SQL</if>
<if test=โ€์กฐ๊ฑด2โ€>SQL</if></trim>
prefix=โ€where(set)โ€ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ WHERE์™€ SET์„ ๊ตฌํ˜„
prefixOverrides์— ์ง€์ •๋œ ๋ฌธ์ž์—ด๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด์„
์ œ๊ฑฐํ•˜๊ณ  prefix๋กœ ์ง€์ •ํ•œ ์ ‘๋‘์–ด๋ฅผ ๋ถ™์ธ๋‹ค.
<set>
<if test=โ€์กฐ๊ฑด1โ€>SQL</if>
<if test=โ€์กฐ๊ฑด2โ€>SQL</if>
</set>
UPDATE๋ฌธ์˜ SET์ ˆ์„ ๋งŒ๋“ค๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
<set> ์•ˆ์˜ ์กฐ๊ฑด์‹์—์„œ ์ผ์น˜ํ•˜๋Š” ์กฐ๊ฑด์ด ์žˆ์œผ๋ฉด SET์ ˆ์„ ๋งŒ๋“ค์–ด
๋ฐ˜ํ™˜ํ•˜๊ณ  ์—†์œผ๋ฉด ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.
SET์ ˆ์˜ ํ•ญ๋ชฉ์ด ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ์ฝค๋งˆ(,)๋ฅผ ๋ถ™์ธ๋‹ค.
<foreach
item=โ€ํ•ญ๋ชฉโ€
index=โ€์ธ๋ฑ์Šคโ€
collection=โ€๋ชฉ๋กโ€
open=โ€์‹œ์ž‘๋ฌธ์ž์—ดโ€
close=โ€์ข…๋ฃŒ๋ฌธ์ž์—ดโ€
separator=โ€๊ตฌ๋ถ„์žโ€>
</foreach>
๋ชฉ๋กํ˜• ๋ฐ์ดํ„ฐ๋กœ SQL๋ฌธ์„ ๋งŒ๋“ค๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
ํŠนํžˆ IN(๊ฐ’, ๊ฐ’, โ€ฆ) ์กฐ๊ฑด์„ ๋งŒ๋“ค๋•Œ ํŽธ๋ฆฌํ•˜๋‹ค.
item : ํ•œ ๊ฐœ์˜ ํ•ญ๋ชฉ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ณ€์ˆ˜ ์ด๋ฆ„ ์ง€์ •
index : ์ธ๋ฑ์Šค ๊ฐ’์„ ๊บผ๋‚ผ๋•Œ ์‚ฌ์šฉํ•  ๋ณ€์ˆ˜ ์ด๋ฆ„ ์ง€์ •
collection : java.util.List ๊ตฌํ˜„์ฒด๋‚˜ ๋ฐฐ์—ด ๊ฐ์ฒด ์ง€์ •
open : ์ตœ์ข… ๋ฐ˜ํ™˜๊ฐ’์˜ ์ ‘๋‘์–ด ์ง€์ •
close : ์ตœ์ข… ๋ฐ˜ํ™˜๊ฐ’์˜ ์ ‘๋ฏธ์–ด ์ง€์ •
separator : ๊ตฌ๋ถ„์ž ๋ฌธ์ž์—ด ์ง€์ •
<bind name=โ€๋ณ€์ˆ˜๋ช…โ€ value=โ€๊ฐ’โ€/> ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ• ๋•Œ ์‚ฌ์šฉ

์ฐธ๊ณ : https://atoz-develop.tistory.com/entry/MyBatis-%EB%8F%99%EC%A0%81-SQL-choose%EC%99%80-set%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%EB%8F%99%EC%A0%81-SQL-%EB%A7%8C%EB%93%A4%EA%B8%B0

๊ทธ์™ธ ์•Œ์•„ ๋‘๋ฉด ์ข‹์€ Tag

ย  ย 
<sql id=โ€์‹๋ณ„์žโ€> ์ž์ฃผ์“ฐ์ด๋Š” sql๋ฌธ์„ ์ฝคํผ๋„ŒํŠธ ๋ชจ๋“ˆํ™”(?)ํ•˜์—ฌ ์žฌ์‚ฌ์šฉ์„ฑ์„ ์คŒ
<include refid=โ€sqlํƒœ๊ทธโ€> <sql>๋กœ ๋งŒ๋“ค์–ด๋‘” ์ฟผ๋ฆฌ๋ฌธ์„ ๋ถˆ๋Ÿฌ์˜ด

์˜ˆ์ œ

<?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="UserMapper10">

  	<resultMap id="userSelectMap" type="user">
  		<result property="userId" column="user_id" jdbcType="VARCHAR" />
  		<result property="userName" column="user_name" jdbcType="VARCHAR" />
  		<result property="password" column="password" jdbcType="VARCHAR" />
  		<result property="age" column="age" jdbcType="INTEGER" />
  		<result property="grade" column="grade" jdbcType="NUMERIC" />
  		<result property="regDate" column="regDate" jdbcType="DATE" />
  	</resultMap>
  	
   	<insert 	id="addUser" 	parameterType="user">
		INSERT
		INTO users(user_id, user_name, password,age, grade ,reg_date)
		VALUES( #{userId},
				#{userName},
				#{password},
				#{age:INTEGER},
				<if test="grade==0">null</if>
				<if test="grade!=0">#{grade}</if>,
				#{regDate:DATE})    											
  	</insert>
  	
  	<select id="getUser" parameterType="string" resultMap="userSelectMap">
  		SELECT
  		user_id	,user_name ,password ,age ,grade ,reg_date 
  		FROM users
  		WHERE user_id = #{value}
  	</select>
  	
  	<update id="updateUser" parameterType="user">
  		UPDATE users
  		<set>
  			<if test="userName != null">user_name = #{userName},</if>
  			<if test="password != null">password = #{password},</if>
  										age = #{age:INTEGER},
  										grade = <if test="grade == 0">null</if>
  												<if test="grade != 0">#{grade}</if>
  		</set>
  		WHERE user_id = #{userId}
  	</update>
  	
  	<delete id="removeUser" parameterType="java.lang.String">
  		DELETE
  		FROM users
  		WHERE user_id = #{value}
  	</delete>
  	 
  	<sql id="select-users">
  		SELECT
  		user_id , user_name , password , age , grade , reg_date
  		FROM users
  	</sql>
  	
  	<sql id="orderby-userId-desc">
  		ORDER BY user_id DESC
  	</sql>
  	
  	<select id="getUserList" parameterType="mybatis.service.domain.Search" resultMap="userSelectMap">
  		<include refid="select-users"/>
  		<where>
  			<choose>
  				<when test="searchCondition == 'userId'">
  					<if test="userId.size != 0">
						user_id IN
						<foreach item="value" collection="userId" open="(" separator="," close=")">
							#{value}
						</foreach>
  					</if>
  				</when>
  				<when test="searchCondition == 'userName'">
  					<if test="userName[0] != null">
						user_name IN
					<foreach item="value" collection="userName" open="(" separator="," close=")">
						#{value}
					</foreach>
  					</if>
  				</when>
  			</choose>
  			
  			<!-- trim ๊ณผ where ์‚ฌ์šฉ ๊ฐ€๋Šฅ 
  			<if test="searchCondition == 'userId'">
  				<if test="userId.size != 0">
					user_id IN
					<foreach item="value" collection="userId" open="(" separator="," close=")">
						#{value}
					</foreach>
  				</if>
  			</if>
  			<if test="searchCondition == 'userName'">
  				<if test="userName[0] != null">
					user_name IN
				<foreach item="value" collection="userName" open="(" separator="," close=")">
					#{value}
				</foreach>
  				</if>
  			</if>
  			 -->
		</where>
  		<include refid="orderby-userId-desc"/>
  	</select>
  	
</mapper>

Categories:

Updated:

Leave a comment