day56 - MyBatis(Mybatis, Mybatis 실행 절차)
[MyBatis]
- 자바에서 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있게 도와 주는 개발 프레임 워크이다.
- java beans 객체를 preparedStatement parameters와 ResultMaps로 쉽게 매핑을 할수 있도록 도와준다.
- 이를 통해 database에 접근하기 위한 자바 코드의 양을 줄일 수 있다.
[MyBatis 실행 절차]
1. 객체를 파라미터로 전달
-> javaBeans, Map or primitive Wrapper
2. 매핑되는 sql 문장을 수행
-> sql Maps 프레임워크는 PreparedStatement 인스턴스 생성
-> 객체로부터 제공되는 값들을 파라미터로 세팅
3. SQL 문장을 수행하고 ResultSet으로부터 결과 객체를 생성.
-> Update의 경우에는 영향을 받은 rows 수가 반환된다.
-> 쿼리의 경우 하나 혹은 여러 객체들이 반환된다.
[mybatis 태그들]
- 여기서 comment는 클래스를 의미한다.
- 기존 jsp 에서는 VALUE(?, ?, ? ... ) 이런식으로 ? 를 써줬지만
- mybatis에서는 comment라는 클래스를 parameterType으로 지정해 주고 comment 클래스 안에 부합하는 변수들이 존재한다면 getUserId와 같은 것들을 끌어와 VALUE() 안에 있는 변수들과 자동적으로 대응시켜준다.
[변수 설정]
- 만약 DB에서 설정한 컬럼 명과 setter getter에서 설정한 프로퍼티 이름이 다를 경우에는 resultMap으로 설정할 수는 있지만 웬만하면 컬럼명과 setter/getter 프로퍼티 명은 같게 해주는 것이 무조건 좋다.
[MemberMapper1.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="member">
<select id="count" resultType="int">
select count(*) from member2
</select>
<select id="list" resultType="member">
select * from member2
</select>
<select id="selectId" parameterType="string" resultType="member">
select * from member2 where id = #{value}
</select>
<select id="selectName" parameterType="string" resultType="member">
select * from member2 where name like '%${value}%'
</select>
<select id="selectNameGender" parameterType="map" resultType="member">
select * from member2 where name like '%${name}%' and gender = #{gender}
</select>
</mapper>
[main1.java]
package main;
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 Main1 {
public static void main(String[] args) {
initMybatis();
}
public static SqlSessionFactory initMybatis() {
SqlSessionFactory sqlMap = null;
Reader reader = null;
try {
reader = Resources.getResourceAsReader("mapperXML/mybatis-config.xml");
sqlMap = new SqlSessionFactoryBuilder ().build(reader);
System.out.println("ok config");
} catch (IOException e) {
// TODO Auto-generated catch block.
e.printStackTrace();
}
return sqlMap;
}
}
[main2MemberXML.java]
package main;
import java.lang.reflect.Member;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
public class Main2MemberXML {
private final static String NS ="member.";
public static void main(String[] args) {
SqlSessionFactory sqlmap = Main1.initMybatis();
SqlSession session = sqlmap.openSession();
// 하나 받아오기
int x = session.selectOne(NS + "count");
System.out.println("count: "+ x);
// 리스트 받아오기
List<Member> li = session.selectList(NS + "count");
for(Member m : li) {
System.out.println(m);
}
Member member = session.selectOne(NS + "selectId");
System.out.println(member);
li = session.selectList(NS + "selectName" , "2");
for(Member m : li) {
System.out.println(m);
}
Map map = new HashMap();
map.put("name", "4"); // 이름에 4가 들어간 사람을 추출하기 위함
map.put("gender", "1");
li = session.selectList(NS + "selectNameGender" , map);
for(Member m : li) {
System.out.println(m);
}
}
}