Search
Duplicate

Mybatis

Mybatis

๋งˆ์ด๋ฐ”ํ‹ฐ์Šค๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง€์ •ํ•œ SQL, ์ €์žฅํ”„๋กœ์‹œ์ € ๊ทธ๋ฆฌ๊ณ  ๋ช‡๊ฐ€์ง€ ๊ณ ๊ธ‰ ๋งคํ•‘์„ ์ง€์›ํ•˜๋Š” ํผ์‹œ์Šคํ„ด์Šค ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค.

Mybatis ๊ณต์‹ ์‚ฌ์ดํŠธ

ํผ์‹œ์Šคํ„ด์Šค ํ”„๋ ˆ์ž„์›Œํฌ

ํผ์‹œ์Šคํ„ด์Šค ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ์ถ”์ƒํ™”ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๋Š” SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๋Š” ๋Œ€์‹  ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Mybatis๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง€์ •ํ•œ SQL, ์ €์žฅํ”„๋กœ์‹œ์ €, ๊ทธ๋ฆฌ๊ณ  ๋ช‡ ๊ฐ€์ง€ ๊ณ ๊ธ‰ ๋งคํ•‘์„ ์ง€์›ํ•˜๋Š” ํผ์‹œ์Šคํ„ด์Šค ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.

SQL Mapper

Mybatis๋Š” SQL Mapper ํ˜•ํƒœ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” SQL ๋ฌธ์žฅ์ด๋‚˜ ์ €์žฅํ”„๋กœ์‹œ์ €๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๊ณ , Mybatis๋Š” ์ด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ „๋‹ฌํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋งคํ•‘ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์„ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ์ง์ ‘์ ์ธ SQL ์ž‘์„ฑ์— ๋Œ€ํ•œ ์œ ์—ฐ์„ฑ๊ณผ ์ œ์–ด๋ ฅ์„ ๊ฐ€์ง€๋ฉด์„œ๋„, ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Mybatis vs JPA

Mybatis์™€ JPA๋Š” ๋ชจ๋‘ ํผ์‹œ์Šคํ„ด์Šค ํ”„๋ ˆ์ž„์›Œํฌ์ด์ง€๋งŒ, ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹๊ณผ ์ฒ ํ•™์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. JPA๋Š” ๊ฐ์ฒด-๊ด€๊ณ„ ๋งคํ•‘์„ ์ค‘์‹ฌ์œผ๋กœ ํ•œ ORM(Object-Relational Mapping) ํ”„๋ ˆ์ž„์›Œํฌ์ด๋ฉฐ, ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด Mybatis๋Š” SQL Mapper๋กœ์„œ ์ง์ ‘์ ์ธ SQL ์ž‘์„ฑ๊ณผ ๋งคํ•‘์„ ์ค‘์‹ฌ์œผ๋กœ ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์„ ํƒํ• ์ง€๋Š” ๊ฐœ๋ฐœ์ž์˜ ์„ ํ˜ธ๋„์™€ ํ”„๋กœ์ ํŠธ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

Spring Framework ์™€ Mybatis ์—ฐ๋™

Mybatis๋ฅผ Spring Framework์™€ ์—ฐ๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
1.
Mybatis ์˜์กด์„ฑ ์„ค์ •
2.
Mybatis ์„ค์ • ๋ฐ ์„ค์ • ํŒŒ์ผ ์ž‘์„ฑ
3.
SqlSessionFactoryBean๊ณผ SqlSessionTemplate ๋นˆ ๋“ฑ๋ก
4.
Mapper ์ธํ„ฐํŽ˜์ด์Šค ํŒจํ‚ค์ง€ ์Šค์บ” ๊ฒฝ๋กœ ์„ค์ •
5.
Mapper.xml ๋งคํ•‘ ํŒŒ์ผ ์ž‘์„ฑ
6.
Mapper ์ธํ„ฐํŽ˜์ด์Šค ์ž‘์„ฑ
7.
๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ตฌํ˜„

Mybatis ์˜์กด์„ฑ ์„ค์ •

โ€ข
pom.xml
โ—ฆ
mybatis
โ—ฆ
mybatis-spring
โ—ฆ
spring-jdbc
โ—ฆ
mysql-connector-java
<!-- mybatis--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> <!-- mybatis-spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency>
XML
๋ณต์‚ฌ
<!-- mysql ๋“œ๋ผ์ด๋ฒ„ --> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.1.0</version> </dependency> <!-- Spring JDBC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${org.springframework-version}</version> </dependency>
XML
๋ณต์‚ฌ
โ€ข
lombok
<!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.30</version> <scope>provided</scope> </dependency>
XML
๋ณต์‚ฌ

Mybatis ์„ค์ • ๋ฐ ์„ค์ • ํŒŒ์ผ

Mybatis ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค

โ€ข
root-context.xml
xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
XML
๋ณต์‚ฌ

Mybatis ์Šคํ‚ค๋งˆ ์„ค์ •

โ€ข
root-context.xml
http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
XML
๋ณต์‚ฌ

SqlSessionFactoryBean, SqlSessionTemplate ๋นˆ ๋“ฑ๋ก

โ€ข
root-context.xml
<!-- DriverManagerDataSource ๋นˆ ๋“ฑ๋ก --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://127.0.0.1:3306/joeun"></property> <property name="username" value="joeun"></property> <property name="password" value="123456"></property> </bean> <!-- SqlSessionFactoryBean ๋นˆ ๋“ฑ๋ก --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:/mybatis-config.xml"></property> </bean> <!-- MyBatis SqlSessionTemplate ๋นˆ ๋“ฑ๋ก --> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache"> <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg> </bean>
XML
๋ณต์‚ฌ

Mapper ์ธํ„ฐํŽ˜์ด์Šค ํŒจํ‚ค์ง€ ์Šค์บ” ๊ฒฝ๋กœ ์„ค์ •

โ€ข
root-context.xml
<!-- Mapper ์ธํ„ฐํŽ˜์ด์Šค ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ ์„ค์ • --> <mybatis-spring:scan base-package="com.aloha.spring.mapper" />
XML
๋ณต์‚ฌ

Mybatis ์„ค์ • ํŒŒ์ผ

โ€ข
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- ์„ค์ • --> <settings> <!-- ์–ธ๋”์Šค์ฝ”์–ด ์ผ€์ด์Šค์ธ ์ปฌ๋Ÿผ์„ ์นด๋ฉœ ์ผ€์ด์Šค๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์„ค์ • --> <!-- no - no --> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <!-- ํƒ€์ž… ๋ณ„์นญ ์„ค์ • --> <typeAliases> <!-- ํŒจํ‚ค์ง€๋ถ€ํ„ฐ์˜ ์ „์ฒด๊ฒฝ๋กœ๋ฅผ ๊ฐ–๋Š” ์ž๋ฐ” ํƒ€์ž…์„ ์ถ•์•ฝํ•ด์„œ ๋ณ„์นญ์œผ๋กœ ์ง€์ • --> <!-- <typeAlias alias="Board" type="com.aloha.spring.dto.Board"/> <typeAlias alias="User" type="com.aloha.spring.dto.User"/> <typeAlias alias="Comment" type="com.aloha.spring.dto.Comment"/> --> <!-- ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘ํ•  DTO๊ฐ€ ์žˆ๋Š” ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ ์ง€์ • --> <package name="com.aloha.spring.dto"/> </typeAliases> </configuration>
XML
๋ณต์‚ฌ

Mapper.xml ๋งคํ•‘ ํŒŒ์ผ ์ž‘์„ฑ

โ€ข
๋งคํ•‘ ํŒŒ์ผ ๊ธฐ๋ณธ ๊ตฌ์กฐ
<?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"> <!-- namespace="๋งคํผ ์ธํ„ฐํŽ˜์ด์Šค ๊ฒฝ๋กœ" --> <mapper namespace="com.aloha.spring.mapper.BoardMapper"> </mapper>
HTML
๋ณต์‚ฌ
โ€ข
BoardMapper.xml
โ—ฆ
ํŒจํ‚ค์ง€ ๊ตฌ์„ฑ : ์ตœ์ƒ์œ„ ํŒจํ‚ค์ง€(top level package)์˜ mapper ํŒจํ‚ค์ง€์™€ ์ผ์น˜
โ—ฆ
~/java
โ–ช
com.aloha.spring.mapper
โ—ฆ
~/resources
โ–ช
com.aloha.spring.mapper
โ€ข
BoardMapper.xml
<?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"> <!-- namespace="๋งคํผ ์ธํ„ฐํŽ˜์ด์Šค ๊ฒฝ๋กœ" --> <mapper namespace="com.aloha.spring.mapper.BoardMapper"> <!-- sql ํƒœ๊ทธ ์ž‘์„ฑ --> <!-- ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก --> <!-- id : ์—ฐ๊ฒฐํ•  ๋งคํผ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์†Œ๋“œ๋ช… --> <!-- resultType : ์กฐํšŒ ๊ฒฐ๊ณผ๋ฅผ ๋งคํ•‘ํ•  ํด๋ž˜์Šค ํƒ€์ž… (ํŒจํ‚ค์ง€๊ฒฝ๋กœ+ํด๋ž˜์Šค๋ช…) --> <select id="list" resultType="com.aloha.spring.dto.Board"> SELECT no 'no' ,title ,writer ,content ,reg_date 'regDate' ,upd_date 'updDate' ,views FROM board </select> <!-- ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ --> <!-- ๋งคํ•‘ ํŒŒ๋ผ๋ฏธํ„ฐ : #{ํŒŒ๋ผ๋ฏธํ„ฐ๋ช…} --> <!-- #{} ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐœ์ˆ˜๊ฐ€ 1๊ฐœ๋ผ๋ฉด, ์ด๋ฆ„๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋งคํ•‘๋œ๋‹ค. --> <select id="select" resultType="com.aloha.spring.dto.Board"> SELECT no 'no' ,title ,writer ,content ,reg_date 'regDate' ,upd_date 'updDate' ,views FROM board WHERE no = #{no} </select> <!-- ๊ฒŒ์‹œ๊ธ€ ๋“ฑ๋ก --> <!-- Mapper ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋„˜๊ฒจ์ค„ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ๋ผ๋ฉด ๊ฐ์ฒด๋กœ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ๋‹ค. --> <!-- ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ Board ํด๋ž˜์Šค๋ฅผ ์ง€์ •ํ•˜๋ฉด ๋ณ€์ˆ˜๋“ค์ด ์ž๋™์œผ๋กœ #{๋ณ€์ˆ˜} ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋งคํ•‘๋œ๋‹ค. --> <!-- #{index} : ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ index ๋กœ ๋งคํ•‘ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. --> <insert id="insert"> INSERT INTO board ( title, writer, content ) VALUES ( #{title}, #{writer}, #{content} ) <!-- (index๋กœ ๋งคํ•‘ํ•˜๋Š” ๊ฒฝ์šฐ) VALUES ( #{0}, #{1}, #{2} ) --> </insert> <!-- ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ • --> <update id="update"> UPDATE board SET title = #{title} ,writer = #{writer} ,content = #{content} ,upd_date = now() WHERE no = #{no} </update> <!-- ๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ --> <delete id="delete"> DELETE FROM board WHERE no = #{no} </delete> </mapper>
XML
๋ณต์‚ฌ

Mapper ์ธํ„ฐํŽ˜์ด์Šค ์ž‘์„ฑ

โ€ข
BoardMapper.java
@Mapper ์–ด๋…ธํ…Œ์ด์…˜์„ ์ •์˜ํ•œ๋‹ค.
๋ฉ”์†Œ๋“œ ๋ช…์€ Mapper.xml ๋งคํ•‘ ํŒŒ์ผ์˜ ์ฟผ๋ฆฌํƒœ๊ทธ id ๊ฐ’๊ณผ ์ผ์น˜ํ•ด์•ผํ•œ๋‹ค.
@Mapper public interface BoardMapper { // ๋ฉ”์†Œ๋“œ ๋ช…์€ Mapper.xml ๋งคํ•‘ ํŒŒ์ผ์˜ SQL ํƒœ๊ทธ id ๊ฐ’๊ณผ ์ผ์น˜ํ•ด์•ผํ•œ๋‹ค. public List<Board> list() throws Exception; public Integer insert(Board board) throws Exception; public Board select(Integer no) throws Exception; public Integer update(Board board) throws Exception; public Integer delete(Integer no) throws Exception; }
Java
๋ณต์‚ฌ

table

CREATE TABLE `board` ( `no` int NOT NULL AUTO_INCREMENT, `title` varchar(100) NOT NULL, `writer` varchar(100) NOT NULL, `content` text, `reg_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `upd_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `views` int NOT NULL DEFAULT '0', PRIMARY KEY (`no`) ) COMMENT='๊ฒŒ์‹œํŒ';
SQL
๋ณต์‚ฌ
โ€ข
์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ
INSERT INTO `board` (`title`, `writer`, `content`, `views`) VALUES ('์ฒซ ๋ฒˆ์งธ ๊ธ€', '์ž‘์„ฑ์ž1', '์ฒซ ๋ฒˆ์งธ ๊ธ€์˜ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.', 5), ('๋‘ ๋ฒˆ์งธ ๊ธ€', '์ž‘์„ฑ์ž2', '๋‘ ๋ฒˆ์งธ ๊ธ€์˜ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.', 12), ('์„ธ ๋ฒˆ์งธ ๊ธ€', '์ž‘์„ฑ์ž3', '์„ธ ๋ฒˆ์งธ ๊ธ€์˜ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.', 8), ('๋„ค ๋ฒˆ์งธ ๊ธ€', '์ž‘์„ฑ์ž4', '๋„ค ๋ฒˆ์งธ ๊ธ€์˜ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.', 20), ('๋‹ค์„ฏ ๋ฒˆ์งธ ๊ธ€', '์ž‘์„ฑ์ž5', '๋‹ค์„ฏ ๋ฒˆ์งธ ๊ธ€์˜ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.', 7), ('์—ฌ์„ฏ ๋ฒˆ์งธ ๊ธ€', '์ž‘์„ฑ์ž6', '์—ฌ์„ฏ ๋ฒˆ์งธ ๊ธ€์˜ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.', 15), ('์ผ๊ณฑ ๋ฒˆ์งธ ๊ธ€', '์ž‘์„ฑ์ž7', '์ผ๊ณฑ ๋ฒˆ์งธ ๊ธ€์˜ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.', 3), ('์—ฌ๋Ÿ ๋ฒˆ์งธ ๊ธ€', '์ž‘์„ฑ์ž8', '์—ฌ๋Ÿ ๋ฒˆ์งธ ๊ธ€์˜ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.', 9), ('์•„ํ™‰ ๋ฒˆ์งธ ๊ธ€', '์ž‘์„ฑ์ž9', '์•„ํ™‰ ๋ฒˆ์งธ ๊ธ€์˜ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.', 22), ('์—ด ๋ฒˆ์งธ ๊ธ€', '์ž‘์„ฑ์ž10', '์—ด ๋ฒˆ์งธ ๊ธ€์˜ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.', 0);
SQL
๋ณต์‚ฌ

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง

โ€ข
Board.java
โ€ข
BoardService.java
โ€ข
BoardServiceImpl.java

Board.java

@Data public class Board { private int no; private String title; private String writer; private String content; private Date regDate; private Date updDate; private int views; public Board() { } public Board(String title, String writer, String content) { this.title = title; this.writer = writer; this.content = content; } }
Java
๋ณต์‚ฌ

BoardService.java

public interface BoardService { // ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก public List<Board> list() throws Exception; // ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ public Board select(int no) throws Exception;; // ๊ฒŒ์‹œ๊ธ€ ๋“ฑ๋ก public Integer insert(Board board) throws Exception; // ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ • public Integer update(Board board) throws Exception; // ๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ public Integer delete(int no) throws Exception; }
Java
๋ณต์‚ฌ

BoardServiceImpl.java

@Service // ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์„œ๋น„์Šค ํด๋ž˜์Šค๋กœ ๋นˆ ๋“ฑ๋ก public class BoardServiceImpl implements BoardService { private static final Logger logger = LoggerFactory.getLogger(BoardServiceImpl.class); @Autowired private BoardMapper boardMapper; @Override public List<Board> list() throws Exception { List<Board> boardList = boardMapper.list(); return boardList; } @Override public Board select(int no) throws Exception { Board board = boardMapper.select(no); return board; } @Override public Integer insert(Board board) throws Exception { int result = boardMapper.insert(board); return result; } @Override public Integer update(Board board) throws Exception { int result = boardMapper.update(board); return result; } @Override public Integer delete(int no) throws Exception { int result = boardMapper.delete(no); return result; } }
Java
๋ณต์‚ฌ

์ปจํŠธ๋กค๋Ÿฌ

BoardController.java

package com.aloha.spring.controller; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import com.aloha.spring.dto.Board; import com.aloha.spring.service.BoardService; @Controller // ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๋นˆ ๋“ฑ๋ก @RequestMapping("/board") // ํด๋ž˜์Šค ๋ ˆ๋ฒจ ๊ฒฝ๋กœ /board ๋กœ ์ง€์ • public class BoardController { private static final Logger logger = LoggerFactory.getLogger(BoardController.class); @Autowired // ์˜์กด์„ฑ ์ž๋™ ์ฃผ์ž… private BoardService boardSerivce; /** * ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก * @param model * @return * @throws Exception */ // @RequestMapping(value = "/list", method = RequestMethod.GET) @GetMapping("/list") // Spring 4.3 ๋ฒ„์ „ ์‚ฌ์šฉ ๊ฐ€๋Šฅ public String list(Model model) throws Exception { List<Board> boardList = boardSerivce.list(); model.addAttribute("boardList", boardList); return "board/list"; // board/list.jsp ํ™”๋ฉด ์‘๋‹ต } /** * ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ * @param model * @param no * @return * @throws Exception */ @GetMapping("/read") public String read(Model model, int no) throws Exception { Board board = boardSerivce.select(no); model.addAttribute("board", board); return "board/read"; } // ๊ฒŒ์‹œ๊ธ€ ๋“ฑ๋ก - /board/insert - [GET] @GetMapping("/insert") public String insert() throws Exception { return "board/insert"; } // ๊ฒŒ์‹œ๊ธ€ ๋“ฑ๋ก ์ฒ˜๋ฆฌ - /board/insert - [POST] @PostMapping("/insert") public String insertPro(Board board) throws Exception { int result = boardSerivce.insert(board); logger.info("๊ฒŒ์‹œ๊ธ€ ๋“ฑ๋ก ์š”์ฒญ - result : " + result); return "redirect:/board/list"; } // ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ • - /board/update - [GET] @GetMapping("/update") public String update(Model model, int no) throws Exception { Board board = boardSerivce.select(no); model.addAttribute("board", board); return "board/update"; } // ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ • ์ฒ˜๋ฆฌ - /board/update - [POST] @PostMapping("/update") public String updatePro(Board board) throws Exception { int result = boardSerivce.update(board); logger.info("๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ • ์š”์ฒญ - result : " + result); return "redirect:/board/list"; } // ๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ ์ฒ˜๋ฆฌ - /board/delete - [POST] @PostMapping("/delete") public String deletePro(int no) throws Exception { int result = boardSerivce.delete(no); logger.info("๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ ์š”์ฒญ - result : " + result); return "redirect:/board/list"; } }
Java
๋ณต์‚ฌ

๋ทฐ

board

โ€ข
list.jsp
โ€ข
read.jsp
โ€ข
insert.jsp
โ€ข
update.jsp

list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก</title> </head> <body> <h1>๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก</h1> <a href="${ pageContext.request.contextPath }/board/insert">๊ธ€์“ฐ๊ธฐ</a> <table border="1"> <tr> <th>๋ฒˆํ˜ธ</th> <th>์ œ๋ชฉ</th> <th>์ž‘์„ฑ์ž</th> <th>๋“ฑ๋ก์ผ์ž</th> <th>์ˆ˜์ •์ผ์ž</th> <th>์กฐํšŒ์ˆ˜</th> </tr> <c:forEach items="${boardList}" var="board"> <tr> <td align="center">${board.no}</td> <td width="300"> <a href="${ pageContext.request.contextPath }/board/read?no=${board.no}"> ${board.title} </a> </td> <td align="center" width="120">${board.writer}</td> <%-- <td align="center">${board.regDate}</td> --%> <td align="center"> <fmt:formatDate value="${board.regDate}" pattern="yyyy-MM-dd HH:mm:ss"/> </td> <%-- <td align="center">${board.updDate}</td> --%> <td align="center"> <fmt:formatDate value="${board.updDate}" pattern="yyyy-MM-dd HH:mm:ss"/> </td> <td align="center">${board.views}</td> </tr> </c:forEach> </table> </body> </html>
HTML
๋ณต์‚ฌ

read.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ</title> </head> <body> <h1>๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ</h1> <form action="${ pageContext.request.contextPath }/board/delete" method="POST"> <input type="hidden" name="no" value="${board.no}" /> <table> <tr> <td><label for="title">์ œ๋ชฉ</label></td> <td><input type="text" name="title" value="${board.title}" /></td> </tr> <tr> <td><label for="writer">์ž‘์„ฑ์ž</label></td> <td><input type="text" name="writer" value="${board.writer}" /></td> </tr> <tr> <td><label for="content">๋‚ด์šฉ</label></td> <td> <textarea rows="5" cols="20" name="content" >${board.content}</textarea> </td> </tr> </table> <div> <a href="${ pageContext.request.contextPath }/board/update?no=${board.no}">์ˆ˜์ •</a> <input type="submit" value="์‚ญ์ œ" /> </div> </form> </body> </html>
HTML
๋ณต์‚ฌ

insert.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>๊ฒŒ์‹œ๊ธ€ ์“ฐ๊ธฐ</title> </head> <body> <h1>๊ฒŒ์‹œ๊ธ€ ์“ฐ๊ธฐ</h1> <form action="${ pageContext.request.contextPath }/board/insert" method="POST"> <table> <tr> <td><label for="title">์ œ๋ชฉ</label></td> <td><input type="text" name="title" /></td> </tr> <tr> <td><label for="writer">์ž‘์„ฑ์ž</label></td> <td><input type="text" name="writer" /></td> </tr> <tr> <td><label for="content">๋‚ด์šฉ</label></td> <td> <textarea rows="5" cols="20" name="content" ></textarea> </td> </tr> </table> <div> <input type="submit" value="๋“ฑ๋ก" /> </div> </form> </body> </html>
HTML
๋ณต์‚ฌ

update.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ •</title> </head> <body> <h1>๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ •</h1> <form action="${ pageContext.request.contextPath }/board/update" method="POST"> <input type="hidden" name="no" value="${board.no}" /> <table> <tr> <td><label for="title">์ œ๋ชฉ</label></td> <td><input type="text" name="title" value="${board.title}" /></td> </tr> <tr> <td><label for="writer">์ž‘์„ฑ์ž</label></td> <td><input type="text" name="writer" value="${board.writer}" /></td> </tr> <tr> <td><label for="content">๋‚ด์šฉ</label></td> <td> <textarea rows="5" cols="20" name="content" >${board.content}</textarea> </td> </tr> </table> <input type="submit" value="์ˆ˜์ •" /> </form> <form action="${ pageContext.request.contextPath }/board/delete" method="POST"> <input type="hidden" name="no" value="${board.no}" /> <input type="submit" value="์‚ญ์ œ" /> </form> </body> </html>
HTML
๋ณต์‚ฌ

Mybatis ํŒŒ๋ผ๋ฏธํ„ฐ ๋งคํ•‘ ๋ฐฉ๋ฒ•

๊ฐ์ฒด ๋งคํ•‘

โ€ข
Mapper ์ธํ„ฐํŽ˜์ด์Šค ์ž‘์„ฑ ์‹œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ DTO ๊ฐ์ฒด ์‚ฌ์šฉ: ๋งคํผ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์†Œ๋“œ์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ DTO ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น DTO ๊ฐ์ฒด์˜ ํ•„๋“œ ๊ฐ’์„ ์ฟผ๋ฆฌ์— ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
public interface BoardMapper { public List<Board> list(Board board); }
Java
๋ณต์‚ฌ
โ€ข
Mapper XML์—์„œ #{} ์‚ฌ์šฉํ•˜์—ฌ ํ•„๋“œ ๊ฐ’ ๋งคํ•‘: Mapper XML์—์„œ #{}๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ DTO ๊ฐ์ฒด์˜ ํ•„๋“œ ๊ฐ’์„ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
<select id="list" resultType="com.aloha.spring.dto.Board"> SELECT * FROM board WHERE title = #{title} AND writer = #{writer} </select>
XML
๋ณต์‚ฌ

@Param ์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉ

โ€ข
Mapper ์ธํ„ฐํŽ˜์ด์Šค ์ž‘์„ฑ ์‹œ @Param ์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉ: ๋งคํผ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์†Œ๋“œ์— @Param ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ฟผ๋ฆฌ์— ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
public interface BoardMapper { public int insert(@Param("title") String title , @Param("writer") String writer , @Param("content") String content); }
Java
๋ณต์‚ฌ
โ€ข
Mapper XML์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ช…์œผ๋กœ ๋งคํ•‘: Mapper XML์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ช…์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ฟผ๋ฆฌ์— ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
<insert id="insert"> INSERT INTO board ( title, writer, content ) VALUES ( #{title}, #{writer}, #{content} ) </insert>
XML
๋ณต์‚ฌ

Map ์ปฌ๋ ‰์…˜ ๋งคํ•‘

โ€ข
Mapper ์ธํ„ฐํŽ˜์ด์Šค ์ž‘์„ฑ ์‹œ Map ์ปฌ๋ ‰์…˜ ์‚ฌ์šฉ: ๋งคํผ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์†Œ๋“œ์— Map ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ฟผ๋ฆฌ์— ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
public interface BoardMapper { public int update(Map<String,String> map); }
Java
๋ณต์‚ฌ
map { no : โ€œ100โ€, title : โ€œ์ œ๋ชฉโ€, writer : โ€œ์ž‘์„ฑ์žโ€, content : โ€œ๋‚ด์šฉโ€, }
โ€ข
Mapper XML์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ช…์œผ๋กœ ๋งคํ•‘: Mapper XML์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ช…์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ฟผ๋ฆฌ์— ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
<update id="update"> UPDATE board SET title = #{title} ,writer = #{writer} ,content = #{content} ,upd_date = now() WHERE no = #{no} </update>
XML
๋ณต์‚ฌ

Mybatis SQL

select ๋ฌธ

MyBatis์˜ SELECT ๋ฌธ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ง€์ •๋œ ์กฐ๊ฑด์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๋‹จ์ผ ๋˜๋Š” ๋‹ค์ค‘ ํ–‰์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. SELECT ๋ฌธ์˜ ๊ฒฐ๊ณผ๋Š” Java ๊ฐ์ฒด ๋˜๋Š” Java ๊ฐ์ฒด ์ปฌ๋ ‰์…˜์— ๋งคํ•‘๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
<select id="select" resultType="com.aloha.spring.dto.Board"> SELECT * FROM board WHERE no = #{no} </select>
XML
๋ณต์‚ฌ
์œ„์˜ ์ฝ”๋“œ์—์„œ select ๋ฌธ์€ no ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ board ํ…Œ์ด๋ธ”์—์„œ ๋‹จ์ผ ํ–‰์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” Board ํด๋ž˜์Šค์— ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค.

insert ๋ฌธ

MyBatis์˜ INSERT ๋ฌธ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ํ–‰ ๋˜๋Š” ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ํ–‰์„ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฝ์ž…ํ•  ๊ฐ’์„ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ Java ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
<insert id="insert"> INSERT INTO board (title, writer, content) VALUES (#{title}, #{writer}, #{content}) </insert>
XML
๋ณต์‚ฌ
์œ„์˜ ์ฝ”๋“œ์—์„œ insert ๋ฌธ์€ title, writer, ๋ฐ content ๋งค๊ฐœ ๋ณ€์ˆ˜์—์„œ ์ œ๊ณต๋œ ๊ฐ’์œผ๋กœ board ํ…Œ์ด๋ธ”์— ์ƒˆ๋กœ์šด ํ–‰์„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

update ๋ฌธ

MyBatis์˜ UPDATE ๋ฌธ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ธฐ์กด ๋ ˆ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ง€์ •๋œ ์กฐ๊ฑด์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ํ•˜๋‚˜ ์ด์ƒ์˜ ์—ด์„ ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์ •ํ•  ๊ฐ’์„ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ Java ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
<update id="update"> UPDATE board SET title = #{title}, writer = #{writer}, content = #{content}, upd_date = now() WHERE no = #{no} </update>
XML
๋ณต์‚ฌ
์œ„์˜ ์ฝ”๋“œ์—์„œ update ๋ฌธ์€ no ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ board ํ…Œ์ด๋ธ”์˜ title, writer, content, ๋ฐ upd_date ์—ด์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

delete ๋ฌธ

MyBatis์˜ DELETE ๋ฌธ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ธฐ์กด ๋ ˆ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ง€์ •๋œ ์กฐ๊ฑด์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ํ•˜๋‚˜ ์ด์ƒ์˜ ํ–‰์„ ์‚ญ์ œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
<delete id="delete"> DELETE FROM board WHERE no = #{no} </delete>
XML
๋ณต์‚ฌ

selectKey ๋ฌธ

MyBatis์˜ SELECTKEY ๋ฌธ์€ INSERT ๋ฌธ์—์„œ ์ƒ์„ฑ๋œ ํ‚ค ๊ฐ’์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ƒˆ ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•œ ํ›„ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ ๊ธฐ๋ณธ ํ‚ค ๊ฐ’์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
<insert id="insert"> <selectKey resultType="java.lang.Integer" keyProperty="parentNo" order="BEFORE"> SELECT MAX( ${pk} ) FROM ${parentTable} </selectKey> INSERT INTO file (parent_table, parent_no, file_name, file_path) VALUES (#{parentTable}, #{parentNo}, #{fileName}, #{filePath}) </insert>
XML
๋ณต์‚ฌ
์œ„์˜ ์ฝ”๋“œ์—์„œ selectKey ๋ฌธ์€ ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฝ์ž…๋œ ID ๊ฐ’์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  Java ๊ฐ์ฒด์˜ no ์†์„ฑ์— ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ƒˆ ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•œ ํ›„ ์ƒ์„ฑ๋œ ํ‚ค ๊ฐ’์„ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

${ } vs #{ }

โ€ข
${ } : ๋„˜์–ด์˜จ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์„, ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅ
โ€ข
#{ } : ๋„˜์–ด์˜จ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์„, ์ž๋™ ํƒ€์ž… ๋ณ€ํ™˜ํ•˜์—ฌ ์ถœ๋ ฅ

ํ•จ์ˆ˜ & ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ

๋งˆ์ด๋ฐ”ํ‹ฐ์Šค์—์„œ ํ•จ์ˆ˜๋‚˜ ํ”„๋กœ์‹œ์ €๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ๋ ค๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.
ํ•จ์ˆ˜ ํ˜ธ์ถœ: ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋ฉด SELECT ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
<select id="callFunction" resultType="java.lang.Integer" statementType="CALLABLE"> { #{result, mode=OUT, jdbcType=INTEGER} = call functionName(#{param1, jdbcType=INTEGER}, #{param2, jdbcType=INTEGER}) } </select>
XML
๋ณต์‚ฌ
์œ„์˜ ์˜ˆ์ œ์—์„œ๋Š” callFunction์ด๋ผ๋Š” SELECT ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ functionName์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. param1๊ณผ param2๋Š” ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์ด๋ฉฐ, result๋Š” ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.
1.
ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ: ํ”„๋กœ์‹œ์ €๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋ฉด INSERT, UPDATE ๋˜๋Š” DELETE ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์‹œ์ €๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
<insert id="callProcedure" statementType="CALLABLE"> { call procedureName(#{param1, jdbcType=INTEGER}, #{param2, jdbcType=VARCHAR}) } </insert>
XML
๋ณต์‚ฌ
์œ„์˜ ์˜ˆ์ œ์—์„œ๋Š” callProcedure์ด๋ผ๋Š” INSERT ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ procedureName์ด๋ผ๋Š” ํ”„๋กœ์‹œ์ €๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. param1๊ณผ param2๋Š” ํ”„๋กœ์‹œ์ €์— ์ „๋‹ฌ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.
์œ„์˜ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค์—์„œ ํ•จ์ˆ˜๋‚˜ ํ”„๋กœ์‹œ์ €๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ ์šฉํ•ด๋ณด์„ธ์š”.

MyBatis ๋™์  SQL

MyBatis์—์„œ ๋™์  SQL์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋™์  SQL ๋ฌธ๋ฒ•์˜ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

IF ๋ฌธ

<if test="condition"> <!-- ์กฐ๊ฑด์ด true์ผ ๋•Œ ์‹คํ–‰๋˜๋Š” SQL ๊ตฌ๋ฌธ --> </if>
XML
๋ณต์‚ฌ

choose ๋ฌธ

โ€ข
chooese
โ—ฆ
when
โ—ฆ
otherwise
<choose> <when test="condition1"> <!-- condition1์ด true์ผ ๋•Œ ์‹คํ–‰๋˜๋Š” SQL ๊ตฌ๋ฌธ --> </when> <when test="condition2"> <!-- condition2๊ฐ€ true์ผ ๋•Œ ์‹คํ–‰๋˜๋Š” SQL ๊ตฌ๋ฌธ --> </when> <otherwise> <!-- ์œ„์˜ ๋ชจ๋“  ์กฐ๊ฑด์ด false์ผ ๋•Œ ์‹คํ–‰๋˜๋Š” SQL ๊ตฌ๋ฌธ --> </otherwise> </choose>
XML
๋ณต์‚ฌ

foreach ๋ฌธ

<foreach collection="list" item="item" separator=","> <!-- list์˜ ๋ชจ๋“  ์š”์†Œ์— ๋Œ€ํ•ด ์‹คํ–‰๋˜๋Š” SQL ๊ตฌ๋ฌธ --> </foreach>
XML
๋ณต์‚ฌ

TRIM ๋ฌธ

<!-- prefix์™€ suffix์—๋Š” ํ•ด๋‹น ๊ตฌ๋ฌธ์„ ๋‘˜๋Ÿฌ์‹ธ๋Š” ์ ‘๋‘์‚ฌ์™€ ์ ‘๋ฏธ์‚ฌ๊ฐ€ ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ ‘๋‘์‚ฌ ๋˜๋Š” ์ ‘๋ฏธ์‚ฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. --> <trim prefix="prefix" suffix="suffix" prefixOverrides="prefixOverrides" suffixOverrides="suffixOverrides"> <!-- prefixOverrides์™€ suffixOverrides๋Š” ์ƒ๋žต ๊ฐ€๋Šฅํ•œ ์š”์†Œ๋กœ, SQL ๊ตฌ๋ฌธ์˜ ์ ‘๋‘์‚ฌ ๋˜๋Š” ์ ‘๋ฏธ์‚ฌ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. --> <!-- SQL ๊ตฌ๋ฌธ --> </trim>
XML
๋ณต์‚ฌ

set ๋ฌธ

๋™์  SQL์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด MyBatis์—์„œ ์ œ๊ณตํ•˜๋Š” set ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. set ๋ฌธ๋ฒ•์€ UPDATE ์ฟผ๋ฆฌ์—์„œ ํ•„์š”ํ•œ ํ•„๋“œ๋งŒ ๋™์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์€ set ๋ฌธ๋ฒ•์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.
<update id="update"> UPDATE board <set> <if test="title != null"> title = #{title}, </if> <if test="writer != null"> writer = #{writer}, </if> <if test="content != null"> content = #{content}, </if> </set> WHERE no = #{no} </update>
XML
๋ณต์‚ฌ
์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” title, writer, content ํ•„๋“œ๊ฐ€ null์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋งŒ ํ•ด๋‹น ํ•„๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ํ•„๋“œ๋งŒ ๋™์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.