💡 학습목표
1. MyBatis에 대한 개념
2. yml파일에 MyBatis 설정하는 방법 알아보기
3. MyBatis 사용 방법
3-1 : UserRepository 인터페이스 선언 하기
3-2 : user.xml 파일을 정의 하기
3-3 : AccountRepository 인터페이스 선언 하기
3-4 : account.xml 파일 정의 하기
3-5 : HistoryRepository 인터페이스 선언 하기
3-6 : history.xml 파일 정의 하기
MyBatis는 자바 언어를 위한 데이터베이스 연동 프레임워크 중 하나로, SQL 쿼리와 자바 코드를 매핑하고 관리하기 위한 도구를 제공하는 프레임워크입니다. MyBatis는 SQL을 직접 작성하고 실행하는 대신 SQL 쿼리를 XML 파일이나 어노테이션을 사용하여 정의하고, 데이터베이스와 자바 객체 간의 매핑을 설정할 수 있도록 도와줍니다.
매퍼(Mapper): 매퍼는 SQL 쿼리와 자바 메서드를 연결하는 인터페이스 또는 XML 파일입니다. MyBatis에서 매퍼는 데이터베이스와 상호 작용하기 위한 모든 SQL 작업을 정의합니다.
SQL 쿼리 매핑: MyBatis는 SQL 쿼리를 자바 코드에서 분리하여 XML 파일이나 어노테이션을
사용하여 정의합니다. 이렇게 정의된 SQL 쿼리는 매퍼에서 호출되며, MyBatis가 데이터베이스에 전달하여 실행합니다.
파라미터 매핑: MyBatis는 SQL 쿼리의 파라미터를 자바 객체와 매핑합니다.
이를 통해 SQL 쿼리 내에서 자바 객체의 속성을 사용할 수 있습니다.
결과 매핑: MyBatis는 SQL 쿼리의 결과를 자바 객체로 변환하여 반환합니다.
이를 통해 데이터베이스 결과를 자바 객체로 쉽게 사용할 수 있습니다.
세션(Session): MyBatis에서는 세션을 사용하여 데이터베이스와의 연결을 관리합니다.
세션은 데이터베이스 연결을 열고 닫는 데 사용되며, SQL 쿼리를 실행할 때마다 세션을 생성하고 사용합니다.
// UserMapper.java (매퍼 인터페이스)
public interface UserMapper {
User getUserById(int userId);
}
<!-- UserMapper.xml (SQL 쿼리 매핑 파일) -->
<mapper namespace="UserMapper">
<select id="getUserById" resultType="User">
SELECT * FROM users WHERE id = #{userId}
</select>
</mapper>
의존성 설정 확인
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.3.0'
server:
port: 80
servlet:
encoding:
charset: utf-8
force: true
spring:
mvc:
view:
prefix: /WEB-INF/view/
suffix: .jsp
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:mem:testdb;MODE=MySQL
username: sa
password:
sql:
init:
schema-locations:
- classpath:db/table.sql
data-locations:
- classpath:db/data.sql
h2:
console:
enabled: true
output:
ansi:
enabled: always
mybatis:
mapper-locations:
- classpath:mapper/**.xml
configuration:
map-underscore-to-camel-case: true
mybatis: MyBatis 설정을 시작하는 루트 노드입니다.mapper-locations: MyBatis 매퍼 XML 파일의 위치를 나타냅니다.**: 클래스패스(classpath) 상의 **mapper`** 디렉터리 안에 있는 모든 XML 파일을 매퍼로 사용하겠다는 설정입니다. 이 디렉터리에는 SQL 쿼리와 자바 객체 간의 매핑 정보가 포함된 MyBatis 매퍼 파일입니다. MyBatis는 이러한 매퍼 파일을 로드하여 SQL 쿼리를 실행할 때 사용합니다.configuration: MyBatis의 추가적인 구성 옵션을 정의합니다.map-underscore-to-camel-case: true: 이 옵션은 데이터베이스의 컬럼 이름이 스네이크 케이스(my_column_name)로 되어 있을 때, 자바 객체의 프로퍼티 이름을 카멜 케이스(myColumnName)로 자동으로 변환하는 기능을 활성화합니다. 예를 들어, 데이터베이스 컬럼 first_name*은 자바 객체의 프로퍼티 firstName*에 자동으로 매핑됩니다. 이 옵션을 사용하면 자동 매핑의 편의성을 높일 수 있습니다.이 설정은 MyBatis의 매퍼 파일을 클래스패스 상의 특정 디렉터리에서 로드하고, 데이터베이스 컬럼 이름과 자바 객체의 프로퍼티 이름 간의 자동 매핑을 활성화하는 데 사용됩니다. 이를 통해 MyBatis가 데이터베이스와 자바 객체 간의 데이터 전송을 더 쉽게 처리할 수 있게 됩니다.
package com.tencoding.bank.repository.interfaces;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.tencoding.bank.repository.model.User;
// ibatis -> 2.4 버전 이후로 MyBatis로 이름 변경 됨
@Mapper // Mapper 반드시 기술을 해주어야 동작한다.
public interface UserRepository {
// 뱅크 앱
public int insert(User user);
public int updateById(User user);
public int deleteById(Integer id);
public User findById(Integer id);
// 관리자 - 회원정보 리스트를 보고 싶다면?
public List<User> findAll();
}
1단계
<?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="com.tencoding.bank.repository.UserRepository">
</mapper>
2단계
<?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="com.tencoding.bank.repository.interfaces.UserRepository">
<insert id="insert">
insert into user_tb(username, password, fullname, created_at)
values(#{username}, #{password}, #{fullname}, now())
</insert>
<update id="updateById">
update user_tb set username = #{username},
password = ${password},
fullname = ${fullname}
where id = ${id}
</update>
<delete id="deleteById">
delete from user_tb where id = #{id}
</delete>
<select id="findById" resultType="com.tencoding.bank.repository.model.User">
select * from user_tb where id = ${id}
</select>
<select id="findAll" resultType="com.tencoding.bank.repository.model.User">
select * from user_tb
</select>
</mapper>
package com.tencoding.bank.repository.interfaces;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.tencoding.bank.repository.model.Account;
@Mapper
public interface AccountRepository {
public int insert(Account acount);
public int updateById(Account acount);
public int deleteById(Account acount);
public List<Account> findAll();
public Account findById(Integer id);
public List<Account> findByUserId(Integer principalId);
public Account findByNumber(String number); // 계좌번호로 계좌 존재 여부 확인
}
<<?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="com.tencoding.bank.repository.interfaces.AccountRepository">
<insert id="insert">
insert into account_tb (number, password, balance, user_id, created_at)
values(#{number}, #{password}, #{balance}, #{userㅑd}, now())
</insert>
<update id="updateById">
update account_tb set number = #{number}, password = #{password},
balance = #{balance}, user_id = #{userId} where id = #{id}
</update>
<delete id="deleteById">
delete from account_tb where id = #{id}
</delete>
<select id="findById" resultType="com.tencoding.bank.repository.model.Account">
select * from account_tb where id = #{id}
</select>
<select id="findAll" resultType="hashmap">
select * from account_tb
</select>
<select id="findByUserId">
select * from account_tb where user_id = #{userid}
</select>
<select id="findByNumber">
select * from account_tb where number = #{number}
</select>
</mapper>
package com.tencoding.bank.repository.interfaces;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.tencoding.bank.repository.model.History;
@Mapper
public interface HistoryRepository {
// 기능 직접 설계
public int insert(History history);
public int updateById(History history);
public int deleteById(Integer id);
public List<History> findAll();
public History findById(Integer id);
}
<?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="com.tencoding.bank.repository.interfaces.HistoryRepository">
<insert id="insert">
insert into history_tb (amount, w_account_id, d_account_id, w_balance,
d_balance, created_at)
values(#{amount}, #{wAccountId}, #{dAccountId}, #{wBalance}, #{dBalance}, now())
</insert>
<update id="updateById">
update history_tb set amount = #{amount} , w_balance = #{wBalance},
d_balance = #{dBalance},w_account_id = #{wAccountId},
d_account_id = #{dAccountId} where id = #{id}
</update>
<delete id="deleteById">
delete from history_tb where id = #{id}
</delete>
<select id="findAll">
select * from history_tb
</select>
<select id="findById">
select * from history_tb where id = #{id}
</select>
</mapper>