예제
ResultMap과 setting
DB의 컬럼명과 VO의 필드명이 카멜케이스와 _를 쓰는 것의 차이가 있을 때에는 해결할 수 있는 것이 두가지 방법이 있따 하나는 ResultMap을 활용하는 방법이 있습니다. 다만 DB의 컬럼명과 VO의 필드명의 차이가 카멜로 언더바만의 차이가 아닐 경우에는 ResultMap을 사용해야 합니다.
아래는 ResultMap을 사용하는 방법입니다.
mybatis-userservice-mapping10_resultMap.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="UserMapper10">
<resultMap type="user" id="userSelectRM">
<result property="userId" column="user_Id"/>
<result property="userName" column="user_name"/>
<result property="password" column="password"/>
<result property="grade" column="grade"/>
<result property="regDate" column="reg_date"/>
</resultMap>
<insert id="addUser" parameterType="user">
INSERT INTO users(user_id, user_name, password, age, grade, reg_date)
values(#{userId}, #{userName}, #{password}, #{age}, #{grade}, #{regDate})
</insert>
<update id="updateUser" parameterType="user">
update users
set user_name = #{userName}
where user_id = #{userId}
</update>
<delete id="removeUser" parameterType="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>
<!--정적인 쿼리 & sql 재사용성 있음-->
<select id="getUser" parameterType="user" resultType="user" resultMap="userSelectRM">
<include refid="select-users" />
where user_id=#{userId}
</select>
<!--동적인 쿼리 & sql 재사용성 있음 -->
<select id="getUserList" parameterType="user" resultType="user" resultMap="userSelectRM">
<include refid="select-users"></include>
<where>
<if test="userName !=null">
user_name LIKE #{userName}
</if>
<if test="age !=null">
OR age LIKE #{age}
</if>
</where>
<include refid="orderby-userid-desc"></include>
</select>
</mapper>
<?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>
<!--1. properties 파일 연결 -->
<properties resource="config/dbconn.properties" />
<!-- Oracle일 경우 null 값을 허용하지 않기에 반드시 옵션을 추가해야 실행될 수 있다.
settings tag의 위치는 반드시 여기에 와야하고 NULL 값을 반드시 대문자로 해야합니다.
-->
<settings>
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
<!-- 2.vo 연결 및 alias 지정 -->
<typeAliases>
<typeAlias type="ibatis.services.domain.User" alias="user"/>
</typeAliases>
<!-- 3.디비서버 정보 -->
<environments default="develop">
<environment id="develop">
<transactionManager type="JDBC" />
<dataSource type="UNPOOLED">
<property name="driver" value="${jdbc.mysql.driver}"/>
<property name="url" value="${jdbc.mysql.url}"/>
<property name="username" value="${jdbc.mysql.username}"/>
<property name="password" value="${jdbc.mysql.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="sql/mybatis-userservice-mapping.xml"/>
<mapper resource="sql/mybatis-userservice-mapping01.xml"/>
<mapper resource="sql/mybatis-userservice-mapping02.xml"/>
<mapper resource="sql/mybatis-userservice-mapping03.xml"/>
<mapper resource="sql/mybatis-userservice-mapping05.xml"/>
<mapper resource="sql/mybatis-userservice-mapping07.xml"/>
<mapper resource="sql/mybatis-userservice-mapping08.xml"/>
<mapper resource="sql/mybatis-userservice-mapping10.xml"/>
</mappers>
</configuration>
아래는 ResultMap을 사용하지 않고 setting 설정을 통해서 한 것입니다.
mybatis-userservice-mapping10.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="UserMapper10">
<insert id="addUser" parameterType="user">
INSERT INTO users(user_id, user_name, password, age, grade, reg_date)
values(#{userId}, #{userName}, #{password}, #{age}, #{grade}, #{regDate})
</insert>
<update id="updateUser" parameterType="user">
update users
set user_name = #{userName}
where user_id = #{userId}
</update>
<delete id="removeUser" parameterType="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>
<!--정적인 쿼리 & sql 재사용성 있음-->
<select id="getUser" parameterType="user" resultType="user">
<include refid="select-users" />
where user_id=#{userId}
</select>
<!--동적인 쿼리 & sql 재사용성 있음 -->
<select id="getUserList" parameterType="user" resultType="user">
<include refid="select-users"></include>
<where>
<if test="userName !=null">
user_name LIKE #{userName}
</if>
<if test="age !=null">
OR age LIKE #{age}
</if>
</where>
<include refid="orderby-userid-desc"></include>
</select>
</mapper>
<?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>
<!--1. properties 파일 연결 -->
<properties resource="config/dbconn.properties" />
<!-- Oracle일 경우 null 값을 허용하지 않기에 반드시 옵션을 추가해야 실행될 수 있다.
settings tag의 위치는 반드시 여기에 와야하고 NULL 값을 반드시 대문자로 해야합니다.
-->
<settings>
<!-- <setting name="jdbcTypeForNull" value="NULL"/> -->
<setting name="mapUnderscoreToCamelCase" value="True"/>
</settings>
<!-- 2.vo 연결 및 alias 지정 -->
<typeAliases>
<typeAlias type="ibatis.services.domain.User" alias="user"/>
</typeAliases>
<!-- 3.디비서버 정보 -->
<environments default="develop">
<environment id="develop">
<transactionManager type="JDBC" />
<dataSource type="UNPOOLED">
<property name="driver" value="${jdbc.mysql.driver}"/>
<property name="url" value="${jdbc.mysql.url}"/>
<property name="username" value="${jdbc.mysql.username}"/>
<property name="password" value="${jdbc.mysql.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="sql/mybatis-userservice-mapping.xml"/>
<mapper resource="sql/mybatis-userservice-mapping01.xml"/>
<mapper resource="sql/mybatis-userservice-mapping02.xml"/>
<mapper resource="sql/mybatis-userservice-mapping03.xml"/>
<mapper resource="sql/mybatis-userservice-mapping05.xml"/>
<mapper resource="sql/mybatis-userservice-mapping07.xml"/>
<mapper resource="sql/mybatis-userservice-mapping08.xml"/>
<mapper resource="sql/mybatis-userservice-mapping10.xml"/>
</mappers>
</configuration>
DB
DROP TABLE users;
CREATE TABLE users (
user_id VARCHAR(10) PRIMARY KEY,
user_name VARCHAR(10) NOT NULL,
password VARCHAR(10) NOT NULL,
age int(3),
grade int(3),
reg_date DATE );
INSERT INTO users VALUES('user01','홍길동','user01',10,1,'2019-10-11');
INSERT INTO users VALUES('user02','이순신','user02',20,2, '2019-10-12');
INSERT INTO users VALUES('user03','김유신','user03',30,3, '2019-10-09');
INSERT INTO users VALUES('mybatis01','홍길동iba','mybatis01',10,1,'2019-10-08');
INSERT INTO users VALUES('mybatis02','이순신iba','mybatis02',20,2, '2019-10-07');
INSERT INTO users VALUES('mybatis03','김유신iba','mybatis03',30,3,'2019-10-02');
COMMIT;
User.java
package ibatis.services.domain;
import java.io.Serializable;
import java.sql.Timestamp;
import java.util.Date;
/*
* FileName : User.java
* ㅇ User 의 정보를 갖는 Value Object (도메인객체,비지니스객체)
* ㅇ USERS TABLE 의 1개의 ROW 의 정보를 갖는다.
*/
public class User implements Serializable {
///Field
private String userId; // 회원 ID
private String userName; // 회원 이름
private String password; // 비밀번호
private Integer age; // 나이 :: Integer wrapper class 사용 :: 추후 용도 확인
private int grade; // 등급 :: int primitive 사용 :: :: 추후 용도 확인
private Timestamp regDate = new Timestamp(new Date().getTime()); // 가입일자
private boolean active;
///Constructor
public User() {
}
public User ( String userId, String userName,String password,
Integer age, int grade ) {
this.userId = userId;
this.userName = userName;
this.password = password;
this.age = age;
this.grade = grade;
}
///Method (getter/setter)
public String getUserId(){
return this.userId;
}
public void setUserId( String userId ){
this.userId= userId;
}
public String getPassword(){
return this.password;
}
public void setPassword( String password ){
this.password= password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public java.sql.Timestamp getRegDate() {
return regDate;
}
public void setRegDate(java.sql.Timestamp regDate) {
this.regDate = regDate;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
public void setActive(boolean active) {
this.active = active;
}
public boolean isActive() {
return active;
}
@Override
public String toString() {
return "User [userid=" + userId + ", userName=" + userName + ", password="
+ password + ", age=" + age + ", grade=" + grade+ ", active=" + active
+ ", regDate=" + regDate + "]";
}
}//end of class
<?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>
<!--1. properties 파일 연결 -->
<properties resource="config/dbconn.properties" />
<!-- Oracle일 경우 null 값을 허용하지 않기에 반드시 옵션을 추가해야 실행될 수 있다.
settings tag의 위치는 반드시 여기에 와야하고 NULL 값을 반드시 대문자로 해야합니다.
-->
<settings>
<!-- <setting name="jdbcTypeForNull" value="NULL"/> -->
<setting name="mapUnderscoreToCamelCase" value="True"/>
</settings>
<!-- 2.vo 연결 및 alias 지정 -->
<typeAliases>
<typeAlias type="ibatis.services.domain.User" alias="user"/>
</typeAliases>
<!-- 3.디비서버 정보 -->
<environments default="develop">
<environment id="develop">
<transactionManager type="JDBC" />
<dataSource type="UNPOOLED">
<property name="driver" value="${jdbc.mysql.driver}"/>
<property name="url" value="${jdbc.mysql.url}"/>
<property name="username" value="${jdbc.mysql.username}"/>
<property name="password" value="${jdbc.mysql.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="sql/mybatis-userservice-mapping.xml"/>
<mapper resource="sql/mybatis-userservice-mapping01.xml"/>
<mapper resource="sql/mybatis-userservice-mapping02.xml"/>
<mapper resource="sql/mybatis-userservice-mapping03.xml"/>
<mapper resource="sql/mybatis-userservice-mapping05.xml"/>
<mapper resource="sql/mybatis-userservice-mapping07.xml"/>
<mapper resource="sql/mybatis-userservice-mapping08.xml"/>
<mapper resource="sql/mybatis-userservice-mapping10.xml"/>
</mappers>
</configuration>
dbconn.properties
### dbconn.properties file....dbServer Information Storing
jdbc.mysql.driver=com.mysql.cj.jdbc.Driver
jdbc.mysql.url=jdbc:mysql://127.0.0.1:3306/scott?characterEncoding=UTF-8&serverTimezone=UTC
jdbc.mysql.username=root
jdbc.mysql.password=1234
mybatis-userservice-mapping05.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">
<!--Delete, Insert, Update -->
<!--CRUD 완성 -->
<!--get=> #{} -->
<mapper namespace="UserMapper05">
<insert id="addUser" parameterType="user">
INSERT INTO users(user_id, user_name, password, age, grade, reg_date)
values(#{userId}, #{userName}, #{password}, #{age}, #{grade}, #{regDate})
</insert>
<update id="updateUser" parameterType="user">
update users
set user_name = #{userName}
where user_id = #{userId}
</update>
<delete id="removeUser" parameterType="string">
DELETE
FROM users
WHERE user_id = #{value}
</delete>
</mapper>
MyBatisTestApp05.java
package ibatis.services.user.test;
import ibatis.services.domain.User;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/*
* FileName : MyBatisTestApp05.java
* ㅇ SqlMapConfig01.xml / mybatis-userservice-mapping05.xml
* ㅇ My Framework 이용 QUERY ( SELECT ) TEST
*
*/
public class MyBatisTestApp05 {
///Main method
public static void main(String[] args) throws Exception{
///==> SqlMapConfig.xml : MyBATIS Framework 의 핵심 환경설정화일 (MetaData)
//==> mybatis-userservice-mapping.xml : SQL 를 갖는 설정화일 (MetaData)
//==> 1. xml metadata 읽는 Stream 생성
Reader reader=Resources.getResourceAsReader("config/SqlMapConfig.xml");
//==> 2. Reader 객체를 이용 xml metadata 에 설정된 각정 정보를 접근, 사용가능한
//==> SqlSession 객체 생성
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(reader);
SqlSession session=factory.openSession();
//==> Test 용 User instance 생성 및 age / regData null setting
//==>@@@ mysql은 null값을 허용하지만, 오라클 일때는 null값을 허용할려면 SqlMapConfig.xml에 Settings 태그를 부착해야한다.@@@
// settings에 하위 setting이 있는데 처음 properties 밑에 들어가야합니다. 다른 위치일 경우 에러가 날 수 있습니다.
User user = new User("user04","주몽","user04",null,1);
user.setRegDate(null);
//1. User05.addUser Test :: users table age/grade/redDate 입력값 확인할것 : OK
System.out.println(":: 1. addUser(INSERT) ? "
+ session.insert("UserMapper05.addUser",user)); //1.
session.commit();
System.out.println("\n");
//2. User05.addUser Test :: users table age/grade/redDate 입력값 확인할것 : OK
user.setUserId("user05");
System.out.println(":: 2. addUser(INSERT) ? "
+ session.insert("UserMapper05.addUser",user));//1
session.commit();
System.out.println("\n");
//3. User05.uadateUser Test :: users table age/redDate 입력값 확인할것 : OK
// :: 주몽 ==> 온달 수정
user.setUserName("온달");
System.out.println(":: 2. update(UPDATE) ? "
+ session.update("UserMapper05.updateUser",user));//1
session.commit();
}//end of main
}//end of class
mybatis-userservice-mapping07.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">
<!-- ResultMap:: as를(alias) 계속 주기 귀찮다. 그래서 이걸 사용합니다. select쿼리문에서만 사용된다.
Dynamic Query
-->
<!--
resultMap 사용
<select id="getUserList" parameterType="user" resultType="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
where user_id=#{userName} AND age = #{age}
</select> -->
<mapper namespace="UserMapper07">
<resultMap type="user" id="userSelectRM">
<result property="userId" column="user_Id"/>
<result property="userName" column="user_name"/>
<result property="password" column="password"/>
<result property="grade" column="grade"/>
<result property="regDate" column="reg_date"/>
</resultMap>
<select id="getUserList" parameterType="user" resultType="user" resultMap="userSelectRM">
select
user_id,
user_name,
password,
age,
grade,
reg_date
from users
where user_name=#{userName}
</select>
<!--위 쿼리는 정적인 쿼리(static Query)
정적인 쿼리(static Query): SELECT 문에서 where절 조건을 어떻게 주느냐에 따라서 계속적으로 서로 다른 select문이 만들어지는 쿼리
동적인 쿼리 (Dynamic Query): SELECT 문에서 where절 조건이 바뀌더라도 하나의 SELECT문으로 커버될 수 있는 쿼리
즉, 하나의 SELECT 문으로 4,5개 이상의 WHERE 절을 소화 할 수 있다.
-->
<select id="getUserList01" parameterType="user" resultType="user" resultMap="userSelectRM">
select user_id, user_name, password, age,grade, reg_date
from users
<where>
<if test="userName !=null">
user_name LIKE #{userName}
</if>
<if test="age !=null">
OR age LIKE #{age}
</if>
</where>
ORDER BY user_id DESC
</select>
</mapper>
TestUtil.java
package ibatis.services.user.test;
import ibatis.services.domain.User;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
//SqlSessionFactory를 생성하는 놈..
public class TestUtil {
public static void printList(List<User> list){
for(int i=0; i<list.size();i++){
System.out.println("<"+(i+1+"> 번쨰 회원...."+list.get(i).toString()));
}
System.out.println("\n");
}
public static SqlSessionFactory getSqlSessionFactory() throws IOException{
Reader reader = Resources.getResourceAsReader("config/SqlMapConfig.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(reader);
return factory;
}
}
MyBatisTestApp07.java
package ibatis.services.user.test;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import ibatis.services.domain.User;
/*
* FileName : MyBatisTestApp07.java
* ㅇ SqlMapConfig.xml / mybatis-userservice-mapping07.xml
* ㅇ MyBATIS Framework 이용 Dynamic query ( SELECT ) TEST
* ㅇ TestUtil.java 을 이용 Test .
*/
public class MyBatisTestApp07 {
///Main method
public static void main(String[] args) throws Exception{
SqlSession session = null;
//==> TestUtil 의 getSqlSessionFactory()을 이용 SqlSessionFactory instance GET
SqlSessionFactory factory = TestUtil.getSqlSessionFactory();
session=factory.openSession();
//==> Test 용 UserVO instance 생성
User user = new User("user01","홍길동","user01",new Integer(30),1);
//1. UserMapper07.getUserList01 Test
System.out.println(":: 1. getUserList01(SELECT) ? ");
TestUtil.printList((List)session.selectList("UserMapper07.getUserList01",user));
//2. UserMapper07.getUserList01 Test
System.out.println(":: 2. getUserList01(SELECT) ? ");
user.setUserName(null);
TestUtil.printList((List)session.selectList("UserMapper07.getUserList01",user) );
//3. UserMapper07.getUserList01 Test
System.out.println(":: 3. getUserList01(SELECT) ? ");
user.setUserName("홍길동");
user.setAge(null);
TestUtil.printList((List)session.selectList("UserMapper07.getUserList01",user) );
//4. UserMapper07.getUserList01 Test ..이경우는 조건을 안준거와 동일한 결과가 나온다..
System.out.println(":: 4. getUserList01(SELECT) ? ");
user.setUserName(null);
user.setAge(null);
TestUtil.printList((List)session.selectList("UserMapper07.getUserList01",user) );
}//end of main
}//end of class
mybatis-userservice-mapping08.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">
<!--
SQL구문의 재사용성
1) sql
2) include
-->
<mapper namespace="UserMapper08">
<resultMap type="user" id="userSelectRM">
<result property="userId" column="user_Id"/>
<result property="userName" column="user_name"/>
<result property="password" column="password"/>
<result property="grade" column="grade"/>
<result property="regDate" column="reg_date"/>
</resultMap>
<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>
<!--정적인 쿼리 & sql 재사용성 없음 -->
<select id="getUserList" parameterType="user" resultType="user" resultMap="userSelectRM">
select user_id, user_name, password, age,grade, reg_date
from users
where user_name=#{userName}
</select>
<!--동적인 쿼리 & sql 재사용성 있음 -->
<select id="getUserList01" parameterType="user" resultType="user" resultMap="userSelectRM">
<include refid="select-users"></include>
<where>
<if test="userName !=null">
user_name LIKE #{userName}
</if>
<if test="age !=null">
OR age LIKE #{age}
</if>
</where>
<include refid="orderby-userid-desc"></include>
</select>
</mapper>
MyBatisTestApp08.java
package ibatis.services.user.test;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import ibatis.services.domain.User;
/*
* FileName : MyBatisTestApp08.java
* ㅇ SqlMapConfig01.xml / mybatis-userservice-mapping08.xml
* ㅇ MyBATIS Framework 이용 Dynamic query ( SELECT ) TEST | sql구문의 Module화
* ㅇ TestUtil.java 을 이용 Test .
*
* ㅇ 다음은 MyBatisTestApp101.java : MyBatis Framework 단위 테스트
*/
public class MyBatisTestApp08 {
///Main method
public static void main(String[] args) throws Exception{
SqlSession session = null;
//==> TestUtil 의 getSqlSessionFactory()을 이용 SqlSessionFactory instance GET
SqlSessionFactory factory = TestUtil.getSqlSessionFactory();
session=factory.openSession();
//==> Test 용 User instance 생성
User user = new User("user01","홍길동","user01",new Integer(30),1);
//1. User08.getUserList01 Test
System.out.println(":: 1. getUserList01(SELECT) ? ");
TestUtil.printList( (List)session.selectList("UserMapper08.getUserList01",user));
//2. User08.getUserList01 Test
System.out.println(":: 2. getUserList01(SELECT) ? ");
user.setUserName(null);
TestUtil.printList( (List)session.selectList("UserMapper08.getUserList01",user) );
//3. User08.getUserList01 Test
System.out.println(":: 3. getUserList01(SELECT) ? ");
user.setUserName("홍길동");
user.setAge(null);
TestUtil.printList( (List)session.selectList("UserMapper08.getUserList01",user));
//4. User08.getUserList01 Test
System.out.println(":: 4. getUserList01(SELECT) ? ");
user.setUserName(null);
user.setAge(null);
TestUtil.printList( (List)session.selectList("UserMapper08.getUserList01",user) );
}//end of main
}//end of class
mybatis-userservice-mapping10.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="UserMapper10">
<!-- <resultMap type="user" id="userSelectRM">
<result property="userId" column="user_Id"/>
<result property="userName" column="user_name"/>
<result property="password" column="password"/>
<result property="grade" column="grade"/>
<result property="regDate" column="reg_date"/>
</resultMap> -->
<insert id="addUser" parameterType="user">
INSERT INTO users(user_id, user_name, password, age, grade, reg_date)
values(#{userId}, #{userName}, #{password}, #{age}, #{grade}, #{regDate})
</insert>
<update id="updateUser" parameterType="user">
update users
set user_name = #{userName}
where user_id = #{userId}
</update>
<delete id="removeUser" parameterType="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>
<!--정적인 쿼리 & sql 재사용성 있음-->
<select id="getUser" parameterType="user" resultType="user">
<include refid="select-users" />
where user_id=#{userId}
</select>
<!--동적인 쿼리 & sql 재사용성 있음 -->
<select id="getUserList" parameterType="user" resultType="user">
<include refid="select-users"></include>
<where>
<if test="userName !=null">
user_name LIKE #{userName}
</if>
<if test="age !=null">
OR age LIKE #{age}
</if>
</where>
<include refid="orderby-userid-desc"></include>
</select>
</mapper>
MyBatisTestApp101.java
package ibatis.services.user.test;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import ibatis.services.domain.User;
/*
* FileName : MyBatisTestApp101.java
* ㅇ SqlMapConfig.xml / mybatis-userservice-mapping10.xml
* ㅇ TestUtil.java 을 이용 Test .
* ㅇ 이거 돌아가면 MyBatis Framework 단위테스트는 잘 된거다...mybatis-userservice-mapping10.xml은 문제 없다.
*
* ㅇ 다음은 Persistance Logic 단위테스트 : MyBatisTestApp102.java
* ㅇ MyBatisUserDAOImpl10 / UserDAO 추가해야한다.
*/
public class MyBatisTestApp101 {
///Main method
public static void main(String[] args) throws Exception{
SqlSession session = null;
//==> TestUtil 의 getSqlSessionFactory()을 이용 SqlSessionFactory instance GET
SqlSessionFactory factory = TestUtil.getSqlSessionFactory();
session=factory.openSession();
//==> Test 용 User instance 생성
User user = new User("user04","주몽","user04",null,1);
//1. User10.addUser Test :: users table age/grade/redDate 입력값 확인할것 : OK
System.out.println(":: 1. addUser(INSERT) ? "
+ session.insert("UserMapper10.addUser",user)); //1
session.commit();
//2. User10.getUser Test :: 주몽 inert 확인
System.out.println(":: 2. getUser(SELECT) ? ");
System.out.println(" :: "+session.selectOne("UserMapper10.getUser",user.getUserId()) );
//3. User10.uadateUser Test :: users table age/redDate 입력값 확인할것 : OK
// :: 주몽 ==> 온달 수정
user.setUserName("온달");
System.out.println(":: 3. update(UPDATE) ? "
+ session.update("UserMapper10.updateUser",user));//1
session.commit();
//4. User10.getUserList Test :: Dynamic Query 확인 id=user04/name=온달 검색
System.out.println(":: 4. getUserList(SELECT) ? ");
TestUtil.printList( (List)session.selectList("UserMapper10.getUserList",user) );
//5. User10.removeUser Test
System.out.println(":: 5. Use10.removeUser (DELETE) ? "
+session.delete("UserMapper10.removeUser",user.getUserId()) );//1
session.commit();
//6. User10.getUserList Test :: Dynamic Query 확인 id=user04/name=온달 검색
System.out.println(":: 6. getUserList(SELECT) ? ");
TestUtil.printList((List) session.selectList("UserMapper10.getUserList",user) ); //이때 위의 기능 리턴타입이 0인걸 확인하자
//7. User10.getUserList Test :: Dynamic Query 확인 id=null/name=null 인경우
user.setUserId(null);
user.setUserName(null);
System.out.println(":: 7. getUserList(SELECT) ? ");
TestUtil.printList( (List) session.selectList("UserMapper10.getUserList",user) );
}//end of main
}//end of class
Persistence layer 설계
UserDAO.java(interface)
package ibatis.services.user;
import java.util.List;
import ibatis.services.domain.User;
/*
* 비지니스 로직의 템플릿이 들어있다.
* 5개.... mybatis-userservice-mapping10.xml
* mapping10.xml의 쿼리문 id값이 비지니스로직의 이름이 된다.
* 비지니스 로직의 인자값은 parameterType을 참조
* 비지니스 로직의 리턴값은 resultType을 참조
* 일관성 및 편의성을 위해서 위와 같이 해야합니다.
*/
public interface UserDAO {
int addUser(User user) throws Exception;
int updateUser(User user) throws Exception;
int removeUser(String userId) throws Exception;
User getUser(String userId) throws Exception;
List<User> getUserList(User user) throws Exception;
}
MyBatisUserDAOImpl10.java
package ibatis.services.user.impl;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import ibatis.services.domain.User;
import ibatis.services.user.UserDAO;
/*
* Persistence Layer Componenet(Bean)
* SqlSession을 Hasing하는 클래스
* 1) 필드에 SqlSession을 선언
* 2) setter로 주입
*/
public class MyBatisUserDAOImpl10 implements UserDAO{
private SqlSession sqlSession;
public void setSqlSession(SqlSession sqlSession) {
this.sqlSession = sqlSession;
System.out.println("::"+getClass().getName()+".setSqlSession() Call....");
}
@Override
public int addUser(User user) throws Exception {
int result=sqlSession.insert("UserMapper10.addUser", user);
return result;
}
@Override
public int updateUser(User user) throws Exception {
int result = sqlSession.update("UserMapper10.updateUser",user);
return result;
}
@Override
public int removeUser(String userId) throws Exception {
int result = sqlSession.delete("UserMapper10.removeUser",userId);
return result;
}
@Override
public User getUser(String userId) throws Exception {
User user = sqlSession.selectOne("UserMapper10.getUser", userId);
return user;
}
@Override
public List<User> getUserList(User user) throws Exception {
List<User> userList = sqlSession.selectList("UserMapper10.getUserList", user);
return userList;
}
}
MyBatisTestApp102.java
package ibatis.services.user.test;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import ibatis.services.domain.User;
import ibatis.services.user.impl.MyBatisUserDAOImpl10;
/*
* FileName : MyBatisTestApp102.java
* ㅇ SqlMapConfig01.xml / mybatis-userservice-mapping10.xml
* ㅇ MyBatisUserDAOImpl10
* ㅇ TestUtil.java 을 이용 Test .
* ㅇ Persistance Logic Layer 단위 Test..여기서 에러난다고해도 mybatis-userservice-mapping10.xml는 볼 필요없다.
* ::Persistence Layer의 단위테스트 마무리
*
* ㅇ 다음은 Service Layer 단위 테스트 : MyBatisTestApp11.java
*/
public class MyBatisTestApp102 {
///Main method
public static void main(String[] args) throws Exception{
SqlSession session = null;
//==> TestUtil 의 getSqlSessionFactory()을 이용 SqlSessionFactory instance GET
SqlSessionFactory factory = TestUtil.getSqlSessionFactory();
session=factory.openSession();
//==> MyBatisUserDAOImpl10 생성 및 sqlMapClient 객체 setter injection
MyBatisUserDAOImpl10 dao = new MyBatisUserDAOImpl10();
dao.setSqlSession(session);
//==> Test 용 User instance 생성
User user = new User("user04","주몽","user04",null,1);
//1. MyBatisUserDAOImpl10.addUser Test
System.out.println(":: 1. addUser(INSERT) ? " + dao.addUser(user) );
//2. MyBatisUserDAOImpl10.getUser Test :: 주몽 inert 확인
System.out.println(":: 2. getUser(SELECT) ? \n " + dao.getUser(user.getUserId()) );
//3. MyBatisUserDAOImpl10.uadateUser Test
// :: 주몽 ==> 온달 수정
user.setUserName("온달");
System.out.println(":: 3. update(UPDATE) ? "+dao.updateUser(user) );
//4. MyBatisUserDAOImpl10.getUserList Test::Dynamic Query 확인 id=user04/name=온달 검색
System.out.println(":: 4. getUserList(SELECT) ? ");
TestUtil.printList( dao.getUserList(user) );
//5. MyBatisUserDAOImpl10.removeUser Test
System.out.println(":: 5. Use10.removeUser (DELETE) ? "
+dao.removeUser(user.getUserId()) );
//6. MyBatisUserDAOImpl10.getUserList Test
System.out.println(":: 6. getUserList(SELECT) ? ");
TestUtil.printList( dao.getUserList(user) );
//7. MyBatisUserDAOImpl10.getUserList Test
user.setUserId(null);
user.setUserName(null);
System.out.println(":: 7. getUserList(SELECT) ? ");
TestUtil.printList( dao.getUserList(user) );
}//end of main
}//end of class
Service Layer 설계
UserService.java(interface)
package ibatis.services.user;
import java.util.List;
import ibatis.services.domain.User;
/*
* 데이타 가공 레이어...
* 데이타 삭제는 완전 관련 없으므로 removeUser는 빼줍니다.
* 아래 리턴타입은 void로 변경해주는게 편할때가 있습니다.
*/
public interface UserService {
void addUser(User user) throws Exception;
void updateUser(User user) throws Exception;
User getUser(String userId) throws Exception;
List<User> getUserList(User user) throws Exception;
}
MyBatisUserServiceImpl11.java
package ibatis.services.user.impl;
import java.util.List;
import ibatis.services.domain.User;
import ibatis.services.user.UserDAO;
import ibatis.services.user.UserService;
public class MyBatisUserServiceImpl11 implements UserService {
private UserDAO userDAO;
public UserDAO getUserDAOl() {
return userDAO;
}
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
System.out.println("::"+getClass().getName()+".setUserDAO() Call.....");
}
@Override
public void addUser(User user) throws Exception {
userDAO.addUser(user);
}
@Override
public void updateUser(User user) throws Exception {
userDAO.updateUser(user);
}
@Override
public User getUser(String userId) throws Exception {
return userDAO.getUser(userId);
}
@Override
public List<User> getUserList(User user) throws Exception {
return userDAO.getUserList(user);
}
}
MyBatisTestApp11.java
package ibatis.services.user.test;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import ibatis.services.domain.User;
import ibatis.services.user.impl.MyBatisUserDAOImpl10;
import ibatis.services.user.impl.MyBatisUserServiceImpl11;
/*
* FileName : MyBatisTestApp11.java
* ㅇ SqlMapConfig01.xml / mybatis-userservice-mapping10.xml
* ㅇ MyBatisUserServiceImpl11
* ㅇ TestUtil.java 을 이용 Test .
* ㅇ Business Logic Layer 단위 Test..여기서 에러난다고해도 mybatis-userservice-mapping10.xml는 볼 필요없다.
* ㅇ MyBatisUserDAOImpl10(UserADO), MyBatisUserServiceImpl11(UserService)를 직접 작성한다.
*
* ㅇ해당 코드에서 여전히 new가 보인다...결국 아직까지 Spring과 연동하지 않았다는 것이다.
* ㅇ다음은 MyBatisTestApp12.java에서 메타데이타를 추가하겠다.
*/
public class MyBatisTestApp11 {
///Main method
public static void main(String[] args) throws Exception{
SqlSession session = null;
//==> TestUtil 의 getSqlSessionFactory()을 이용 SqlSessionFactory instance GET
SqlSessionFactory factory = TestUtil.getSqlSessionFactory();
session=factory.openSession();
//==> MyBatisUserDAOImpl10 생성 및 SqlSession 객체 setter injection
MyBatisUserDAOImpl10 dao = new MyBatisUserDAOImpl10();
dao.setSqlSession(session);
//==> IBatisUserServiceImpl11 생성 및 IBatisUserDAOImpl10 객체 setter injection
MyBatisUserServiceImpl11 userService = new MyBatisUserServiceImpl11();
userService.setUserDAO(dao);
//==> Test 용 User instance 생성
User user = new User("user04","주몽","user04",null,1);
//1. MyBatisUserServiceImpl11.addUser Test
System.out.println(":: 1. addUser(INSERT) ? ");
userService.addUser(user);
//2. MyBatisUserServiceImpl11.getUser Test :: 주몽 inert 확인
System.out.println(":: 2. getUser(SELECT) ? \n " + dao.getUser(user.getUserId()) );
//3. MyBatisUserServiceImpl11.uadateUser Test
// :: 주몽 ==> 온달 수정
user.setUserName("온달");
System.out.println(":: 3. update(UPDATE) ? ");
userService.updateUser(user) ;
//4. IBatisUserServiceImpl11.getUserList Test::Dynamic Query 확인 id=user04/name=온달 검색
System.out.println(":: 4. getUserList(SELECT) ? ");
TestUtil.printList( userService.getUserList(user) );
//5. MyBatisUserServiceImpl11.removeUser Test
//==> UserService 에는 removeUser가 없으므로, DAO에서 직접 호출 Test
System.out.println(":: 5. Use10.removeUser (DELETE) ? "
+dao.removeUser(user.getUserId()) );
//6. MyBatisUserServiceImpl11.getUserList Test
System.out.println(":: 6. getUserList(SELECT) ? ");
TestUtil.printList( userService.getUserList(user) );
//7. MyBatisUserServiceImpl11.getUserList Test
user.setUserId(null);
user.setUserName(null);
System.out.println(":: 7. getUserList(SELECT) ? ");
TestUtil.printList( userService.getUserList(user) );
}//end of main
}//end of class
이제 이것을 설정문서를 만들어서 DI container로 연결해 봅니다.
MyBatisUserDAOImpl12.java
package ibatis.services.user.impl;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import ibatis.services.domain.User;
import ibatis.services.user.UserDAO;
/*
* Persistence Layer Componenet(Bean)
* SqlSession을 Hasing하는 클래스
* 1) 필드에 SqlSession을 선언
* 2) setter로 주입
*/
public class MyBatisUserDAOImpl12 implements UserDAO{
private SqlSession sqlSession;
public void setSqlSession(SqlSession sqlSession) {
this.sqlSession = sqlSession;
System.out.println("::"+getClass().getName()+".setSqlSession() Call....");
}
@Override
public int addUser(User user) throws Exception {
int result=sqlSession.insert("UserMapper10.addUser", user);
return result;
}
@Override
public int updateUser(User user) throws Exception {
int result = sqlSession.update("UserMapper10.updateUser",user);
return result;
}
@Override
public int removeUser(String userId) throws Exception {
int result = sqlSession.delete("UserMapper10.removeUser",userId);
return result;
}
@Override
public User getUser(String userId) throws Exception {
User user = sqlSession.selectOne("UserMapper10.getUser", userId);
return user;
}
@Override
public List<User> getUserList(User user) throws Exception {
List<User> userList = sqlSession.selectList("UserMapper10.getUserList", user);
return userList;
}
}
MyBatisUserServiceImpl12.java
package ibatis.services.user.impl;
import java.util.List;
import ibatis.services.domain.User;
import ibatis.services.user.UserDAO;
import ibatis.services.user.UserService;
public class MyBatisUserServiceImpl12 implements UserService {
private UserDAO userDAO;
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
System.out.println("::"+getClass().getName()+".setUserDAO() Call.....");
}
@Override
public void addUser(User user) throws Exception {
userDAO.addUser(user);
}
@Override
public void updateUser(User user) throws Exception {
userDAO.updateUser(user);
}
@Override
public User getUser(String userId) throws Exception {
return userDAO.getUser(userId);
}
@Override
public List<User> getUserList(User user) throws Exception {
return userDAO.getUserList(user);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 1. DataSource API Bean -->
<!-- wiring하는 거임 context:property-placeholder location="classpath:conf/dbconn.properties" 중요함-->
<context:property-placeholder location="classpath:config/dbconn.properties"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"><!--라이브러리 찾아서 web-inf에 넣어줍니다.-->
<property name="driverClassName" value="${jdbc.mysql.driver}"/>
<property name="url" value="${jdbc.mysql.url}"/>
<property name="username" value="${jdbc.mysql.username}"/>
<property name="password" value="${jdbc.mysql.password}"/>
</bean>
<!-- 2. SqlSessionFactory API Bean -->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean"><!--라이브러리 찾아서 web-inf에 넣어줍니다.-->
<property name="configLocation" value="classpath:config/SqlMapConfig.xml" />
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 3. SqlSession API Bean -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactoryBean" /><!--얘는 꼭 생성자 주입으로 해줍니다. -->
</bean>
<!-- 4. DAOImpl12 사용자 정의 Bean -->
<bean id="myBatisUserDAOImpl12" class="ibatis.services.user.impl.MyBatisUserDAOImpl12">
<property name="sqlSession" ref="sqlSession" />
</bean>
<!-- 5. ServiceImpl12 사용자 정의 Bean-->
<bean id="myBatisUserServiceImpl12" class="ibatis.services.user.impl.MyBatisUserServiceImpl12">
<property name="userDAO" ref="myBatisUserDAOImpl12" />
</bean>
</beans>
MyBatisTestApp12.java
package ibatis.services.user.test;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import ibatis.services.domain.User;
import ibatis.services.user.UserDAO;
import ibatis.services.user.UserService;
/*
* FileName : MyBatisTestApp12.java
* ㅇ SqlMapConfig.xml / mybatis-userservice-mapping10.xml
* ㅇ MyBatisUserDAOImpl12 / MyBatisUserServiceImpl12(이건 이름만 바꿔줌)을 작성.
* ㅇ Spring meta data연동..userservice12.xml
*/
public class MyBatisTestApp12 {
///Main method
public static void main(String[] args) throws Exception{
// Beanfactory와 같다. ApplicationContext
ApplicationContext context =
new ClassPathXmlApplicationContext("/config/userservice12.xml");
//==> IoC Container 로 부터 획득한 UserDAO 인스턴스 획득
UserService userService = (UserService)context.getBean("myBatisUserServiceImpl12");
User user = new User("user04","주몽","user04",40,40);
System.out.println("///////////////////////////////////////////////////////////////////////////////////////");
//1.userService.addUser(user) Test
System.out.println(":: 1. add(INSERT) ? ");
userService.addUser(user);
System.out.println("///////////////////////////////////////////////////////////////////////////////////////");
//2.UserService.getUser(userId) Test
user = userService.getUser("user04");
System.out.println(":: 2. get(SELECT) ? "+user);
System.out.println("///////////////////////////////////////////////////////////////////////////////////////");
//3.UserService.uadateUser(user) Test
user.setUserName("장보고");
System.out.println(":: 3. update(UPDATE) ? ");
userService.updateUser(user);
System.out.println("///////////////////////////////////////////////////////////////////////////////////////");
//4.UserService.getUser(userId) Test
user = userService.getUser("user04");
System.out.println(":: 4. get(SELECT) ? "+user);
System.out.println("///////////////////////////////////////////////////////////////////////////////////////");
//5.UserDAO.removeUser(userId) Test
//==> UserService 에는 removeUser가 없으므로, DAO에서 직접 호출 Test
UserDAO userDAO = (UserDAO)context.getBean("myBatisUserDAOImpl12");
System.out.println(":: 5. remove(DELETE) ? "+userDAO.removeUser("user04"));
System.out.println("///////////////////////////////////////////////////////////////////////////////////////");
//6.UserService.getUserList() Test
System.out.println(":: 6. all User(SELECT) ? ");
List<User> list = userService.getUserList(new User());
for (int i =0 ; i < list.size() ; i++) {
System.out.print( "<"+ ( i +1 )+"> 번째 회원 정보... ");
System.out.println( list.get(i).toString() );
}
System.out.println("///////////////////////////////////////////////////////////////////////////////////////");
}//end of main
}//end of class
위와 같이 많은 라이브러리를 필요로 하는데, 이들 라이브러리 간에 의존성이 있음을 알 수 있습니다. 그렇기 때문에 라이브러리간에 버전에도 상당히 영향을 받습니다. 실제로 mybatis-3.5.5.jar와 mybatis-spring-1.3.2일 때는 에러를 보였지만, 그보다 낮은 버전의 라이브러리를 썼을 때는 상호작용이 잘되어 에러없이 잘 실행이 되었습니다.
이렇게 각각의 spring 라이브러리 + 다른 라이브러리 버전 관리가 상당히 어려운 일입니다. 이 때문에 이를 해결해결하기위해 Maven을 사용해야합니다. 이보다더 더 쉽게 개발 하기 위해서 Spring boot를 사용합니다.
그전에 설정문서를 조금더 간단하게 만들기 위해서 기존에 했던 xml기반의 코드를
annotation기반으로 바꿉니다.
Bean도 많아지고, 복잡해지고 그러다보니까, XML에 있는 내용을 줄이고자 하는 노력이 발생하게 됩니다. 그래서 annotation이 사용되어 집니다. 각 컴포넌트위에 어노테이션을 해줄수 있습니다. 각각의 layer에 어느 layer있는 컨포넌트인지 알기 위해서 구분해줍니다.
Layer에 따른 component annotation의 종류
@component
1) Persistence layer: @repository
2) Service layer: @Service
3) Presentation layer: @Controller
- userservice13.xml에 bean을 없애 주려면 먼저 component에 각 layer에 맞는 annotation을 해줍니다.
- 그리고 필드위에 알아서 주입시키라는 의미?에서 @Autowired를 위에 annotation해주게 됩니다.
- 그리고 해당하는 setter를 지워주게 됩니다.
- 이런 다음에 xml에서 해당 bean을 없애 줍니다.
- 그런다음에 어느 package에 없앤 bean에 해당하는 component를 읽어들일 것인지 알수 있게끔 xml 문서에 써줍니다.
<context:component-scan base-package="ibatis.services.user.impl"></context:component-scan>
이렇게 해주면, field의 갯수에 따라서 setter/getter가 늘어나고 줄어드는 문제로 인해 떨어지는 재사용성을 방지 할 수 있게 됩니다.
annotation기반으로 코드를 작성하게 되면, 설정문서 자체가 간단해지고 코드의 작성에 있어서는 상당히 간단해 집니다. 하지만, 전체적인 내용을 파악하고 유지보수하는데 있어서는 XML기반이 좋습니다.
예제 코드입니다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 1. DataSource API Bean -->
<!-- wiring하는 거임 context:property-placeholder location="classpath:conf/dbconn.properties" 중요함-->
<context:property-placeholder location="classpath:config/dbconn.properties"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"><!--라이브러리 찾아서 web-inf에 넣어줍니다.-->
<property name="driverClassName" value="${jdbc.mysql.driver}"/>
<property name="url" value="${jdbc.mysql.url}"/>
<property name="username" value="${jdbc.mysql.username}"/>
<property name="password" value="${jdbc.mysql.password}"/>
</bean>
<!-- 2. SqlSessionFactory API Bean -->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean"><!--라이브러리 찾아서 web-inf에 넣어줍니다.-->
<property name="configLocation" value="classpath:config/SqlMapConfig.xml" />
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 3. SqlSession API Bean -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactoryBean" /><!--얘는 꼭 생성자 주입으로 해줍니다. -->
</bean>
<!--이 부분이 사라집니다. -->
<!-- ===================================================================================================== -->
<!-- 4. DAOImpl12 사용자 정의 Bean -->
<!-- <bean id="myBatisUserDAOImpl12" class="ibatis.services.user.impl.MyBatisUserDAOImpl12">
<property name="sqlSession" ref="sqlSession" />
</bean> -->
<!-- 5. ServiceImpl12 사용자 정의 Bean -->
<!-- <bean id="myBatisUserServiceImpl12" class="ibatis.services.user.impl.MyBatisUserServiceImpl12">
<property name="userDAO" ref="myBatisUserDAOImpl12" />
</bean> -->
<!-- ===================================================================================================== -->
<context:component-scan base-package="ibatis.services.user.impl"></context:component-scan>
</beans>
MyBatisUserDAOImpl13.java
package ibatis.services.user.impl;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import ibatis.services.domain.User;
import ibatis.services.user.UserDAO;
@Repository
public class MyBatisUserDAOImpl13 implements UserDAO{
@Autowired
private SqlSession sqlSession;
/*
* Autowired 시키면, 아래 setSqlSession을 지워줍니다. 이렇게 한다음에 xml에서 지워줍니다.
*
* public void setSqlSession(SqlSession sqlSession) {
* this.sqlSession = sqlSession;
* System.out.println("::"+getClass().getName()+".setSqlSession() Call...."); }
*/
@Override
public int addUser(User user) throws Exception {
int result=sqlSession.insert("UserMapper10.addUser", user);
return result;
}
@Override
public int updateUser(User user) throws Exception {
int result = sqlSession.update("UserMapper10.updateUser",user);
return result;
}
@Override
public int removeUser(String userId) throws Exception {
int result = sqlSession.delete("UserMapper10.removeUser",userId);
return result;
}
@Override
public User getUser(String userId) throws Exception {
User user = sqlSession.selectOne("UserMapper10.getUser", userId);
return user;
}
@Override
public List<User> getUserList(User user) throws Exception {
List<User> userList = sqlSession.selectList("UserMapper10.getUserList", user);
return userList;
}
}
MyBatisUserServiceImpl13.java
package ibatis.services.user.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import ibatis.services.domain.User;
import ibatis.services.user.UserDAO;
import ibatis.services.user.UserService;
@Service
public class MyBatisUserServiceImpl13 implements UserService {
@Autowired
private UserDAO userDAO;
@Override
public void addUser(User user) throws Exception {
userDAO.addUser(user);
}
@Override
public void updateUser(User user) throws Exception {
userDAO.updateUser(user);
}
@Override
public User getUser(String userId) throws Exception {
return userDAO.getUser(userId);
}
@Override
public List<User> getUserList(User user) throws Exception {
return userDAO.getUserList(user);
}
}
DataSource 관련 내용
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>
<!--1. properties 파일 연결 -->
<!-- <properties resource="config/dbconn.properties" /> -->
<!-- Oracle일 경우 null 값을 허용하지 않기에 반드시 옵션을 추가해야 실행될 수 있다.
settings tag의 위치는 반드시 여기에 와야하고 NULL 값을 반드시 대문자로 해야합니다.
-->
<settings>
<!-- <setting name="jdbcTypeForNull" value="NULL"/> -->
<setting name="mapUnderscoreToCamelCase" value="True"/>
</settings>
<!-- 2.vo 연결 및 alias 지정 -->
<typeAliases>
<typeAlias type="ibatis.services.domain.User" alias="user"/>
</typeAliases>
<!-- 3.디비서버 정보 -->
<environments default="develop">
<environment id="develop">
<transactionManager type="JDBC" />
<dataSource type="UNPOOLED">
<property name="driver" value="${jdbc.mysql.driver}"/>
<property name="url" value="${jdbc.mysql.url}"/>
<property name="username" value="${jdbc.mysql.username}"/>
<property name="password" value="${jdbc.mysql.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="sql/mybatis-userservice-mapping.xml"/>
<mapper resource="sql/mybatis-userservice-mapping01.xml"/>
<mapper resource="sql/mybatis-userservice-mapping02.xml"/>
<mapper resource="sql/mybatis-userservice-mapping03.xml"/>
<mapper resource="sql/mybatis-userservice-mapping05.xml"/>
<mapper resource="sql/mybatis-userservice-mapping07.xml"/>
<mapper resource="sql/mybatis-userservice-mapping08.xml"/>
<mapper resource="sql/mybatis-userservice-mapping10.xml"/>
</mappers>
</configuration>
여기서에서 DB 서버정보라고 표시된 부분이 있습니다. 이 부분은 사실상 DI container로 연결할때는 필요가 없습니다.
여기에 있던 것은 단순히 Driver Manager Loading 방식으로 MyBatis frame work와 각 layer의 유닛테스트에 사용 할 수 있게 해주는 역할입니다. 이것을 설정문서를 만들때 그대로 둬도 되고 주석으로 막아도 됩니다. Setting도 선택사항이라고 한다면 SqlMapConfig.xml에서 필요한 것은 vo와 연결하고 alias를 주는 부분과 mappers 부분입니다.
datasource 부분은 아래와 같이 설정문서 1번에 들어가게 됩니다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 1. DataSource API Bean -->
<!-- wiring하는 거임 context:property-placeholder location="classpath:conf/dbconn.properties" 중요함-->
<context:property-placeholder location="classpath:config/dbconn.properties"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"><!--라이브러리 찾아서 web-inf에 넣어줍니다.-->
<property name="driverClassName" value="${jdbc.mysql.driver}"/>
<property name="url" value="${jdbc.mysql.url}"/>
<property name="username" value="${jdbc.mysql.username}"/>
<property name="password" value="${jdbc.mysql.password}"/>
</bean>
<!-- 2. SqlSessionFactory API Bean -->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean"><!--라이브러리 찾아서 web-inf에 넣어줍니다.-->
<property name="configLocation" value="classpath:config/SqlMapConfig.xml" />
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 3. SqlSession API Bean -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactoryBean" /><!--얘는 꼭 생성자 주입으로 해줍니다. -->
</bean>
<!-- 4. DAOImpl12 사용자 정의 Bean -->
<bean id="myBatisUserDAOImpl12" class="ibatis.services.user.impl.MyBatisUserDAOImpl12">
<property name="sqlSession" ref="sqlSession" />
</bean>
<!-- 5. ServiceImpl12 사용자 정의 Bean-->
<bean id="myBatisUserServiceImpl12" class="ibatis.services.user.impl.MyBatisUserServiceImpl12">
<property name="userDAO" ref="myBatisUserDAOImpl12" />
</bean>
</beans>
'컴퓨터 프로그래밍 > SpringFrameWork' 카테고리의 다른 글
[SFW]02 (0) | 2020.08.04 |
---|---|
[SFW]01 (0) | 2020.08.03 |