마이바티스란?
기존 JDBC로 개발할 경우 반복적으로 구현해야 할 SQL문도 많을 뿐만 아니라 SQL문도 복잡합니다.
기존의 JDBC의 경우 다음 과정을 거쳐야 했습니다.
connection → Statement 객체 생성 → SQL문 전송 → 결과반환 → close
이 방식의 단점은 SQL문이 프로그래밍 코드에 섞여 코드를 복잡하게 만든다는 것입니다. 이를 개선해 가독성을 높여 사용하기 편하게 만든 것이 바로 마이바티스 프레임워크 입니다.
- SQL실행결과를 자바 빈즈 또는 Map객체에 매핑해주는 Persistence 솔루션으로 관리합니다. 즉 SQL을 소스코드가 아닌 XML로 분리합니다.
- SQL문과 프로그래밍 코드를 분리해서 구현합니다.
- 데이터소스 기능과 트랜잭션 처리 기능을 제공합니다.
마이바티스 데이터 트랜잭션 순서
1. SqlMapConfig.xml 에 각 기능별로 실행할 SQL문을 SqlMap.xml에 미리 작성한 후 등록합니다.
2. 애플리케이션에서 데이터베이스와 연동하는 데 필요한 데이터를 각각의 매개변수에 저장한 후 마이바티스에 전달합니다.
3. 애플리케이션에서 요청한 SQL문을 SqlMap.xml에서 선택합니다.
4. 전달한 매개변수와 선택한 SQL문을 결합합니다.
5. 매개변수와 결합된 SQL문을 DBMS에서 실행합니다.
6. DBMS에서 반환된 데이터를 애플리케이션에서 제공하는 적당한 매개변수에 저장한 후 반환합니다.
/src/mybatis/SqlMapConfig.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 type="com.spring.ex01.MemberVO" alias="memberVO"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="JDBC:oracle:thin:@localhost:1521:XE" />
<property name="username" value="scott" />
<property name="password" value="tiger"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mybatis/mappers/member.xml"/>
</mappers>
</configuration>
/src/mybatis/mappers/ddl기능.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">
<mapper namespace="mapper.member">
<resultMap id="memResult" type="memberVO">
<result property="id" column="id" />
<result property="pwd" column="pwd" />
<result property="name" column="name" />
<result property="email" column="email" />
<result property="joinDate" column="joinDate" />
</resultMap>
<!--
<resultMap id="memResult" type="java.util.HashMap">
<result property="id" column="id" />
<result property="pwd" column="pwd" />
<result property="name" column="name" />
<result property="email" column="email" />
<result property="joinDate" column="joinDate" />
</resultMap> -->
<select id="selectAllMemberList" resultMap="memResult">
<![CDATA[
select * from t_member order by joinDate desc
]]>
</select>
<select id="selectName" resultType="String">
<![CDATA[
select name from t_member
where id = 'hong'
]]>
</select>
<select id="selectPwd" resultType="int" >
<![CDATA[
select pwd from t_member
where id = 'hong'
]]>
</select>
<select id="selectMemberById" resultType="memberVO" parameterType="String" >
<![CDATA[
select * from t_member
where
id=#{id}
]]>
</select>
<select id="selectMemberByPwd" resultMap="memResult" parameterType="int" >
<![CDATA[
select * from t_member
where
pwd = #{pwd}
]]>
</select>
<insert id="insertMember" parameterType="memberVO">
<![CDATA[
insert into t_member(id,pwd, name, email)
values(#{id}, #{pwd}, #{name}, #{email})
]]>
</insert>
<insert id="insertMember2" parameterType="java.util.Map">
<![CDATA[
insert into t_member(id,pwd, name, email)
values(#{id}, #{pwd}, #{name}, #{email})
]]>
</insert>
<update id="updateMember" parameterType="memberVO">
<![CDATA[
update t_member
set pwd=#{pwd}, name=#{name}, email=#{email}
where
id=#{id}
]]>
</update>
<delete id="deleteMember" parameterType="String">
<![CDATA[
delete from t_member
where
id=#{id}
]]>
</delete>
<!-- 동적 SQL문 -->
<select id="searchMember" parameterType="memberVO" resultMap="memResult">
<![CDATA[
select * from t_member
]]>
<where>
<if test=" name != '' and name != null">
name=#{name}
</if>
<if test="email != '' and email != null ">
and email = #{email}
</if>
</where>
order by joinDate desc
</select>
<!--
<sql id="a">
<![CDATA[
select * from t_member
]]>
</sql> -->
<!--
<select id="searchMember" parameterType="memberVO" resultMap="memResult">
<include refid="a" />
<![CDATA[
select * from t_member
]]>
<where>
<choose>
<when test="name != '' and name != null and email != '' and email != null">
name=#{name} and email=#{email}
</when>
<when test="name != '' and name != null">
name = #{name}
</when>
<when test="email !='' and email != null">
email = #{email}
</when>
</choose>
</where>
order by joinDate desc
</select> -->
<select id="foreachSelect" resultMap="memResult" parameterType="java.util.Map">
<!-- <include refid="a" /> -->
<![CDATA[
select * from t_member
]]>
where name in
<foreach item="item" collection="list" open="(" separator="," close=")" >
#{item}
</foreach>
order by joinDate desc
</select>
<insert id="foreachInsert" parameterType="java.util.Map">
<foreach item="item" collection="list" open="INSERT ALL" separator=" " close="SELECT * FROM DUAL" >
INTO t_member(id, pwd, name, email)
VALUES (#{item.id},
#{item.pwd},
#{item.name},
#{item.email})
</foreach>
</insert>
<!--
<select id="selectLike" resultMap="memResult" parameterType="String" >
<![CDATA[
select * from t_member
where
name like '%'#{name}'%'
]]>
</select>
-->
<!-- like 검색 -->
<select id="selectLike" resultMap="memResult" parameterType="String" >
<![CDATA[
select * from t_member
where
name like '%' || #{name} || '%'
]]>
</select>
</mapper>
트랜잭션 기능
일반적인 웹 애플리케이션의 Service클래스와 DAO클래스 구조는 아래와 같습니다. 트랜잭션은 각 단위 기능 수행시 이와 관련된 데이터베이스 연동작업을 한꺼번에 묵어서 관리한다는 개념입니다.
'Programming > Java' 카테고리의 다른 글
(SpringFrameWork) Dependency 오류 시 봐야할것. dependencies could not be resolved (0) | 2022.01.20 |
---|---|
[완독정리] 자바웹을 다루는 기술 5(스프링부트)- 길벗 (0) | 2021.02.15 |
[완독정리] 자바웹을 다루는 기술 4(스프링최종)- 길벗 (0) | 2021.02.10 |
[완독정리] 자바웹을 다루는 기술 1- 길벗 (0) | 2021.02.09 |
[완독정리] 자바웹을 다루는 기술 2(스프링)- 길벗 (0) | 2021.02.09 |