MyBatis는 SQL과 Java 객체 간 매핑을 제공하는 프레임워크입니다. SQL 쿼리를 XML 또는 어노테이션으로 관리하며, 개발자는 SQL 쿼리를 더 명시적으로 제어할 수 있습니다. Spring Boot와 MyBatis를 사용하여 데이터베이스 작업을 간소화하고 유지 보수성을 높일 수 있습니다.
환경 설정
application.properties 파일에서 데이터 소스를 정의합니다.Mapper
mapper.xml)에 작성합니다.호출
SqlSession 객체를 통해 매퍼 파일에 정의된 SQL 쿼리를 실행합니다.application.propertiesspring.application.name=myBatis01
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:3306/mysql
spring.datasource.username=root
spring.datasource.password=exxyeon
driver-class-name: MariaDB 드라이버 설정.url: 데이터베이스 URL.username과 password: 데이터베이스 접근 정보.mapper.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="org.example.mybatis">
<!-- 단일 값 조회 -->
<select id="select" resultType="String">
select now() as now
</select>
</mapper>
namespace: 매퍼를 구분하는 고유 이름입니다.id="select": 호출 시 사용할 SQL문 ID입니다.resultType="String": 반환 데이터 타입을 정의합니다.@SpringBootApplication
public class MyBatis01Application implements CommandLineRunner {
@Autowired
private DataSource dataSource;
@Autowired
private ApplicationContext ctx;
public static void main(String[] args) {
SpringApplication.run(MyBatis01Application.class, args);
}
@Override
public void run(String... args) throws Exception {
// MyBatis Framework 접근
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setMapperLocations(ctx.getResource("classpath:/mapper/mapper.xml"));
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBean.getObject();
SqlSession sqlSession = sqlSessionFactory.openSession(true);
String result = sqlSession.selectOne("select");
System.out.println("현재 시간: " + result);
sqlSession.close();
}
}
SqlSessionFactoryBean 설정:selectOne("select")로 mapper.xml의 id="select" 쿼리를 호출합니다.select now()는 현재 시간을 반환하며, 결과가 출력됩니다.<select id="selectone1" resultType="java.util.HashMap">
select deptno, dname, loc
from dept
where deptno=10
</select>
@Override
public void run(String... args) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setMapperLocations(ctx.getResource("classpath:/mapper/mapper.xml"));
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBean.getObject();
SqlSession sqlSession = sqlSessionFactory.openSession(true);
Map map = sqlSession.selectOne("selectone1");
for (String key : map.keySet()) {
System.out.println(key + " : " + map.get(key));
}
sqlSession.close();
}
selectOne("selectone1"):mapper.xml의 쿼리를 실행합니다.Map으로 반환됩니다.map.get(key):deptno, dname, loc 값을 출력합니다.<select id="selectlist1" resultType="map">
select deptno, dname, loc
from dept
</select>
@Override
public void run(String... args) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setMapperLocations(ctx.getResource("classpath:/mapper/mapper.xml"));
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBean.getObject();
SqlSession sqlSession = sqlSessionFactory.openSession(true);
List<Map<String, Object>> lists = sqlSession.selectList("selectlist1");
for (Map<String, Object> map : lists) {
System.out.println(map.get("deptno") + "/" + map.get("dname") + "/" + map.get("loc"));
}
sqlSession.close();
}
<!-- mapper2.xml-->
<select id="selectone" resultType="org.example.mybatis.model.DeptTO" >
select deptno, dname, loc
from dept
where deptno=10
</select>
// DetpTO
@Getter
@Setter
public class DeptTO {
private String deptno;
private String dname;
private String loc;
}
// main
@Override
public void run(String... args) throws Exception {
// MyBatis Framework 접근
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setMapperLocations(ctx.getResource("classpath:/mapper/mapper2.xml"));
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBean.getObject();
SqlSession sqlSession = sqlSessionFactory.openSession(true);
System.out.println(sqlSession); // org.apache.ibatis.session.defaults.DefaultSqlSession@ref
DeptTO to = sqlSession.selectOne("selectone");
System.out.println(to.getDeptno() + "/" + to.getDname() + "/" + to.getLoc());
sqlSession.close();
}
<select id="selectlist1" resultType="org.example.mybatis.model.DeptTO" >
select deptno, dname, loc
from dept
</select>
List<DeptTO> lists = sqlSession.selectList("selectlist1");
for (DeptTO to : lists) {
System.out.println(to.getDeptno() + "/" + to.getDname() + "/" + to.getLoc());
}
<select id="selectlist2" parameterType="String" resultType="org.example.mybatis.model.EmpTO">
select empno, ename, job, deptno
from emp
where deptno = #{deptno}
</select>
// EmpTO
@Getter
@Setter
public class EmoTO {
private String empno;
private String ename;
private String job;
private String mgr;
private String hiredate;
private String sal;
private String comm;
private String deptno;
}
// main
List<EmpTO> lists = sqlSession.selectList("selectlist2", 10);
for (EmpTO to : lists) {
System.out.println(to.getEmpno() + "/" + to.getEmpno() + "/" + to.getDeptno());
}
sqlSession.close();
%: where ename like #{ename}
<select id="selectlist4" parameterType="org.example.mybatis.model.EmpTO" resultType="org.example.mybatis.model.EmpTO" >
select empno, ename, job, deptno
from emp
where job = #{job} and deptno = #{deptno}
</select>
// 메인
EmpTO paramTO = new EmpTO();
paramTO.setJob("SALESMAN");
paramTO.setDeptno("30");
List<EmpTO> lists = sqlSession.selectList("selectlist4", paramTO);
for (EmpTO to : lists) {
System.out.println(to.getEmpno() + "/" + to.getEname() + "/" + to.getDeptno());
}
// application.properties
spring.application.name=Zipcode02_myBatis
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:3306/sample
spring.datasource.username=root
spring.datasource.password=exxyeon
// mapper
<?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="org.example.mybatis">
<select id="select" parameterType="String" resultType="org.example.zipcode02.model.ZipcodeTO" >
select zipcode, sido, gugun, dong, ri, bunji
from zipcode
where dong like #{dong}
</select>
</mapper>
// ZipcodeTO
@Getter
@Setter
public class ZipcodeTO {
private String zipcode;
private String sido;
private String gugun;
private String dong;
private String ri;
private String bunji;
}
// main
@SpringBootApplication
public class Zipcode02MyBatisApplication implements CommandLineRunner {
@Autowired
private DataSource dataSource;
@Autowired
private ApplicationContext ctx;
public static void main(String[] args) {
SpringApplication.run(Zipcode02MyBatisApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setMapperLocations(ctx.getResource("classpath:/mapper/mapper.xml"));
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBean.getObject();
SqlSession sqlSession = sqlSessionFactory.openSession(true);
List<ZipcodeTO> lists = sqlSession.selectList("select", "신사");
for (ZipcodeTO to : lists) {
System.out.printf("[%s] %s %s %s %s %s %n",
to.getZipcode(), to.getSido(), to.getGugun(), to.getDong(), to.getRi(), to.getBunji());
}
sqlSession.close();
}
}
MyBatis 사용 시 장점:
활용 상황: