개발도구 : IntelliJ IDEA 2022.2.2 (Ultimate Edition)
서버 : 톰캣 9.0.46
JDK : corretto 11.0.16
DB : MariaDB
https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client
https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core
https://mvnrepository.com/artifact/org.mybatis/mybatis/3.5.6
https://mvnrepository.com/artifact/org.projectlombok/lombok/1.18.24
MariaDB, log4j2 , mybatis, lombok 추가
maven은 pom.xml에 dependency 추가
gradle은 build.gradle dependencies에 implementation 추가
implementation 'org.mariadb.jdbc:mariadb-java-client:3.0.7'
compileOnly 'org.projectlombok:lombok:1.18.24'
annotationProcessor 'org.projectlombok:lombok:1.18.24'
testCompileOnly 'org.projectlombok:lombok:1.18.24'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.24'
implementation 'org.apache.logging.log4j:log4j-core:2.17.1'
implementation 'org.apache.logging.log4j:log4j-api:2.17.1'
implementation 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.1'
implementation 'org.mybatis:mybatis:3.5.6'
그리고 프로젝트 갱신
MariaDB db와 user는 미리 만들어두어야 한다.
CREATE DATABASE ldydb;
CREATE USER 'ldyuser'@'%' IDENTIFIED BY 'ldyuser';
ldydbldydbGRANT ALL PRIVILEGES ON ldydb.* TO 'ldyuser'@'%';
더미 테이블 작성
CREATE TABLE ldy_table (
no INT AUTO_INCREMENT PRIMARY KEY,
firstname VARCHAR(100),
lastname VARCHAR(100)
)
https://mybatis.org/mybatis-3/ko/getting-started.html
문서를 참고하여 프로젝트의 resources 폴더에 new File - mybatis-config.xml 을 만들어준다.
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="org.mariadb.jdbc.Driver"/>
<property name="url" value="jdbc:mariadb://localhost:3306/ldydb"/>
<property name="username" value="ldyuser"/>
<property name="password" value="ldyuser"/>
</dataSource>
</environment>
</environments>
<mappers>
</mappers>
</configuration>
"https://mybatis.org/dtd/mybatis-3-config.dtd"
이 줄에서 오류가 났었는데 밥먹고 오니까 사라졌다 (?)
프로젝트 기본 패키지 하위에 utils 패키지를 만들고 MyBatisUtil 클래스를 enum으로 만든다.(싱글턴)
문서를 참고하여 SqlSessionFactory 를 빌드한다.
@Getter
public enum MyBatisUtil {
INSTANCE;
private SqlSessionFactory sqlSessionFactory;
MyBatisUtil() {
// 자원을 읽어온다
try{
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}catch (Exception e){
System.out.println(e.getMessage());
}
}
}

패키지 경로 참고하여

점 을 ' / ' 슬래시 로 바꿔서 폴더 생성
new File - TimeMapper.xml 추가. ( xml파일은 소문자로만 작성하여야 하는줄 알았는데 mybatis는 예외인가 ? )
사족으로 DB연결 작업을 하고 난 뒤에는 항상 time을 출력 해 보는 습관을 들이자. (서울 시간 아닐수도)
문서를 참고하여 TimeMapper.xml 작성
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mymybatis.TimeMapper">
<select id="getTime" resultType="string">
select now()
</select>
</mapper>
mybatis-config.xml에 < Mapper > 추가
<mapper resource="com/example/mymybatis/TimeMapper.xml"></mapper>
개발환경 왼쪽에있는 사이드바 에서 파일 우클릭 - copy/path 이용하면 편리하다.
resources 폴더에 new File - log4j2.xml 생성
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="debug">
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd hh:mm:ss} %5p [%c] %m%n"/>
</Console>
</Appenders>
<loggers>
<root level="debug" additivity="true">
<AppenderRef ref="console"/>
</root>
</loggers>
</configuration>
test 소스폴더에 MyBatisTests 클래스 생성
@Lof4j2 도 클래스이름 위에 붙여 주시고
@Test
public void test1(){
log.info("test1..........");
@Cleanup SqlSession session = MyBatisUtil.INSTANCE.getSqlSessionFactory().openSession();
log.info(session);
String timeStr = session.selectOne("com.example.mymybatis.TimeMapper.getTime");
log.info(timeStr);
session.close();
}
TimeMapper.xml 파일이 있는 경로 + TimeMapper.xml에 정의해놓은 쿼리문 id 작성

execute query : select now() 반드시 확인.
혹시 안나온다면 log4j2.xml 설정 파일에서 loogers root level이 info로 되어있다면 debug로 내려볼것.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mymybatis.ldyMapper">
<select id="selectLdy" resultType="com.example.mymybatis.dto.LdyDTO">
select * from ldy_table
</select>
<select id="selectOneLdy" resultType="com.example.mymybatis.dto.LdyDTO">
select * from ldy_table where no = #{no}
</select>
<select id="oddSelectOneLdy" resultType="com.example.mymybatis.dto.LdyDTO">
select * from ldy_table where no = #{oddParam}
</select>
</mapper>
namespace 값을 디렉토리경로.xml파일이름 으로 변경.
id 값을 쿼리의 동작을 표현할 수 있게 작명.
resultType 값은 쿼리문의 반환 DTO타입으로 작성 + DTO클래스가 있는 패키지 경로명 까지 추가
package com.example.mymybatis.dto;
import lombok.*;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class LdyDTO {
private Integer no;
private String firstName;
private String lastName;
// 변수 없음. getter
public int getOddParam(){
return this.no;
}
}
CREATE TABLE ldy_table (
no INT AUTO_INCREMENT PRIMARY KEY,
firstname VARCHAR(100),
lastname VARCHAR(100)
)
DROP TABLE ldy_table;
SELECT * FROM ldy_table;
INSERT INTO ldy_table (firstname, lastname) VALUES ('DaeYeob' , 'Lee');
UPDATE ldy_table SET firstname = CONCAT(firstname, " " , NO) WHERE NO > 0;
UPDATE ldy_table SET lastname = CONCAT(lastname, " " , NO) WHERE NO > 0;
@Test
public void selectOneTest(){
@Cleanup SqlSession session = MyBatisUtil.INSTANCE.getSqlSessionFactory().openSession();
log.info(session);
LdyDTO dto = LdyDTO.builder()
.no(3)
.build();
LdyDTO ldyDTO = session.selectOne("com.example.mymybatis.ldyMapper.selectOneLdy", dto);
log.info(ldyDTO);
session.close();
}
결과

형식 : session.selectOne(경로, 데이터)
MyBatis의 실행 원리....................
데이터(DTO) 안에 있는 getter 함수를 호출해서 sql문 #{param} 값을 채운다.
@Test
public void oddSelectOneTest(){
@Cleanup SqlSession session = MyBatisUtil.INSTANCE.getSqlSessionFactory().openSession();
log.info(session);
LdyDTO dto = LdyDTO.builder()
.no(5)
.build();
/*
* MyBatis 의 Mapper 쿼리문 실행 원리가 DTO 클래스에 있는 getOddParam() 함수를 실행하는 시스템이다.
*
* public int getOddParam(){
return this.no;
}
* */
LdyDTO ldyDTO = session.selectOne("com.example.mymybatis.ldyMapper.oddSelectOneLdy", dto);
log.info(ldyDTO);
session.close();
}
결과
