개키우는개발자 : )

MyBatis(마이바티스) 애플리케이션 작성(1) 본문

JAVA/Spring Framework

MyBatis(마이바티스) 애플리케이션 작성(1)

DOGvelopers 2019. 2. 9. 16:20
반응형

Spring Framework MyBatis(마이바티스) 

애플리케이션 작성(1)

학습 목표

** sqlSession 을 이용한 sql 쿼리 처리 **

  • MyBatis 및 MyBatis-Spring 설치
  • MyBatis 및 MyBatis-Spring 설정
  • DAO 클래스 작성 및 테스트

1.MyBatis 및 MyBatis-Spring 설치

1-1 MyBatis 라이브러리 검색 및 설치

maven repository 경로  https://mvnrepository.com/artifact/org.mybatis/mybatis/3.4.6

가장 많이 사용하는 버전으로 pick

1
2
3
4
5
6
7
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.6</version>
</dependency>
 
cs

1-1 MyBatis 라이브러리 검색 및 설치

maven repository 경로  https://mvnrepository.com/artifact/org.mybatis/mybatis-spring/1.3.2

역시 가장 많이 사용하는 버전

1
2
3
4
5
6
7
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.2</version>
</dependency>
 
cs


2.MyBatis 및 MyBatis-Spring 설정


2-1 MyBatis-Spring의 주요 컴포넌트

2-3 mybatisBeans.xml 설정파일

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?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"
    xmlns:aop="http://www.springframework.org/schema/aop"
    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-3.2.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
 
    <context:property-placeholder location="classpath:config/datasource.properties"/>
    
    <!-- DataSource 설정 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
        <property name="driverClass" value="${db.driverClass}" />
        <property name="url" value="${db.url}"/>
        <property name="username" value="${db.username}" />
        <property name="password" value="${db.password}" />
    </bean>
    
    <!-- Mapper 설정 -->
    <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="mapperInterface" value="myspring.user.dao.UserMapper" />
        <property name="sqlSessionTemplate" ref="sqlSession" />
    </bean
    <!-- MyBatis 설정 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:config/SqlMapConfig.xml" />
        <property name="mapperLocations">
            <list>
                <value>classpath:mapper/User.xml</value>
            </list>
        </property>
    </bean>
    
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" >
        <constructor-arg ref="sqlSessionFactory" />
    </bean>
    
    <!-- 트랜잭션 관리를 위한 bean  -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
          <property name="dataSource" ref="dataSource" />
    </bean>
    
    <context:component-scan base-package="myspring.user,myspring.aop.annot" />
    
</beans>
 
cs


2-4 설정파일과 VO 객체와 테이블간의 관계

- SqlMapConfig.xml

1
2
3
4
5
6
7
8
9
<?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="User" type="myspring.user.vo.UserVO"/>
     </typeAliases>
 </configuration>
cs

- User.xml

SQL 문 Mapping 파일 일반적인 sql 문법으로 처리요청을 한다 하지만 mybatis 차이는 select , insert , delete

등 태그를 감싸주어서 id , parameter, result 값을 지정한다.

select 문으로 예를 모든 유저의 정보를 담은 USERS 테이블 컬럼의 정보를 List 타입으로 리턴한다. 

조회한 USERS 의 결과정보를 담아줄 VO객체 이름을 resultType 에 User이라는 이름으로 정한다.

resultType의 User == SqlMapConfig.xml 의 typeAlias 의 alias= User 과 같다. 이렇게 연결을 하면 MyBatis에서 자동으로 연결을 해준다.

mapping 파일이 여러게 존재할때 select id = a , 다른 파일에 select id = a 가 같을경우 충돌이 일어날 수 있기때문에 mapper 태그에 namespace명을 설정한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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="userNs">
    <select id="selectUserById" parameterType="String" resultType="User">
        select * from users where userid=#{userid}
    </select>
    <select id="selectUserList" resultType="User">
        select * from users order by userid
    </select>
    <insert id="insertUser" parameterType="User" >
        insert into users values (#{userid},#{name},#{gender},#{city})
    </insert>
    <update id="updateUser" parameterType="User">
        update users set name=#{name},gender=#{gender},city=#{city} where userid=#{userid}
    </update>
    <delete id="deleteUser" parameterType="String" >
        delete from users where userid =#{userid}
    </delete>
</mapper>
cs

- UserVO.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package myspring.user.vo;
 
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
 
public class UserVO {
    
    private String userid;
    private String name;
    private String gender;
    private String city;
    
    public UserVO() {
        super();
    }
    
    public UserVO(String userid, String name, String gender, String city) {
        super();
        this.userid = userid;
        this.name = name;
        this.gender = gender;
        this.city = city;
    }
 
    public String getUserid() {
        return userid;
    }
    public void setUserid(String userid) {
        this.userid = userid;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    
     @Override
     public String toString() {
         return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
     }
 
    
}
 
cs

- MySQL(database)

1
2
3
4
5
6
create table users(
userid varchar(30not null primary key,
name varchar(50not null,
gender varchar(10),
city varchar(100)
)default charset=utf8;
cs


2-3 MyBatis-Spring 테스트

MyBatis SqlSession 을 사용해서 user1 의 정보를 가져오는 테스트 

1
2
3
4
5
6
7
8
9
@Autowired
SqlSession session;
 
@Test
public void configTest() {
    SqlSession session = context.getBean("sqlSession",SqlSession.class);
    UserVO user = session.selectOne("userNs.selectUserById","user1");
    System.out.println(user);
}
cs


1
{"userid":"user1","name":"name1","gender":"여","city":"city1"}
cs


UserDao 객체를 사용해 모든 유저 정보를 불러는 테스트

UserDao.java 클래스의 모든 유저 정보를 가져오는 메소드

1
2
3
4
5
6
7
@Autowired
private SqlSession session;
 
public List<UserVO> readAll() {
    List<UserVO> userList = session.selectList("userNs.selectUserList");
    return userList;
}
cs


테스트 java 클래스에서 UserDao 를 객체화 하여 실행.

1
2
3
4
5
6
7
8
9
10
11
12
13
@Test
public void daoTest(){
    UserDao dao = context.getBean("userDao",UserDao.class);
    try {
        List<UserVO> list = dao.readAll();
        for (UserVO userVO : list) {
            System.out.println(userVO);
        }
    } catch (Exception e) {
            e.printStackTrace();
    }
        
}
cs


실행결과

1
2
3
4
5
6
7
8
9
{"userid":"user1","name":"name1","gender":"여","city":"city1"}
{"userid":"user12","name":"name12","gender":"여12","city":"city12"}
{"userid":"user2","name":"name2","gender":"여","city":"서울"}
{"userid":"user3","name":"name3","gender":"여","city":"city3"}
{"userid":"user33","name":"name33","gender":"3남","city":"city35"}
{"userid":"user5","name":"name5","gender":"여","city":"city5"}
{"userid":"user7","name":"name7","gender":"여7","city":"city7"}
{"userid":"user8","name":"name8","gender":"여8","city":"city8"}
{"userid":"ㄴㄴㄴ","name":"ㄴㄴㄴ","gender":"남","city":"서울"}
cs



완성된 프로젝트 코드를 다운받으실수 있습니다.

https://dog-developers.tistory.com/30

반응형
Comments