4-1 MyBatis의 소개와 설정

서현우·2022년 5월 20일
0

스프링의정석

목록 보기
48/85

1. MyBatis란?

자바코드 <--> SQL(별도의 xml로 분리)
SQL Mapping Framework - Easy & Simple
자바 코드로부터 SQL문을 분리해서 관리.
매개변수 설정과 쿼리 결과를 읽어오는 코드를 제거.(getInt()-X, getString()-X)
작성할 코드가 줄어서 생산성 향상 & 유지 보수 편리.

//Java 코드
public int insertUser(User user) {
	int rowCnt = FAIL;
	
	Connection conn = null;
	PreparedStatement pstmt = null;
	
	String sql = "insert into user_info values(?,?,?,?,?,now())";
	
	try {
		conn = ds.getConnection();
		pstmt = conn.prepareStatement(sql);
		pstmt.setString(1, user.getId());
		pstmt.setString(2, user.getPwd());
		pstmt.setString(3, user.getName());
		pstmt.setString(4, user.getEmail());
		pstmt.setDate(5, new java.sql.Date...)
		pstmt.setSstring(6, user.getSns());
		
		return pstmt.executeUpdate(); 
	} catch(SQLException e) {
		e.printStackTrace();
		return FAIL;
	} finally {
		close(pstmt, conn)
}
//XML로 분리
<insert id="insert" parameterType="com.fastcampus.ch4.domain.UserDto>
	INSERT INTO user_ino
	VALUES ( #{id}, #{pwd}, #{name}, #{email}, #{birth}, #{sns}, now());
</insert>
//insert 분리
@Repository
public class UserDaoImpl implements UserDao {
	@Autowired
	private SqlSession session;
	private static String namespace = "com.fastcampus.ch4.dao.UserMapper.";
	
	@Override
	public int insert(User user) {
		return session.insert(namespace+"insert", user),
	}

2. SqlSessionFactoryBean과 SqlSessionTemplate

//둘 다 interface, mybatis에서 제공
SqlSessionFactory - SqlSession을 생성해서 제공 --> openSession()
--> SqlSession - SQL명령을 수행하는데 필요한 메서드 제공

//위의 interface를 구현, mybatis spring에서 제공
SqlSessionFactoryBean - SqlSessionFactory를 Spring에서 사용하기 위한 빈
SqlSessionTemplate - SQL명령을 수행하는데 필요한 메서드 제공. thread-safe
(BoardDao, UserDao가 SqlSessionTemplate를 공유 가능. thread-safe(멀티쓰레드에 안전)이기 때문)
root-context.xml

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="dataSource"/>
	<property name="mapperLocations" value="classpath:mapper/*Mapper.xml"/>
</bean>

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
	<constructor-arg ref="sqlSessionFactory"/>
</bean>

3. SqlSession의 주요 메서드

int insert() : insert문을 실행하고, insert된 행의 개수를 반환
int delete() : delete문을 실행하고, delete된 행의 개수를 반환
int update() : update문을 실행하고, update된 행의 개수를 반환
T selectOne() : 하나의 행을 반환하는 select에 사용 또는 parameter로 SQL에 binding될 값 제공
List selectList() : 여러행을 반환하는 select에 사용 또는 parameter로 SQL에 binding될 값 제공.
MapM<K,V> selectMap() : 여러행을 반환하는 select에 사용. keyCol에 Map의 key로 사용할 컬럼 지정.

4. Mapper XML의 작성

//boardMapper.xml을 사용하지 않을 때
public class BoardDaoImpl implements BoardDao {
	@Autowired
	pricate SqlSession session;
	pricate static String namespace
				= "com.fastcampus.ch4.dao.BoardMapper.";
	
	public String getServerTime() throws Exception {
		return session.selectOne(namespace+"now");
	} //T selectOne(String statement)
	
	public int count() throws Exception {
		return session.selectOne(namespace+"count");
	} //T selectOne(String statement)
	
	public int insert(BoardDto dto) throws Exception {
		return session.insert(namespace+"insert", dto);
	} //int insert(String statement, Object parameter)
	
	public BoardDto select(Integer bno) throws Exception {
		return session.selectOne(namespace+"select", bno);
	} //T selectOne(String statement, Object parameter)
//boardMapper.xml을 사용
<mapper namespace="com.fastcampus.ch4.dao.BoardMapper">
	<select id="now" resultType="string">
		SELECT now()
	</select>
	
	<select id="count" resultType="int">
		SELECT count(*) FROM board
	</select>
	
	<insert id="insert" parameterType="com.fastcampus.ch4.domain.BoardDto">
		INSERT INTO board
			(title, content, writer)
		VALUES
			(#{title}, #{content}, #{witer})
	</insert>
	
	<select id="select" parameterType="int"
						resultType="com.fastcampus.ch4.domain.BoardDto">
		SELECT bno, title, content, writer, view_cnt, commnet_cnt, reg_date
		FROM board
		WHERE bno = #{bno}
	</select>

5. <typeAliases>로 이름 짧게 하기

mybatis-config.xml

//별명은 대소문자 구별 X
//실제 이름은 대소문자 구별 O
<typeAliases>
	<typeAlias alias="BoardDto" type="com.fastcampus.ch4.domain.BoardDto"/>
</typeAliases>
profile
안녕하세요!!

0개의 댓글