마이바티스를 사용하지 않고 직접 JDBC를 이용할 경우 문제점
: 개발자가 반복적으로 작성해야 할 코드가 많고, 서비스 로직과 쿼리를 분리하기 어려움
또한 커넥션 풀의 설정 등 개발자가 신경 써야 할 부분이 많아 여러 가지 어려움이 있음
따라서, JDBC를 이용해서 직접 개발하기 보다는 MyBatis와 같은 프레임워크를 사용하는 것이 일반적
JDBC를 이용하여 프로그래밍 하는 방식
: 클래스나 JSP와 같은 코드 안에 SQL문을 작성하는 방식
따라서 SQL의 변경 등이 발생할 경우 프로그램을 수정해야 함
-자동으로 Connection close()가능
-MyBatis 내부적으로 PreparedStatement 처리
*PreparedStatement : statement를 상속받는 인터페이스로 SQL구문을 실행시키는 기능을 갖는 객체
-#{prop}와 같이 속성을 지정하면 내부적으로 자동 처리
-리턴 타입을 지정한 경우 자동으로 객체 생성 및 ResultSet 처리
-기존의 SQL을 그래도 활용 가능
[Mybatis](https://mvnrepository.com/artifact/org.mybatis/mybatis/3.4.6)
[MyBatis-Spring](https://mvnrepository.com/artifact/org.mybatis/mybatis-spring/1.3.2)
<!-- mybatis -->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
-MyBatis에서 가장 핵심인 객체는 SQLSession과 SQLSessionFactory
SQLSessionFactory는 내부적으로 SQLSession을 통해 Connectino을 생성하거나 원하는 SQL을 전달하고, 결과는 리턴받는 구조
스프링에서 SQLSessionFactory를 등록하는 작업은 SQLSessionFactoryBean을 이용
패키지명을 보면 MyBatis의 패키지가 아니라 스프링과 연동 작업을 처리하는 mybatis-spring 라이브러리의 클래스임을 알 수 있음
servlet-context.xml
<bean id="sqlSessionFactory" class="org.mybatis.spring.
SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
</bean>
MyBatis-Spring을 이용하는 경우에는 Mapper를 XML과 인터페이스 + 어노테이션의 형태로 작성
MyBatis는 내부적으로 JDBC의 PreparedStatement를 이용해서 SQL을 처리
따라서 SQL에 전달되는 파라미터는 JDBC에서와 같이 ‘?’로 치환되어 처리됨. 이럴 경우 값이 제대로 처리 되었는지 확인하기가 쉽지 않고, 실행된 SQL의 내용을 정확히 확인하기 어려우므로, SQL 로그를 제대로 보기 위해서는 log4jdbc-log4j2 라이브러리를 사용
<!-- pom.xml -->
<!-- https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4 -->
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
<version>1.16</version>
</dependency>
마이바티스 관련 설정 파일
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>
<environments default="developerment">
<environment id="developerment">
<transactionManager type="JDBC" />
<dataSource type="POOLED"> <!-- 데이터의 영역 (풀장) -->
<!-- db의 정보(db연결 설정) -->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 회원 기능 관련 sql문이 있는 member.xml을 읽어들임. -->
<mapper resource="mybatis/mapper.xml"/> <!-- xml의 위치 : mybatis안에 mapper.xml -->
</mappers>
</configuration>
member.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">
<!-- 실질적으로 쓰이는 부분 -->
<!-- Query -->
<mapper namespace="mybatis.mapper">
<!--
<select id="외부에서 접근할 문자열"
parameterType="object" <= String, Object 들어가는 값(object)
resultType="object">
쿼리문
select id, name, email
where id = #{값} #{ 문자열(값) } ${ 숫지 }
</select>
<insert
<delete
<update
-->
<insert id="addmember" parameterType="dto.MemberDto">
insert into member(id, pwd, name, email, auth)
values(#{id}, #{pwd}, #{name}, #{email}, 3)
</insert>
<select id="getMember" parameterType="java.lang.String"
resultType="dto.MemberDto"> <!-- 들어오는건 id 나가는건 dto객체 -->
select id, pwd, name, email, auth
from member
where id=#{id}
</select>
<select id="allMember" resultType="dto.MemberDto">
select * from member
</select>
<update id="updateMem" parameterType="dto.MemberDto">
update member
set name = #{name}, email=#{email}
where id=#{id}
</update>
<delete id="delMem" parameterType="String">
delete for member
where id=#{id}
</delete>
</mapper>
MemberDto.java
package dto;
import java.io.Serializable;
public class MemberDto implements Serializable{
private String id;
private String pwd;
private String name;
private String email;
private int auth;
private void MerberDto() {
// TODO Auto-generated method stub
}
public MemberDto(String id, String pwd, String name, String email, int auth) {
super();
this.id = id;
this.pwd = pwd;
this.name = name;
this.email = email;
this.auth = auth;
}
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;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getAuth() {
return auth;
}
public void setAuth(int auth) {
this.auth = auth;
}
@Override
public String toString() {
return "MemberDto [id=" + id + ", pwd=" + pwd + ", name=" + name + ", email=" + email + ", auth=" + auth + "]";
}
}
MainClass.java
package main;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import dto.MemberDto;
public class MainClass {
public static void main(String[] args) throws Exception{ //예외처리
//설정파일 read
InputStream is = Resources.getResourceAsStream("mybatis/config.xml");
//SqlSessionFactory 객체 생성
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//SqlSession 객체 취득
SqlSession session = factory.openSession();
//insert(넣을 data 준비)
/*
MemberDto dto = new MemberDto("def", "345", "배수지", "def@naver.com", 0);
//id값 : addmember, 들어가는 값 : dto
int count = session.insert("addmember",dto);
if(count > 0) {
//commit설정
session.commit();
System.out.println("추가성공!");
}else {
//rollback설정
session.rollback();
System.out.println("추가실패ㅜㅜ");
}
*/
/*
//select(1개의 데이터)
String id = "abc";
MemberDto dto = session.selectOne("getMember", id);
//System.out.println(dto.toString());
//select(다수의 데이터)
List<MemberDto> list = session.selectList("allMember");
for(MemberDto m : list) {
System.out.println(m.toString());
}
*/
//delete
String id = "aaa";
int count = session.delete("deleteMem", id);
if(count > 0) {
session.commit();
System.out.println("삭제완료!");
}else {
session.rollback();
System.out.println("삭제실패ㅜ");
}
//update
MemberDto dto = new MemberDto("def",null,"def@hotmail.com",null,0);
int cnt = session.update("updateMem", dto);
if(cnt > 0) {
session.commit();
System.out.println("수정완료!");
}else {
session.rollback();
System.out.println("수정실패ㅜ");
}
}
}