์คํ๋ง ํ๋ ์์ํฌ ํ๋ก์ ํธ ๊ณผ์ ์ค ์์ฑํจ
xx_mapper.xml ์์ฑ ๋ฐ ์ค์
- mapper ํ์ผ ๊ฒฝ๋ก ์ค์
- root-context.xml ํ์ผ์ mapper ๊ฒฝ๋ก๋ฅผ ์ค์ ํ๊ธฐ
- src/main/webapp/WEB-INF/spring/root-context.xml
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!---->
<property name="mapperLocations" value="classpath:mapper/**/*.xml"/>
</bean>
- ์ค์ ํ ์์น์ mapper.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"> <!--๊ทธ๋ฅ xmlํ์ผ์ MyBatisํ์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ ๊ฒ-->
<mapper namespace="documentMapper"> <!--Repository์์ ์ฌ์ฉํ mapper์ ๊ณ ์ ํ ์ด๋ฆ-->
<!--์์ ๋งคํผ-->
<select id="getMaxDocumentId" parameterType="long" resultType="long">
SELECT MAX(document_id)
FROM xx_document
</select>
</mapper>
- MyBatis ์ค์ ํ์ผ mybatis-config.xml ์์ฑ
- mybatis-config.xml ํ์ผ ์ฝ๋
<?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">
<configuration>
<typeAliases>
<typeAlias alias="Document" type="com.study.student.domain.Document"/>
<typeAlias alias="์กฐํ๊ฒฐ๊ณผํ์
ํด๋์ค๋ณ๋ช
" type="ํด๋น.ํด๋์ค๊ฐ.์์นํ.์ฃผ์.ํด๋์ค์ด๋ฆ"/>
</typeAliases>
</configuration>
- ๋น์ฐํ ์์กด์ฑ ์ถ๊ฐํด์ผํจ(์๋ต)
๊ธฐ๋ณธ ๋ฌธ๋ฒ
- ํ๊ทธ ์ข
๋ฅ : update, insert, select, sql, resultMap, delete, cache, cache-ref,parameterMap
- ํ๊ทธ๋ SQL ์ฟผ๋ฆฌ์ ๋ฐ์ดํฐ ๋งคํ์ ์ ์ํ๋ ์ค์ํ ์ญํ ์
- ๊ฐ ํ๊ทธ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ด๋ ์ค์ ์ ๋ํ ํน์ ์ง์๋ฅผ ์ ๊ณตํจ
- ๊ฐ ํ๊ทธ๋ณ ์ค๋ช [์๋์ ๋๋ณด๊ธฐ๋ฅผ ๋๋ฅด์ธ์]
1. <select>: ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ SQL ์ฟผ๋ฆฌ๋ฅผ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. `<select>` ํ๊ทธ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ SQL ๋ฌธ์ ํฌํจํฉ๋๋ค. ๋ฐํ๋๋ ๊ฒฐ๊ณผ๋ ๋จ์ผ ๊ฐ์ฒด, ๊ฐ์ฒด์ ๋ฆฌ์คํธ, ๋๋ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์
์ผ ์ ์์ต๋๋ค.
2. <insert>: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ฝ์
ํ๋ SQL ์ฟผ๋ฆฌ๋ฅผ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ํ๊ทธ๋ ๋ณดํต ์ฝ์
์์
์ ์ํํ๋ SQL ๋ฌธ์ ํฌํจํ๋ฉฐ, ํ์์ ๋ฐ๋ผ ์ฝ์
๋ ๋ฐ์ดํฐ์ ํค(์: auto-increment)๋ฅผ ๋ฐํํ ์๋ ์์ต๋๋ค.
3. <update>: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ SQL ์ฟผ๋ฆฌ๋ฅผ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ํ๊ทธ๋ ์์ ์์
์ ์ํํ๋ SQL ๋ฌธ์ ํฌํจํฉ๋๋ค.
4. <delete>: ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ SQL ์ฟผ๋ฆฌ๋ฅผ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ํ๊ทธ๋ ์ญ์ ์์
์ ์ํํ๋ SQL ๋ฌธ์ ํฌํจํฉ๋๋ค.
5. <sql>: SQL ๋ฌธ์ ์ผ๋ถ๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ์ํ ์ธ๊ทธ๋จผํธ๋ฅผ ์ ์ํฉ๋๋ค. ์ด ํ๊ทธ ๋ด์ ์ ์๋ SQL์ ๋ค๋ฅธ SQL ๋ฌธ ๋ด์์ ์ฌ์ฌ์ฉ๋ ์ ์์ผ๋ฉฐ, ์ค๋ณต์ ์ค์ด๊ณ ์ ์ง๋ณด์๋ฅผ ์ฉ์ดํ๊ฒ ํฉ๋๋ค.
6. <resultMap>: SQL ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ์ ์๋ฐ ๊ฐ์ฒด ์ฌ์ด์ ๋งคํ์ ์ ์ํฉ๋๋ค. ์ด ํ๊ทธ๋ ๋ณต์กํ ์กฐ์ธ์ด๋ ๋ณตํฉ ๋ฐ์ดํฐ ํ์
์ ์ฒ๋ฆฌํ ๋ ์ ์ฉํฉ๋๋ค.
7. <cache>: ๋ง์ด๋ฐํฐ์ค์ ๋ด์ฅ ์บ์ ๊ธฐ๋ฅ์ ํ์ฑํํฉ๋๋ค. ์ด ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ฉด SQL ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ์ฌ, ๋์ผํ ์ฟผ๋ฆฌ์ ๋ํ ๋ฐ๋ณต ์์ฒญ ์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
8. <cache-ref>: ๋ค๋ฅธ ๋งคํผ์์ ์ ์๋ ์บ์ ์ค์ ์ ์ฐธ์กฐํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฌ๋ฌ ๋งคํผ ๊ฐ์ ์บ์ ์ค์ ์ ๊ณต์ ํ ์ ์์ต๋๋ค.
9. <parameterMap>: (๋ ์ด์ ๊ถ์ฅ๋์ง ์์) SQL ์ฟผ๋ฆฌ์ ์
๋ ฅ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ์ํฉ๋๋ค. ์ด ํ๊ทธ๋ ํ์ฌ๋ `<parameterType>` ์์ฑ์ผ๋ก ๋์ฒด๋์์ต๋๋ค.
- ํ๊ทธ์ ์์ฑ :
- ๋ค์ํ ์์ฑ๋ค์ SQL ์ฟผ๋ฆฌ์ ๋์๊ณผ ๊ฒฐ๊ณผ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ์ ์ดํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํจ
- ๊ฐ ์์ฑ์ ํน์ ํ ๋ชฉ์ ์ค๋ช [์๋์ ๋๋ณด๊ธฐ๋ฅผ ๋๋ฅด์ธ์]
1. parameterType: SQL ์ฟผ๋ฆฌ์ ์ ๋ฌ๋๋ ๋งค๊ฐ๋ณ์์ Java ํ์
์ ์ง์ ํฉ๋๋ค. ์ด๋ `<insert>`, `<update>`, `<delete>`, `<select>` ๋ฑ์ ํ๊ทธ์์ ์ฌ์ฉ๋ฉ๋๋ค.
2. resultType: `<select>` ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ก ๋ฐํ๋ ๊ฐ์ฒด์ Java ํ์
์ ์ง์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ธฐ๋ณธ ํ์
, ๊ฐ์ฒด ํ์
๋ฑ์ด ๋ ์ ์์ต๋๋ค.
3. resultMap: ๋ณต์กํ SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ Java ๊ฐ์ฒด๋ก ๋งคํํ๋ ๋ฐฉ๋ฒ์ ์ ์ํฉ๋๋ค. `resultMap`์ ๋ค์ํ ์ปฌ๋ผ๊ณผ ๊ฐ์ฒด ์์ฑ ๊ฐ์ ๋งคํ ๊ด๊ณ๋ฅผ ์ธ๋ฐํ๊ฒ ์ค์ ํ ์ ์์ต๋๋ค.
4. databaseId: ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฒค๋(์: MySQL, Oracle)๋ณ๋ก ๋ค๋ฅธ ์ฟผ๋ฆฌ๋ฅผ ์ ์ํ ๋ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋์ผํ ๋งคํผ ํ์ผ ๋ด์์ ๋ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ
์ ๋์ํ ์ ์์ต๋๋ค.
5. fetchSize: JDBC ๋๋ผ์ด๋ฒ์ ์ํด ํ ๋ฒ์ ๊ฐ์ ธ์ฌ ์ ์๋ ํ(row)์ ์๋ฅผ ์ง์ ํฉ๋๋ค. ์ด๋ ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๋ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค.
6. flushCache: ์ฟผ๋ฆฌ ์คํ ํ ๋ง์ด๋ฐํฐ์ค์ ๋ด๋ถ ์บ์๋ฅผ ๋น์ธ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ฟผ๋ฆฌ์์ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
7. lang: ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋ ์คํฌ๋ฆฝํธ ์ธ์ด๋ฅผ ์ง์ ํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ XML์
๋๋ค.
8. parameterMap: (๋ ์ด์ ๊ถ์ฅ๋์ง ์์) ์
๋ ฅ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋์๋ ์์ฑ์
๋๋ค. ์ด๋ `parameterType`์ผ๋ก ๋์ฒด๋์์ต๋๋ค.
9. resultOrdered: ์ค์ฒฉ๋ ๊ฒฐ๊ณผ ๋งคํ์์ ๊ฒฐ๊ณผ์ ์์๊ฐ ์ค์ํ ๊ฒฝ์ฐ ์ด๋ฅผ `true`๋ก ์ค์ ํฉ๋๋ค.
10. resultSets: ๋ค์ค ๊ฒฐ๊ณผ ์งํฉ์ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ์ฃผ๋ก ์ ์ฅ ํ๋ก์์ ๋ฅผ ํธ์ถํ ๋ ํ์ํฉ๋๋ค.
11. resultSetType: JDBC์ `ResultSet` ํ์
์ ์ง์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, `FORWARD_ONLY`, `SCROLL_SENSITIVE`, `SCROLL_INSENSITIVE` ๋ฑ์ด ์์ต๋๋ค.
12. statementType: ์ฌ์ฉํ JDBC statement ํ์
์ ์ง์ ํฉ๋๋ค. `STATEMENT`, `PREPARED`, `CALLABLE` ์ค ํ๋๋ฅผ ์ ํํ ์ ์์ต๋๋ค.
13. timeout: ์ฟผ๋ฆฌ ์คํ์ ์ต๋ ์๊ฐ์ ์ด ๋จ์๋ก ์ค์ ํฉ๋๋ค. ์ด ์๊ฐ์ ์ด๊ณผํ๋ฉด ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
14. useCache: ํด๋น ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ๋ง์ด๋ฐํฐ์ค์ ๋ด๋ถ ์บ์์ ์ ์ฅํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ์ฃผ๋ก ์กฐํ ์ฟผ๋ฆฌ์์ ์ฌ์ฉ๋ฉ๋๋ค.
์ด๋ฌํ ์์ฑ๋ค์ ์ ์ ํ ์ฌ์ฉํ๋ฉด, ๋ง์ด๋ฐํฐ์ค๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํธ์์ฉ์ ๋์ฑ ํจ์จ์ ์ด๊ณ ์ ์ฐํ๊ฒ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ์์ฑ์ ์ฌ์ฉ์ ๋งคํผ์ ๊ตฌ์ฒด์ ์ธ ์๊ตฌ์ฌํญ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํน์ฑ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค.
- ์ฟผ๋ฆฌ๋ณ ์ฌ์ฉ์์
<!-- ํน์ document_id๋ก Document ์กฐํ -->
<select id="selectDocumentById" parameterType="int" resultType="com.example.model.Document">
SELECT document_id, title, content
FROM Document
WHERE document_id = #{documentId}
</select>
- myBatisConfig.xml์ ํ์
๋ณ์นญ ๋ฑ๋ก
- ๋ณ์นญ(Alias)์ ์ฌ์ฉํ์ฌ parameterType๊ณผ resultType์ ๋ ๊ฐ๋จํ๊ฒ ์ง์ ํ ์ ์์
- ๋ณ์นญ์ ๋ฑ๋กํ๋ฉด, ์ ์ฒด ํด๋์ค ์ด๋ฆ์ ์ฌ์ฉํ๋ ๋์ ์ ์ด ๋ณ์นญ์ ์ฌ์ฉํด์ ๋งคํ ํด๋์ค๋ฅผ ์ฐธ์กฐํ ์ ์๊ธฐ ๋๋ฌธ์ XML ์ค์ ์ ๋ ๊ฐ๊ฒฐํ๊ฒ ๋ง๋ค๊ณ , ๊ฐ๋ ์ฑ์ ํฅ์์์ผ์ค
- mybatis-config.xml ์์ฑํ๊ธฐ
- ์์ฑ์์น : ๋ง์ด๋ฐํฐ์ค(MyBatis)์ mybatis-config.xml ํ์ผ ์์น๋ ์ผ๋ฐ์ ์ผ๋ก Java ํ๋ก์ ํธ์ resources ๋๋ ํ ๋ฆฌ ์๋์ ๋๋ ๊ฒ์ด ์ผ๋ฐ์ ์
- ์ฝ๋ ์์
<?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">
<configuration>
<typeAliases>
<typeAlias alias="Document" type="com.example.model.Document"/>
</typeAliases>
</configuration>
- ๋ณ์นญ ๋ฑ๋ก ์ดํ์๋ <select id="selectDocumentById" parameterType="int" resultType=" Document "> ๋ผ๊ณ ์ ๋ ฅ ํ ์ ์์
- ๋ฐ์ธ๋ฉ ํ์
ํด๋์ค ์์ฑ์ ์ฃผ์์
- ์ปฌ๋ผ๋ช
๊ณผ ํ๋กํผํฐ ์ด๋ฆ ๋งค์นญ
- ๋ง์ด๋ฐํฐ์ค๋ SQL ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ์ปฌ๋ผ ์ด๋ฆ๊ณผ ๋ฐ์ธ๋ฉ ํ์ ํด๋์ค์ ํ๋กํผํฐ ์ด๋ฆ์ ์๋์ผ๋ก ๋งคํํจ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ปฌ๋ผ๋ช ์ด user_name์ด๋ผ๋ฉด, ๋ฐ์ธ๋ฉ ํด๋์ค์ ํ๋กํผํฐ๋ userName๊ณผ ๊ฐ์ด ์นด๋ฉ ์ผ์ด์ค(CamelCase)๋ก ๋งคํ๋จ
- ์์ฑ์ ๋งค๊ฐ๋ณ์ ์์
- ์์ฑ์๋ฅผ ํตํ ๋งคํ์ ์ฌ์ฉํ ๊ฒฝ์ฐ SELECT ์ ์ ์ปฌ๋ผ ์์์ ์์ฑ์ ๋งค๊ฐ๋ณ์์ ์์๊ฐ ์ผ์นํด์ผ ํจ
- resultMap์์ <constructor> ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ช ์์ ์ผ๋ก ๋งคํํ ์๋ ์์
- ๊ธฐ๋ณธ ์์ฑ์์ ์ค์์ฑ
- ๋ง์ด๋ฐํฐ์ค๋ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ ๊ธฐ๋ณธ ์์ฑ์(์ธ์๊ฐ ์๋ ์์ฑ์)๋ฅผ ์ฌ์ฉํจ
- ๋ฐ์ธ๋ฉ ํ์ ํด๋์ค์๋ ๊ธฐ๋ณธ ์์ฑ์๊ฐ ๋ฐ๋์ ์์ดํจ
- ํ์
ํธ๋ค๋ฌ
- ๋๋๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ปฌ๋ผ ํ์ ๊ณผ ์๋ฐ ํด๋์ค์ ํ๋ ํ์ ์ด ์ง์ ์ ์ผ๋ก ๋งคํ๋์ง ์์ ๋ ํ์ ํธ๋ค๋ฌ๋ฅผ ์ฌ์ฉํด์ ๋ณํ์ ์ฒ๋ฆฌํ ์ ์์
- ์ ๊ทผ์ฑ
- ํ๋กํผํฐ์ ์ง์ ์ ๊ทผํ๋ ๋์ , getter์ setter ๋ฉ์๋๋ฅผ ํตํ ์ ๊ทผ์ ๊ถ์ฅํจ
- ํ๋ ๋ค์ด๋ฐ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ปฌ๋ผ๋ช ๊ณผ ์๋ฐ ํด๋์ค์ ํ๋๋ช ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ, @Result ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ๋ช ์์ ์ผ๋ก ๋งคํํ ์ ์์
- ์ปฌ๋ผ๋ช
๊ณผ ํ๋กํผํฐ ์ด๋ฆ ๋งค์นญ
( to do ๊ฒช์๋ ์ค๋ฅ ์ฝ๋ ์ถ๊ฐํ๊ธฐ )
์ฌ์ฌ์ฉ๊ณผ ์กฐ๊ฑด ๊ฒ์
- ์์ฃผ์ฌ์ฉํ๋ ์ฟผ๋ฆฌ ๋ถ๋ถ <sql><include> ํ๊ทธ๋ฅผ ์ด์ฉํด์ ์ฌ์ฌ์ฉ ํ๊ธฐ
- SQL ์ฟผ๋ฆฌ์ ์ ์ง๋ณด์๊ฐ ํจ์ฌ ์ฌ์์ง๊ณ , ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ด ํฌ๊ฒ ํฅ์
- ์ฌ์ฌ์ฉํ SQL ์กฐ๊ฐ์ <sql> ํ๊ทธ๋ก ์ ์ํ๊ธฐ (์ฌ๋ฌ ์ฟผ๋ฆฌ์์ ๊ณตํต์ผ๋ก ์ฌ์ฉ๋๋ ๋ถ๋ถ)
<sql id="whereDocumentStatus">
WHERE status = #{status}
</sql>
- <sql> ํ๊ทธ๋ฅผ ๋ค๋ฅธ ์ฟผ๋ฆฌ์์ <include> ํ๊ทธ๋ก ํฌํจ์์ผ ์ฌ์ฌ์ฉ ์ํค๊ธฐ
<select id="selectDocumentsByStatus" parameterType="map" resultType="Document">
SELECT document_id, title, content
FROM Document
<include refid="whereDocumentStatus"/>
</select>
parameterType์ผ๋ก ์ ๊ณตํ๋ ๊ฐ์ฒด์ null๊ฐ์ด ์์ ๋
- ๊ฐ์ด ๊ฐ์ฒด๊ฐ ์ ์ฒด ๊ฐ์ด ์์ ๋/์ผ๋ถ ๊ฐ์ด null์ผ๋ update๋ฌธ์ ์ฌ์ฌ์ฉ์ ์ํด์ ๋ฐ์ดํฐ ํ์ ์ค์ ํ๊ธฐ
- #{๋ณ์๋ช
, null๊ฐ์ด์ด๋ ํ์
์ ์ด๊ฑฐ์ผ ์๋ ค์ฃผ๊ธฐ}
- ex) MANAGER_APPROVAL_ID = #{ managerApprovalId , jdbcType=NUMERIC }
- ex) MANAGER_APPROVAL_DATE = #{ managerApprovalDate , jdbcType=DATE },
<update id="updateDocument" parameterType="Document">
update XX_DOCUMENT
set title = #{title}, content = #{content}, APPROVAL_STATUS = #{approvalStatus},
MANAGER_APPROVAL_ID = #{managerApprovalId,jdbcType=NUMERIC},
MANAGER_APPROVAL_DATE = #{managerApprovalDate,jdbcType=DATE},
DIRECTOR_APPROVAL_ID = #{directorApprovalId,jdbcType=NUMERIC},
FINAL_APPROVAL_DATE = #{finalApprovalDate,jdbcType=DATE}
where document_id = #{documentId}
</update>
๊ฐ์ฒด๊ฐ ์๋ ์ปฌ๋ ์ ๋ฐํ
- resultType์ ํน์ ๊ฐ์ฒด๊ฐ ์๋ ์ปฌ๋ ์ ์ผ๋ก ๋ฐํํ๊ธฐ
- Map์ผ๋ก ๊ฒฐ๊ณผ ๋ฐํํ๊ธฐ List<Map<String,Object>>
- ํน์ ์ํฉ์์ ์ ์ฉํ ์ ์์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก๋ ๋๋ฉ์ธ ๋ชจ๋ธ(์ฆ, ๋น์ฆ๋์ค ๊ฐ์ฒด)์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ข์ ๋ฐฉ๋ฒ์ด๋ฏ๋ก ์ค๋ช ์ ์๋ตํ๊ฒ ์
๋ด๊ฐ ๊ฐ์ฅ ๋ง์ด ํ๋ ์ค์
- mapper์์ resultType์ด๋ parameterType์ผ๋ก ์ฐ๋ ๊ฐ์ฒด์ @NoArgsConstructor ์ ๋ํ
์ด์
๋ถ์ธ ๊ฒ -> ์ผ๋ถ ํ๋ ๋ฐ์ธ๋ฉ์ด ์ ์๋จ
- ์กฐํ ๊ฒฐ๊ณผ : Document(documentId=null, employeeId=null, title=์ฐ๊ฐ ๋ง์ผํ ์ ๋ต ๋ฐ ์คํ ๊ณํ, content=ํ๋ณด ๋ง์ด ํ๊ฒ ์ต๋๋ค., approvalStatus=null, managerApprovalId=null, directorApprovalId=null, regDate=null, finalApprovalDate=null)
- ์กฐํ๊ฒฐ๊ณผ ํ์
ํด๋์ค์ ์์ฑ์ ๋งค๊ฐ๋ณ์ ์์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์กฐํํ๋ ์ปฌ๋ผ์ ์์๊ฐ ๋ค๋ฅผ ๋
- java.sql.SQLException: ๋ถ์ ํฉํ ์ด ์ ํ: getLong not implemented for class oracle.jdbc.driver.T4CDateAccessor."
- ๋ณ์๋ช
์คํ
- java.sql.SQLSyntaxErrorException: ORA-00904: "COLUMN_NAME": invalid identifier
- mapper ์์ ์ฟผ๋ฆฌํ๊ทธ id ์ค๋ณต์ผ๋ก ์ธํ ์ค๋ฅ
- java.lang.IllegalArgumentException: Mapped Statements collection already contains value for namespace.mapperId
- ์ค๋ผํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฒ์ ์์ ์ง์ํ์ง ์๋ SQL ํ์ค ๊ตฌ๋ฌธ ์ฌ์ฉ
- FETCH FIRST ROW ONLY
- bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: ORA-00933: SQL command not properly ended
- mapper์ sql๋ฌธ ์ ์ธ๋ฏธ์ฝ๋ก ์ ์
๋ ฅํจ
- bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: ORA-00911: invalid character
- ์กฐํ๊ฒฐ๊ณผ ํ์
ํด๋์ค์ ํ๋ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์กฐํํ๋ ์ปฌ๋ผ์ ์ซ์๊ฐ ์ผ์นํ์ง ์์ ๋
- ### Error querying database. Cause: java.lang.IndexOutOfBoundsException: Index 7 out of bounds for length 7
- ์กฐ๊ฑด์ ์์ Enum์ ๊ฐ ๋น๊ต์กฐ๊ฑด์ ๋ฃ์ ๋ถ๋ถ์์ ๋๋ ์ค๋ฅ
- java.lang.IllegalArgumentException: invalid comparison: com.study.student.giantUtil.ApprovalStatus and java.lang.String
- ํด๊ฒฐ๋ฐฉ๋ฒ : mapper๋ก ๊ฐ์ ์ ๋ฌํ ๋ Enum๊ทธ๋๋ก๊ฐ ์๋๋ผ ๋ฌธ์์ด๋ก ์ ๋ฌํด์ ๋ฌธ์์ด ๋น๊ต๊ฐ ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ
- String approvalStatusStr = searchCondition.getApprovalStatus() != null ? searchCondition.getApprovalStatus().name() : null;
- map.put("approvalStatus",approvalStatusStr);
'๐ฅ๏ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค > SQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Oracle] SQL ํจ์ (0) | 2024.01.06 |
---|---|
[Oracle] OBJECT ์ค๋ธ์ ํธ (0) | 2024.01.06 |
[Oracle] DCL ๋ฐ์ดํฐ ์ ์ด์ด (0) | 2024.01.05 |
[Oracle] DDL ๋ฐ์ดํฐ ์ ์์ด (1) | 2024.01.05 |
[Oracle] DICTIONARY ๋ฐ์ดํฐ ์ฌ์ (0) | 2024.01.05 |