BACKEND.*

Mybatis

초코푸딩 2020. 7. 9. 15:08

https://github.com/mybatis/mybatis-3/releases/tag/mybatis-3.5.4

다운로드사이트

 

Release mybatis-3.5.4 · mybatis/mybatis-3

Enhancements: You can now omit unnecessary @Results and @ConstructorArgs annotation. #1698 Bug fixes: Avoid invoking hashCode() method when setting auto-generated keys. #1719 Possible ResultMapE...

github.com

https://mybatis.org/mybatis-3/ko/getting-started.html

 

MyBatis – 마이바티스 3 | 시작하기

이제부터 다룰 스코프와 생명주기에 대해서 이해하는 것은 매우 중요하다. 스코프와 생명주기를 잘못 사용하는 것은 다양한 동시성 문제를 야기할 수 있다. 의존성 삽입 프레임워크는 쓰레드에

mybatis.org

mybatis.org/dtd/mybatis-3-config.dtd"> dtd는 XML자동완성등 지원

dtd란???

xml에서 스키마를 작성할 때는 두가지 방법이 있는데, DTD와 XML스키마(XSD)가 있다.

DTD는 XML 문서의 구조 및 해당 문서에서 사용할 수 있는 적법한 요소와 속성을 정의한다.

DTD는 엔티티를 정의할 수 있으며, XML 문서 내부에 명시할 수도 있고 별도의 파일로 분리할 수도 있다. 

응용프로그램은 DTD의 정의에 따라 XML 문서의 구문 및 구조에 대한 유효성을 검사할 수 있다.

그래서 보통은 XML파일과 DTD파일이 따로 있어서 XML파일내에 필요한 DTD파일이 명시되어있는 경우가 많다.


1.jar파일추가하기

2.mybatis 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>
	<!-- 자주사용하는 객체를 alias명칭으로 지정 -->
	<typeAliases>
		<typeAlias alias="member" type="servlet.MemberVO"/>
	</typeAliases>
	<!-- JNDI DB커넥션설정 -->
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="JNDI">
				<property name="data_source" value="java:/comp/env/jdbc/myoracle" />
			</dataSource>
		</environment>
	</environments>
	<!-- 쿼리적은 xml파일(맵퍼) 맵핑 -->
	<mappers>
		<mapper resource="mybatis/member-mapper.xml"/>
	</mappers>
</configuration>

3. sql mapper작성하기

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace ="member">
	<select id="selectMember" resultType="member">
		SELECT * FROM member
	</select>
	<select id="selectUserCheck" resultType="member">
		SELECT count(id)
		from member
		where id = #{id}
	</select>
	<insert id="insertJoin" parameterType="member">
		insert into member (id, pwd, name)
		values ( #{id}, #{pwd}, #{name} )
	</insert>
	<select id="selectIdCheck" parameterType="Map">
		select count(id)
		from member
		where id = #{id}
		and pwd = #{pwd}
	</select>
</mapper>

config에서 alias를 사용했기때문에 mapper에서 parameterType을 패키지명으로 풀 작성하지 않아도된다.

 

4.Connector작성

package util;

import java.io.IOException;
import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MybatisConnector {
	private static MybatisConnector connector = null;
	private SqlSessionFactory factory = null;

	private MybatisConnector() {
		try { //connector이 null일때만 생성된다.
			Reader reader = Resources.getResourceAsReader("mybatis/mybatis-config.xml");
			factory = new SqlSessionFactoryBuilder().build(reader); //xml파일 한번만 읽음
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static MybatisConnector getInstance() { //sigleton pattern
		if (connector == null) {
			connector = new MybatisConnector();
		}
		return connector;
	}
	
	public SqlSessionFactory getSqlSessionFactory() {
		return factory; 
	}
	
}

5.VO와 DAO작성

package servlet;

public class MemberVO {
	private String id;
	private String pwd;
	private String name;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}
package servlet;

import java.util.HashMap;
import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import util.MybatisConnector;

public class MemberDAO {
	private static MemberDAO dao = null;
	private SqlSessionFactory factory = null;
	private MemberDAO() {
		factory = MybatisConnector.getInstance().getSqlSessionFactory(); 
		//컨트롤러에서 MemberDAO를 가져다가 쓸때, factory를 계속 가져다가 쓸테니
		//마찬가지로 싱글턴 구현
	}
	public static MemberDAO getInstance() {
		if(dao == null) {
			dao = new MemberDAO();
		}
		return dao;
	}
	
	public List<MemberVO> selectList(){
		List<MemberVO> mlist = null;
		SqlSession sqlSession = factory.openSession(); //connection연결
		mlist = sqlSession.selectList("member.selectMember"); //mapperNamespace.queryid
		sqlSession.close(); //connection 반환(Connection Pool로)
		return mlist;
	} 
	
	public int selectUserCheck(String id) {
		int result = 0;
		SqlSession sqlSession = factory.openSession();
		result = sqlSession.selectOne("member.selectUserCheck",id);
		sqlSession.close();
		return result;
	}
	
	public int insertJoin(String id, String pwd, String name) {
		int result = 0;
		MemberVO mvo = new MemberVO();
		mvo.setId(id);
		mvo.setPwd(pwd);
		mvo.setName(name);
		SqlSession sqlSession = factory.openSession();
		result = sqlSession.insert("member.insertJoin",mvo);
		sqlSession.close();
		return result;
	}
	
	public int selectIdCheck(String id, String pwd) {
		int result = 0;
		HashMap<String, String> map = new HashMap<String, String>();
		map.put("id", id);
		map.put("pwd",pwd);
		SqlSession sqlSession = factory.openSession();
		result = sqlSession.insert("member.selectIdCheck",map);
		sqlSession.close();
		return result;
	}
}

6.Controller에서 사용

package servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/mybatis")
public class MybatisController extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		MemberDAO mdao = MemberDAO.getInstance();
		List<MemberVO> mlist = mdao.selectList();
		System.out.println("id :" + mlist.get(0).getId() );
		System.out.println("pwd :" + mlist.get(0).getPwd() );
		System.out.println("name :" + mlist.get(0).getName() );
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}