Mybatis
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);
}
}