mybatis3.xx
SqlSessionFactory ๐ SqlSession ๊ฐ์ฒด ์์ฑ
SqlSessionFactoryBuilder ๐ ์ค์ ๐ SqlSessionFactory ๊ฐ์ฒด์์ฑ
public class DBConn {
private static SqlSessionFactory factory;
static{
try {
Reader reader = Resources.getResourceAsReader("configs/mybatis-config.xml"); //SqlSessionFactory ์ค์ XMLํ์ผ๊ฒฝ๋ก
factory = new SqlSessionFactoryBuilder().build(reader);
}catch(IOException e){
e.printStackTrace();
}
}
public static SqlSession getSession(boolean autoCommit){ //์ปค๋ฐ์ ์ ์ดํ ์์๋ ๋ฉ์๋
return factory.openSession(autoCommit); //๊ธฐ๋ณธ๊ฐ์ false์ด๊ธฐ ๋๋ฌธ์ ์ปค๋ฐํ์ง์๋๋ค.
}
public static SqlSession getSession(){ //๋ฐ๋ก ์ปค๋ฐ์ด ๋๋ ๋ฉ์๋
return factory.openSession(true);
}
}
๋ณ๊ฒฝ๋์ง์๋ ์ ์ ์ค์ ํ์ผ์ resources์ ์ ์ฅํด์ผํ๋ค.
XML์ค์ ํ์ผ์์ ์ง์ ํ๋ ๋ง์ด๋ฐํฐ์ค์ ํต์ฌ์ด ๋๋ ์ค์ ์ ํธ๋์ญ์ ์ ์ ์ดํ๊ธฐ ์ํ TransactionManager๊ณผ ํจ๊ป ๋ฐ์ดํฐ๋ฒ ์ด์ค Connection์ธ์คํด์ค๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํ DataSource ๋ฅผ ํฌํจํ๋ค.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mappers.MemberMapper"> <!--ํ์ฌํ์ผ๊ฒฝ๋ก-->
<resultMap id="memberMap" type="member.Member"> <!--๋ฉค๋ฒํด๋์ค์ ๋ณ์๋ช
์ map์ฒ๋ฆฌํ์ฌ ์ค๋ผํด๊ณผ ๋์ผํ๊ฒ๋ง๋ฌ-->
<result column="USER_NO" property="userNo" />
<result column="USER_ID" property="userId" />
<result column="USER_PW" property="userPw" />
<result column="USER_NM" property="userNm" />
<result column="MOBILE" property="mobile" />
<result column="REG_DT" property="regDt" />
<result column="MOD_DT" property="modDt" />
</resultMap>
<select id="getList" resultMap="memberMap"><!--ํด๋์ค๊ฒฝ๋ก or ๋งคํผ๋๋ณ์์ด๋ฆ-->
SELECT * FROM MEMBER
</select>
<!--
<insert>
</insert>
<update>
</update>
<delete>
</delete>
-->
</mapper>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mappers.MemberMapper"> <!--ํ์ฌํ์ผ๊ฒฝ๋ก-->
<select id="getList" resultType="member.Member"> <!--ํด๋์ค๊ฒฝ๋ก-->
SELECT * FROM MEMBER
</select>
<!--
<insert id="">
</insert>
<update id="">
</update>
<delete id="">
</delete>
-->
</mapper>
insert(...)delete(...)update(...)List<T> selctList(...)T selectOne(...)public class Member {
private long USER_NO;
private String USER_ID;
private String USER_PW;
private String USER_NM;
private String MOBILE;
private LocalDateTime REG_DT;
private LocalDateTime MOD_DT;
}
//์ค๋ผํด๊ณผ ๋ณ์๋ช
์ด ๋์ผํด์ผํ๋ค.
getMapper(Class class)
public class Ex01 {
@Test
void test1(){
SqlSession session = DBConn.getSession();
List<Member> members = session.selectList("mappers.MemberMapper.getList");
members.forEach(System.out::println);
}
@Test
void test2(){
SqlSession session = DBConn.getSession();
MemberMapper mapper = session.getMapper(MemberMapper.class);
//MemberMapper๊ณผ ๋์ผํ ์ด๋ฆ์ธ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ฑํ์ฌ getList์ ํตํด ๊ฐ์ ธ์ฌ์๋์๋ค.
List<Member> members = mapper.getList();
members.forEach(System.out::println);
}
}
//MemberMapper๊ณผ ๋์ผํ ์ด๋ฆ์ธ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ฑํ์ฌ getList์ ํด๋น ๋งคํผ๋ฅผ ๊ฐ์ ธ์ฌ์๋์๋ค.


@Select(...)
@Insert(...)
@Update(...)
@Delete(...)
//MemberMapper ์ธํฐํ์ด์ค
public interface MemberMapper {
List<Member> getList();
//๋ฉค๋ฒํด๋์ค์ ๋ณ์๋ช
๊ณผ ์ค๋ผํด์ ๋ณ์๋ช
์ด ๋ฌ๋ผ์ ์ค๋ผํด์ ๋ณ์๋ช
๊ณผ ๋๊ฐ์ด ํด์ผํ๊ธฐ๋๋ฌธ์ ๋ณ์นญ์ ์ฌ์ฉํ์ฌ ํํ
@Select("SELECT USER_NO userNo, USER_ID userId FROM MEMBER")
List<Member> getList2();
}
public class Ex01 {
@Test
void test3(){
SqlSession session = DBConn.getSession();
MemberMapper mapper = session.getMapper(MemberMapper.class);
List<Member> members = mapper.getList2();
members.forEach(System.out::println);
}
}
SLF4J
slf4j.api : slf4j ๊ฐ์ด๋๋ผ์ธ(์ธํฐํ์ด์ค ์์ฃผ) ๐ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๊ตฌํ(logback-class)์ด ํ์
logback-class : ๊ตฌํ์ฒด
๋ง์ด๋ฐํฐ์ค๋ ๋ด๋ถ ๋ก๊ทธ ํฉํ ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๊น ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค. ๋ด๋ถ ๋ก๊ทธ ํฉํ ๋ฆฌ๋ ๋ก๊น ์ ๋ณด๋ฅผ ๋ค๋ฅธ ๋ก๊ทธ ๊ตฌํ์ฒด ์ค ํ๋์ ์ ๋ฌํ๋ค.
slf4j.api, Logback Classic
implementation 'org.slf4j:slf4j-api:2.0.13' //slf4j.api
implementation 'ch.qos.logback:logback-classic:1.5.6'//Logback Classic Module
...
<settings>
<setting name="logImpl" value="SLF4J"/> <!--log์ค์ -->
</settings>
...
๋ก๊ทธ๋ ๋ฒจ : ๋ ๋ฒจ๋ณ๋ก ์ถ๋ ฅ๋๋ค.
FATAL : ERROR : WARN : ๊ฒฝ๊ณ (์ค๋ฅ โ, ๋ฌธ์ ์์ง๊ฐ ์๊ธธ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒฝ์ฐ)INFO : ์ผ๋ฐ์ ๋ณดDEBUG : ์์ธํ ์ ๋ณดTRACE : DEBUG๋ณด๋ค ๋ ์์ธํ ์ ๋ณด<pattern> : ๋ก๊ทธ ๊ธฐ๋ก ํจํด
%d : ๋ก๊ทธ ๊ธฐ๋ก ์์ (๋ ์ง, ์๊ฐ)%p : ๋ก๊ทธ ๋ ๋ฒจ, %5p ๐ 5๊ธ์๋ด์์ ๋ก๊ทธ๋ ๋ฒจ์ ํ๊ธฐ%t : ์ฐ๋ ๋%m : ๋ก๊ทธ ๋ฉ์ธ์ง%n : ์ค๊ฐฑ%c: ํจํค์ง๋ช
์ ํฌํจํ ์ ์ฒด ํด๋์ค๋ช
, %c{2} : ํจํค์ง๋ช
์ ํ ์๋ก ์ถ์ฝ, ํด๋์ค๋ช
์ ์ ์ฒด์ด๋ฆ<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%5level [%thread] - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO"><!--๋ก๊ทธ๋ ๋ฒจ-->
<appender-ref ref="stdout"/>
</root>
<logger name="mappers"> <!--๋งคํผ๊ฒฝ๋ก-->
<level value="DEBUG"/> <!--๋ก๊ทธ๋ ๋ฒจ-->
</logger>
</configuration>
(1) MemberMapper ์ธํฐํ์ด์ค
package mappers;
import member.Member;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface MemberMapper {
List<Member> getList();
@Select("SELECT USER_NO userNo, USER_ID userId FROM MEMBER")
List<Member> getList2();
int register(Member member);
int register2(Member member); //์ํ์ค ๊ฐ ๋ฃ๋๊ฑฐ
int modify(Member member);
int delete(String userId);
@Delete("DELETE FROM MEMBER WHERE USER_ID = #{userID}")
//๊ฐ๋จํ ์ฟผ๋ฆฌ๋ mappers.membermappe์ ์ ์ํ๊ธฐ๋ณด๋ค๋ ๋๊ณณ์ ์ ์ํ๊ธฐ๋ณด๋ค๋ ์ฌ๊ธฐ์ ์ ์ํ์ฌ ๋ฐ๋ก ์ฌ์ฉ
int delete2(String userId);
}
(2) member.mapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mappers.MemberMapper"> <!--ํ์ฌํ์ผ๊ฒฝ๋ก-->
<resultMap id="memberMap" type="member.Member"> <!--๋ฉค๋ฒํด๋์ค์ ๋ณ์๋ช
์ map์ฒ๋ฆฌํ์ฌ ์ค๋ผํด๊ณผ ๋์ผํ๊ฒ๋ง๋ฌ-->
<result column="USER_NO" property="userNo" />
<result column="USER_ID" property="userId" />
<result column="USER_PW" property="userPw" />
<result column="USER_NM" property="userNm" />
<result column="MOBILE" property="mobile" />
<result column="REG_DT" property="regDt" />
<result column="MOD_DT" property="modDt" />
</resultMap>
<select id="getList" resultMap="memberMap"><!--ํด๋์ค๊ฒฝ๋ก or ๋งคํผ๋๋ณ์์ด๋ฆ-->
SELECT * FROM MEMBER
</select>
<insert id="register">
INSERT INTO MEMBER (USER_NO, USER_ID, USER_PW, USER_NM, MOBILE)
VALUES (SEQ_MEMBER.NEXTVAL, #{userId}, #{userPw}, #{userNm}, #{mobile})
</insert>
<insert id="register2">
<selectKey keyProperty="userNo" order="BEFORE" resultType="long">
<!-- ์ํ์ค๊ฐ์ฒด์ ๊ฐ์ ๋ฃ์์ ์๊ฒํจ. insert์ฟผ๋ฆฌ๋ฅผ ์ํํ๊ธฐ ์ ์ ๋จผ์ ์ํํด์ผํ๊ธฐ ๋๋ฌธ์ BEFORE -->
SELECT SEQ_MEMBER.NEXTVAL FROM DUAL
</selectKey>
INSERT INTO MEMBER (USER_NO, USER_ID, USER_PW, USER_NM, MOBILE)
VALUES (#{userNo}, #{userId}, #{userPw}, #{userNm}, #{mobile})
<!-- SELECT SEQ_MEMBER.NEXTVAL FROM DUAL์ํตํด ๊ฐ์ ธ์จ ์ํ์ค๊ฐ์ userno์ ๋ฃ์ -->
</insert>
<update id="modify">
UPDATE MEMBER
SET
USER_PW = #{userPw},
USER_NM = #{userNm},
MOBILE = #{mobile},
MOD_DT = SYSDATE
WHERE USER_ID = #{userId}
</update>
<delete id="delete">
DELETE FROM MEMBER
WHERE USER_ID = #{userId}
</delete>
</mapper>
public class Ex02 {
private SqlSession session = DBConn.getSession();
@Test
void test1(){ //insert
MemberMapper mapper = session.getMapper(MemberMapper.class);
Member member = Member.builder()
.userId("USER" + System.currentTimeMillis())
.userPw("123456").
userNm("์ฌ์ฉ์..").
mobile("01000000000").
build();//๋น๋ํจํด ์ฌ์ฉ
//int cnt = mapper.register(member);
//int cnt = session.insert("mappers.MemberMapper.register", member);
int cnt = mapper.register2(member);
System.out.println(cnt);
System.out.println(member);
}
@Test
void test2(){ //update
MemberMapper mapper = session.getMapper(MemberMapper.class);
Member member = Member.builder()
.userId("USER01")
.userPw("123456").
userNm("(์์ )์ฌ์ฉ์..").
mobile("01000000000").
build();//๋น๋ํจํด ์ฌ์ฉ
int cnt = mapper.modify(member);
//int cnt = session.update("mappers.MemberMapper.modify", member);
System.out.println(cnt);
}
@Test
void test3(){
Member member = Member.builder()
.userId("USER01")
.build();
int cnt = session.delete("mappers.MemberMapper.delete",member);
System.out.println(cnt);
}
@Test
void test4(){
MemberMapper mapper = session.getMapper(MemberMapper.class);
int cnt = mapper.delete("USER02");
int cnt2 = mapper.delete2("USER03");
System.out.println(cnt);
System.out.println(cnt2);
}
}
<update id="modify2"> <!--๋์ SQL-->
UPDATE MEMBER
SET
<if test="userPw != null"> <!--๋์ SQL-->
USER_PW = #{userPw},
</if>
<if test="userNm != null"> <!--๋์ SQL-->
USER_PW = #{userNm},
</if>
<if test="mobile != null"> <!--๋์ SQL-->
MOBILE = #{mobile},
</if>
MOD_DT = SYSDATE
WHERE USER_ID = #{userId}
</update>
trim
<trim..>
prefix = "WHERE" : trim ํ๊ทธ ๋ด๋ถ์ ์ ํจํ ์กฐ๊ฑด์์ด ํ๋๋ผ๋ ์์ผ๋ฉด ์ถ๋ ฅ
suffix
prefixOverrides = "AND | OR" : ๊ฐ์ฅ ์์ชฝ์ ๋์ ์๋ (WHERE ๋ฐ๋ก ๋ค ) AND ๋
๋ OR์ ๊ฑฐ
suffixOverrides="," : ๋ง์ง๋ง","๋ ์ ๊ฑฐ
</trim>
<select id="getList3" resultMap="memberMap">
SELECT * FROM MEMBER
<trim prefix="WHERE" prefixOverrides="AND | OR">
<if test="userId != null">
USER_ID = #{userId}
</if>
<if test="userNm != null">
AND USER_NM LIKE #{userNm}
</if>
<if test="mobile != null">
AND MOBILE LIKE #{mobile}
</if>
</trim>
</select>
package exam01;
import configs.DBConn;
import mappers.MemberMapper;
import member.Member;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;
import java.util.List;
public class Ex03 {
private SqlSession session = DBConn.getSession();
@Test
void test2(){
MemberMapper mapper = session.getMapper(MemberMapper.class);
Member member = Member.builder()
//.userId("USER99")
.userNm("%์ฌ์ฉ%")
.mobile("%010%")
.build();
List<Member> members = mapper.getList3(member);
members.forEach(System.out::println);
}
}
where
<where>
</where>
<select id="getList3" resultMap="memberMap">
SELECT * FROM MEMBER
<where>
<if test="userId != null">
USER_ID = #{userId}
</if>
<if test="userNm != null">
AND USER_NM LIKE #{userNm}
</if>
<if test="mobile != null">
AND MOBILE LIKE #{mobile}
</if>
</where>
</select>
set
<update id="modify2"> <!--๋์ SQL-->
UPDATE MEMBER
<set>
<if test="userPw != null"> <!--๋์ SQL-->
USER_PW = #{userPw},
</if>
<if test="userNm != null"> <!--๋์ SQL-->
USER_PW = #{userNm},
</if>
<if test="mobile != null"> <!--๋์ SQL-->
MOBILE = #{mobile},
</if>
MOD_DT = SYSDATE
</set>
WHERE USER_ID = #{userId}
</update>
<select id="getList4" resultMap="memberMap">
SELECT * FROM MEMBER
<where>
<foreach item="item" index="index" collection="list" open="USER_ID IN (" close=")" separator=",">
#{item}
</foreach>
</where>
</select>
USER_NM LIKE 'ํค์๋%' : ์ฌ์ฉ์๋ช
์ด ํค์๋๋ก ์์ํ๋ ํจํด
USER_NM LIKE '%ํค์๋' : ์ฌ์ฉ์๋ช
์ด ํค์๋๋ก ๋๋๋ ํจํด
USER_NM LIKE '%ํค์๋%' : ์ฌ์ฉ์๋ช
์ด ํค์๋๋ฅผ ํฌํจํ๋ ํจํด
_parameter : MemberMapper์ธํฐํ์ด์ค๋ฅผ ๊ฐ๋ฅดํจ๋ค*
<<select id="getList3" resultMap="memberMap">
<bind name="P_userNm" value="'%' + _parameter.getUserNm() + '%'" />
<!-- '_parameter'์ MemberMapper์ธํฐํ์ด์ค๋ฅผ ๊ฐ๋ฅดํจ๋ค.-->
<bind name="P_mobile" value="'%' + _parameter.getMobile() + '%'" />
SELECT * FROM MEMBER
<where>
<if test="userId != null">
USER_ID = #{userId}
</if>
<if test="userNm != null">
AND USER_NM LIKE #{P_userNm}
</if>
<if test="mobile != null">
AND MOBILE LIKE #{P_mobile}
</if>
</where>
</select>
</select>
<![CDATA[]]<select id = "getList5">
SELECT * FROM MEMBER WHERE
<![CDATA[USER_NO > #{userNo}
]]>
</select>