마이바티스는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다.
JPA와 MyBatis의 차이 (ORM과 SQL Mapper)
JPA (Java Persistence API) - 자바 ORM의 기술 표준, 대표적인 오픈 소스가 Hibernate이다. ORM(Object-relational mapping) - 객체 관계 매핑, 객체와 RDB를 별개로 설계하고 ORM이 중간에서 매핑해주는 역할..
dreaming-soohyun.tistory.com
https://mybatis.org/mybatis-3/ko/index.html
MyBatis – 마이바티스 3 | 소개
Copyright © 2009–2021MyBatis.org. .
mybatis.org
https://goodteacher.tistory.com/344
[Spring-Data-JPA]이제는 MyBatis를 보내주자.
이제는 MyBatis를 보내주자 Java를 이용해서 DB를 사용하기 위해서는 JDBC라이브러리를 이용하는게 필수다. 하지만 JDBC를 이용해서 직접 프로그래밍을 하는 경우는 대학 졸업 이후에는 아마 거의 없
goodteacher.tistory.com
오늘은 스프링을 사용하지 않고 사용하는 방법에 대해 배웠다.
이전에는 DAO에 Connection, Statement를 이용해서 db와 연결해 쿼리문을 실행하였다.
mybatis를 사용하면 길게 써야 했던 코드를 줄일 수 있다.
두개의 db를 사용해서 테스트 케이스를 만들어 볼 것이다.
1. dynamic web project 생성
2. convert tern project (쓰고 싶은 라이브러리 bootstrap, jquery, node js 등등 )체크
3. convert maven project(이름 입력)
4. pom.xml 수정, 소스, 타켓 1.8로 바꿔줌. <dependencies> 추가
5. Build path -> src/main/java, src/test/java, src/main/resources, src/test/resources
6. maven update
7. db는 미리 만들어 두었다. 이를 연결해보도록 하자
mybatis-mariadb-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>
<!-- 지정 프로퍼티 파일을 사용하겠다. -->
<properties resource="application.properties"></properties> <!--이 부분 꼭 입력-->
<!-- 클래스 이름을 줄여서 사용 하겠다. -->
<typeAliases>
<typeAlias type="java.util.HashMap" alias="HashMap"/>
<typeAlias type="내가 만든 VO위치(자세하게)" alias="그 VO를 축약해서 이렇게 사용"/>
</typeAliases>
<!-- 연결 설정 정보 지정 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${m.driver}" /> <!--마리아db사용할 것-->
<property name="url" value="${m.url}" />
<property name="username" value="${m.username}" />
<property name="password" value="${m.password}" />
</dataSource>
</environment>
</environments>
<!-- SQL명령어들이 들어있는 맵퍼 파일을 기술한다. -->
<mappers>
<mapper resource="mapper/mariadb/testMapper.xml" /> <!--sql명령어들 모음집이라고 보면 됨-->
</mappers>
</configuration>
mybatis-oracle-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>
<!-- 지정 프로퍼티 파일을 사용하겠다. -->
<properties resource="application.properties"></properties>
<!-- 클래스 이름을 줄여서 사용 하겠다. -->
<typeAliases>
<typeAlias type="java.util.HashMap" alias="HashMap"/>
<typeAlias type="kr.lala.vo.TestVO" alias="testVO"/> <!--db가 바뀌든 VO는 같음-->
</typeAliases>
<!-- 연결 설정 정보 지정 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${o.driver}" />
<property name="url" value="${o.url}" />
<property name="username" value="${o.username}" />
<property name="password" value="${o.password}" />
</dataSource>
</environment>
</environments>
<!-- SQL명령어들이 들어있는 맵퍼 파일을 기술한다. -->
<mappers>
<mapper resource="mapper/oracledb/testMapper.xml" /> <!--오라클 디비 -->
</mappers>
</configuration>
1) 첫째로 눈여겨 봐야 할 점은 . application.propertise가 필요하다는 점이다. 아래서 설명을 더 할 것이다.
property name 이 부분을 주의해서 봐야 한다.
${}은 el표현식 getter를 한다는 것인데, 어디서 get을 할 것인가? application.propertise에서 get할 것이다.
무엇을? db의 정보를 가져온다.
2) typeAlias는 객체의 typeAlias 태그의 type에 클래스 패키지주소를 적고 alias에 alias로 지정할 클래스의 이름을 적어 둔다. 나중에 mapper.xml(sql명령어 집합)을 만들 때에 클래스 전체 이름을 적지 않아도(kr.lala.vo.TestVO->testVO)로 사용 가능하도록 하는 유용한 기능이다.
3) mariadb건 oracle이건 mapper 부분만 바꿔주면 둘다 사용가능하다. 오라클mapper, mariadb mapper, 혹은 mysql 등등 폴더를 나누어 mapper만 따로 따로 만들어 주면 재사용이 가능하다.
1)번을 설명하자면
application.propertise
# 여기에 데이터베이스 연결 정보를 저장한다.
# Maria DB 연결 정보
# LOG4JDBC 사용전
# m.driver=org.mariadb.jdbc.Driver
# m.url=jdbc:mariadb://localhost:3306/jspdb
# LOG4JDBC 사용
m.driver=net.sf.log4jdbc.DriverSpy
m.url=jdbc:log4jdbc:mysql://localhost:3306/jspdb
m.username=jspuser
m.password=123456
# 오라클 DB 연결 정보
# LOG4JDBC 사용전
# o.driver=oracle.jdbc.driver.OracleDriver
# o.url=jdbc:oracle:thin:@localhost:1521:xe
# LOG4JDBC 사용
o.driver=net.sf.log4jdbc.DriverSpy
o.url=jdbc:log4jdbc:oracle:thin:@localhost:1521:xe
o.username=jspuser
o.password=123456
application.propertise는 하나만 있어도 여러가지의 db의 정보를 저장할 수 있다.
propertise name = "driver" value = "${m.driver}"
propertise name = "driver" value = "${o.driver}"
차이점이 무엇일까?
-> application.propertise를 자세히 보면 maria를 사용했을 때에는 db정보에 m.을 붙여주고
oracle을 사용했을 때에는 db정보에 o.를 붙여주었다.
즉, config.xml에서 get 할때에 application.propertise을 하나만 만들어도 여러 db를 사용할 수 있다.
실무에서도 db가 여러개가 ? 짬뽕이 되어 있는 경우가 있다고 들었다
propertise 하나를 만들어서 이를 타파할 수 있다.
3)번에서 mapper를 건드려봐야 한다.
내가 어떤 sql명령문을 사용할 것인가? 를 생각하고 작성하면 된다. 이 경우에는 mariadb와 oracle의 명령문은 차이가 있다. 따로 따로 만들어 주면 된다.
mariadb-> testMapper.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="mariadb.test">
<!-- id: 메서드명 , parameterType : 인수, resultType : 리턴값 -->
<select id="today" resultType="date">
select now()
</select>
<select id="calc" parameterType="hashmap" resultType="int">
select (#{num1} + #{num2}) * #{num3}
</select>
<!--
쿼리에 <, <= >, >=가 들어갈 경우에는 반드시 <![CDATA[ ]]> 섹션안에 써야 한다. 왜? 태그로 인식할 수 있기 때문
<![CDATA[ 명령 ]]> 섹션 안의 내용은 태그가 아닌 내용으로 인식되기 때문이다.
-->
<select id="calcVO" parameterType="hashmap" resultType="testVO" >
<![CDATA[
select now() AS today, (#{num1} + #{num2}) * #{num3} AS result, CONCAT(#{name}, '씨 반갑습니다.') AS message
]]>
</select>
<select id="calcMap" parameterType="hashmap" resultType="hashmap" >
<![CDATA[
select now() AS today, (#{num1} + #{num2}) * #{num3} AS result, CONCAT(#{name}, '씨 반갑습니다.') AS message
]]>
</select>
</mapper>
oracle-> testMapper.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="oracledb.test">
<!-- id: 메서드명 , parameterType : 인수, resultType : 리턴값 -->
<select id="today" resultType="date">
select SYSDATE from dual
</select>
<select id="calc" parameterType="hashmap" resultType="int">
select (#{num1} + #{num2}) * #{num3} from dual
</select>
<!--
쿼리에 <, <= >, >=가 들어갈 경우에는 반드시 <![CDATA[ ]]> 섹션안에 써야 한다. 왜? 태그로 인식할 수 있기 때문
<![CDATA[ 명령 ]]> 섹션 안의 내용은 태그가 아닌 내용으로 인식되기 때문이다.
-->
<select id="calcVO" parameterType="hashmap" resultType="testVO" >
<![CDATA[
select SYSDATE AS today, (#{num1} + #{num2}) * #{num3} AS result, #{name} || '씨 반갑습니다.' AS message from dual
]]>
</select>
<select id="calcMap" parameterType="hashmap" resultType="hashmap" >
<![CDATA[
select SYSDATE AS today, (#{num1} + #{num2}) * #{num3} AS result, #{name} || '씨 반갑습니다.' AS message from dual
]]>
</select>
</mapper>
namepace에는 db 별로 이름을 따로 줘야 한다.
ibatis의 경우 parameter(Type) result(Type) -> ( ) 괄호가 사용된 부분이 Class로 바뀐다.
parameterType은 말 그대로 어떤 타입으로 매개변수를 받아 sql명령어를 실행한 후
resultType = '타입'으로 반환하는 것이다.
parmeterType이 없다면 그냥 반환값만 있는 것이다.
id를 통해 나중에 today.date로 값을 출력할 수 있다.
<![CDATA[명령문]]> 크다 적다 ||, ==, <=, >= 사용할 때 쓴다.
여기서 #{hashmap}에서 #은 자동으로 ""을 붙여준다.
mybatis_mariadb.jsp
<body>
<%
String resource = "mybatis-mariadb-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = null;
try{
// false 는 autoCommit 하지 않겠다는 의미.
sqlSession = sqlSessionFactory.openSession(false);
out.println("연결 성공 : " + sqlSession + "<br>");
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
sqlSession.commit();
}catch(Exception e){
sqlSession.rollback();
e.printStackTrace();
}finally{
try {
if(sqlSession!=null) sqlSession.close();
}catch(Exception e){
e.printStackTrace();
}
}
%>
</body>
mybatis_oracledb.jsp
<body>
<%
String resource = "mybatis-oracle-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = null;
try{
// false 는 autoCommit 하지 않겠다는 의미.
sqlSession = sqlSessionFactory.openSession(false);
out.println("연결 성공 : " + sqlSession + "<br>");
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
sqlSession.commit();
}catch(Exception e){
sqlSession.rollback();
e.printStackTrace();
}finally{
try {
if(sqlSession!=null) sqlSession.close();
}catch(Exception e){
e.printStackTrace();
}
}
%>
</body>
'Mybatis' 카테고리의 다른 글
Mybatis 실습 2(복습) (0) | 2021.08.18 |
---|---|
Mybatis 실습 (0) | 2021.08.17 |