MyBatis는 iBATIS의 새로운 버전으로 국내에서 가장 많이 사용되는 ORM Framework 중 하나이다. MyBatis는 문서화가 잘 되어 있다고 하지만 막상 실전에 적용시키기에는 이전 버전인 iBATIS에 비해 예제가 부족하다. 그래서 자료도 정리할겸 간단한 에제를 작성며 레퍼런스를 만들어 볼까 한다. 우선 MyBatis를 설정하고 간단한 예제를 만들어 본 다음, Spring 3로 Bean을 등록하는 예제로 확장시켜 볼 예정이다.
MySQL Table
CREATE TABLE user (
id INT(5) NOT NULL PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(16) NOT NULL,
password VARCHAR(16) NOT NULL,
level INT(2) NOT NULL DEFAULT '0',
reg_date DATE NOT NULL
);
Configuration
development.properties
url=jdbc:mysql://localhost/development?characterEncoding=utf-8
driver=com.mysql.jdbc.Driver
user=development
pass=test123
mysql-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>
<properties resource="exercise/mybatis3/persistence/development.properties"/>
<settings>
<setting name="defaultExecutorType" value="REUSE"/>
<setting name="useGeneratedKeys" value="true"/>
</settings>
<typeAliases>
<!-- Type Aliases List -->
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="JNDI">
<property name="initial_context" value="java:comp/env" />
<property name="data_source" value="jdbc/insure"/>
</dataSource>
</environment>
<environment id="testing">
<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${user}" />
<property name="password" value="${pass}" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- Mapper List -->
</mappers>
</configuration>
SQL Mapper
UserMapper.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="exercise.mybatis3.persistence.UserMapper">
<insert id="add" parameterType="User"
useGeneratedKeys="true" keyProperty="id">
INSERT INTO user (username, password, level, reg_date)
VALUES (#{username}, #{password}, 1, NOW())
</insert>
<select id="count" resultType="int">
SELECT COUNT(*) FROM user
</select>
</mapper>
UserMapper.java
package exercise.mybatis3.persistence;
import exercise.mybatis3.domain.User;
public interface UserMapper {
public void add(User user);
public int count();
}
Domain Object
User.java
package exercise.mybatis3.domain;
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String username;
private String password;
private Integer level;
private String regDate;
public User() {
// TODO Auto-generated constructor stub
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getLevel() {
return level;
}
public void setLevel(Integer level) {
this.level = level;
}
public String getRegDate() {
return regDate;
}
public void setRegDate(String regDate) {
this.regDate = regDate;
}
}
Unit Test
TestUserMapper.java
package exercise.mybatis3.test;
import static org.junit.Assert.assertThat;
import static org.hamcrest.CoreMatchers.is;
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;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import exercise.mybatis3.domain.User;
import exercise.mybatis3.persistence.UserMapper;
public class TestUserMapper {
static SqlSessionFactory sf;
User user;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
String resource = "exercise/mybatis3/persistence/mybatis-config.xml";
Reader reader = Resources.getResourceAsReader(resource);
sf = new SqlSessionFactoryBuilder().build(reader, "testing");
}
@Before
public void setUp() {
user = new User("user1", "1234");
}
@Test
public void testAdd() {
SqlSession session = sf.openSession();
try {
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.add(user);
assertThat(1, is(mapper.count()));
} finally {
session.close();
}
}
}
SQL Mapper (CRUD)
UserMapper.xml
<mapper namespace="exercise.mybatis3.persistence.UserMapper">
<insert id="add" parameterType="User"
useGeneratedKeys="true" keyProperty="id">
INSERT INTO user (username, password, level, reg_date)
VALUES (#{username}, #{password}, #{level}, #{regDate})
</insert>
<select id="get" parameterType="int" resultType="User">
SELECT
id, username, password, level, reg_date AS 'regDate'
FROM user
WHERE id = #{id}
</select>
<select id="getAll" resultType="User">
SELECT
id, username, password, level, reg_date AS 'regDate'
FROM user
</select>
<delete id="delete" parameterType="int">
DELETE FROM user
WHERE id = #{id}
</delete>
<delete id="deleteAll">
DELETE FROM user
</delete>
<select id="count" resultType="int">
SELECT COUNT(*) FROM user
</select>
<select id="lastId" resultType="int">
SELECT id
FROM user
ORDER BY id DESC
LIMIT 1
</select>
</mapper>
Mapper Interface Class (CRUD)
UserMapper.java
public interface UserMapper {
public void add(User user);
public User get(int id);
public List<user> getAll();
public void delete(int id);
public void deleteAll();
public int count();
public int lastId();
}
Domain Object
User.java
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String username;
private String password;
private Integer level;
private String regDate;
public User() {
// TODO Auto-generated constructor stub
}
public User(String username, String password, Integer level, String regDate) {
this.username = username;
this.password = password;
this.level = level;
this.regDate = regDate;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getLevel() {
return level;
}
public void setLevel(Integer level) {
this.level = level;
}
public String getRegDate() {
return regDate;
}
public void setRegDate(String regDate) {
this.regDate = regDate;
}
@Override
public boolean equals(Object comp) {
User target = (User) comp;
if (this.id.equals(target.id) && this.username.equals(target.username) && this.password.equals(target.password) && this.level.equals(target.level) && this.regDate.equals(target.regDate))
return true;
else
return false;
}
}
Unit test (CRUD)
TestUserMapper.java
public class TestUserMapper {
static SqlSessionFactory sf;
List<user> users;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
String resource =
"exercise/mybatis3/persistence/mybatis-config.xml";
Reader reader = Resources.getResourceAsReader(resource);
sf = new SqlSessionFactoryBuilder().build(reader, "testing");
}
@Before
public void setUp() {
users = Arrays.asList(
new User("user1", "1234", 1, "2012-11-09"),
new User("user2", "1234", 1, "2012-11-09"),
new User("user3", "1234", 1, "2012-11-09")
);
}
@Test
public void testAdd() {
SqlSession session = sf.openSession();
try {
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.deleteAll();
mapper.add(users.get(0));
assertThat(1, is(mapper.count()));
} finally {
session.close();
}
}
@Test
public void testGet() {
SqlSession session = sf.openSession();
try {
UserMapper mapper =
session.getMapper(UserMapper.class);
mapper.deleteAll();
mapper.add(users.get(0));
User user = mapper.get(mapper.lastId());
assertTrue((users.get(0)).equals(user));
} finally {
session.close();
}
}
@Test
public void testGetAll() {
SqlSession session = sf.openSession();
try {
UserMapper mapper =
session.getMapper(UserMapper.class);
mapper.deleteAll();
for (User user : users) {
mapper.add(user);
}
assertThat(users.size(), is(mapper.count()));
} finally {
session.close();
}
}
@Test
public void testDelete() {
SqlSession session = sf.openSession();
try {
UserMapper mapper =
session.getMapper(UserMapper.class);
mapper.deleteAll();
for (User user : users) {
mapper.add(user);
}
mapper.delete(mapper.lastId());
assertThat(users.size() - 1, is(mapper.count()));
} finally {
session.close();
}
}
}
}
728x90
'■ Data Skill ■ > MyBatis' 카테고리의 다른 글
[iBatis] iBatis- LIKE 조건, IN 조건 만들기 (0) | 2023.02.25 |
---|---|
[iBatis] iBatis LIKE 구문과 Dynamic SQL을 사용할 때 (0) | 2023.02.25 |
[iBatis] iBatis 소스 생성 툴 ibator의 간단한 사용법 (0) | 2023.02.25 |
댓글