JSP/JSP 정리

[JSP] Mybatis, ibatis차이점과 사용방법

h0-0cat 2023. 6. 7. 13:29
728x90

Mybatis (마이바티스) 란?

  • 자바 객체와 SQL문 사이를 자동으로 매핑(Mapping)해주는 ORM(Object Relation Mapping) 프레임워크
  • SQL 파일을 별도로 분리하여 관리할 수 있고, 객체-SQL 사이의 파라미터를 자동으로 매핑해주기 때문에 편리
  • SQL쿼리문을 그대로 사용하면서 도메인객체나 VO 객체 중심으로 개발이 가능

Mybatis 특징

- 쉬운 접근성과 코드의 간결함

  • 데이터의 저장, 조회, 변경, 삭제를 다루는 가장 간단한 persistence framework(퍼시스턴스 프레임워크) 
  • XML 형태로 작성된 JDBC 코드라 생각해도 될 만큼 JDBC의 모든 기능을 MyBatis가 대부분 제공한다.
  • JDBC의 기능을 자동으로 제공해줘서 깔끔한 코드 유지 가능
  • 수동적인 parameter 설정과 Query 결과에 대한 mapping 구문을 제거

- SQL문과 프로그래밍 코드 분리 가능

  • SQL쿼리 변경시마다 자바코드를 수정하거나 따로 컴파일 할 필요가 없음
  • SQL 작성과 관리를 분담할 수 있다.

 

- 다양한 프로그래밍 언어 사용 가능

#{} ${} 차이점

#{}

  • 값에 ' '가 자동으로 붙음
  • PreparedStatement 통해 악의적인 쿼리주입을 예방할 수 있음
  • 보완차원에서 유리
  • 주로 사용자의 입력을 전달할때 사용

${} EL문

  • ' '가 자동으로 붙지않음
  • Statement 방법으로 파라매터가 출력되어서 전달됌
  • 의도적인 쿼리주입을 막을 수 없음
  • SQL injection 보안 위험 발생 가능
  • 주로 table명 column명 전달시 사용

 

Mybatis 사용하기

pom.xml 추가 

<!--긁지않은개발자-->
<!-- Mybatis 추가 -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.5.11</version>
		</dependency>		
	</dependencies>

 

Mybatis 사용하기(자바.8이용)

Mybatis 예제)

db.properties 따로 만들어 놓는다.

<!-긁지않은개발자-->
# DB 정보 
# 오라클 연결 정보
o.driverClassName= (오라클 driverClassName)
o.url= (오라클url)
o.user=(오라클 유저이름)
o.password= (오라클 비밀번호)

 

MybatisConfig.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="db.properties" />
	<typeAliases>
		<typeAlias type="kr.h00cat.vo.TestVO" alias="TestVO" />
		<typeAlias type="kr.h00cat.board.vo.BoardVO" alias="BoardVO" />
	</typeAliases>
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${o.driverClassName}" />
				<property name="url" value="${o.url}" />
				<property name="username" value="${o.user}" />
				<property name="password" value="${o.password}" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="testMapper.xml" />
		
		<mapper resource="boardMapper.xml" />
	</mappers>
</configuration>

<typeAlias type=   별칭

<mapper resource="boardMapper.xml" />

 

테스트용 Mapper.xml 

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="test">
	<select id="selectToday" resultType="java.util.Date">
		select sysdate from dual
	</select>
	<select id="selectVO1" parameterType="TestVO" resultType="TestVO">
		select sysdate  today,
			#{num1} num1,
			#{num2} num2,
			#{num1} + #{num2} sum,
			#{num1} * #{num2} mul
		from dual
	</select>
</mapper>

 

Mybatis 잘 실행되는지 Test 해보기 

MybatisTest.jsp

<!--긁지않은개발자-->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		SqlSession sqlSession = null;
		try{
			sqlSession = MybatisApp.getSqlSessionFactory().openSession(false);
			//-------------------------------------------------------------------
			Date today = sqlSession.selectOne("test.selectToday");
			out.println("DB 시간 : " + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(today) + "<br>");
			
			TestVO testVO = new TestVO();
			testVO.setNum1(33);
			testVO.setNum2(67);
			
			TestVO resultVO = sqlSession.selectOne("test.selectVO1", testVO);
			out.println("VO로 받기 : " + resultVO + "<br>");
			//-------------------------------------------------------------------
			sqlSession.commit();
		}catch(Exception e){
			sqlSession.rollback();
			e.printStackTrace();
		}finally{
			if(sqlSession!=null) sqlSession.close();
		}
	%>
</body>
</html>

실행 결과

 

 


 

lbatis(아이바티스)

 

lbatis사용하기 (자바.8이용)

 

lbatis 예제)

db.properties 따로 만들어 놓는다.

<!-긁지않은개발자-->
# DB 정보 
# 오라클 연결 정보
o.driverClassName= (오라클 driverClassName)
o.url= (오라클url)
o.user=(오라클 유저이름)
o.password= (오라클 비밀번호)

 

pom.xml 추가 

<!--긁지않은개발자-->
<!-- ibatis 추가 -->
		<dependency>
			<groupId>org.apache.ibatis</groupId>
			<artifactId>ibatis-sqlmap</artifactId>
			<version>2.3.0</version>
		</dependency>

SqlMapConfig.xml

<!--긁지않은개발자-->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<!-- 다음은 정확한 XML 헤더를 위한 필수값이다. -->
<sqlMapConfig>
	<!-- 여기서 명시된 파일내 프라퍼티(name=value) 는 이 설정파일내 고정자(placeholder) 에 의해 사용될수 있다. 
		(이를테면. “${driver}”. 이 파일은 클래스패스에 상대적이고 선택적인 사항이다. -->
	<properties	resource="db.properties" />
	<!-- 이 셋팅은 가장 기본적으로는 트랜잭션 관리를 하며 SqlMapClient 설정 상세를 제어한다. 이것들은 모두 선택적이다. -->
	<settings 
		cacheModelsEnabled="true" 
		enhancementEnabled="true"
		lazyLoadingEnabled="true" 
		maxRequests="128" 
		maxSessions="100"
		maxTransactions="50" 
		useStatementNamespaces="true"
		defaultStatementTimeout="5" 
		statementCachingEnabled="true"
		classInfoCacheEnabled="true" />
	<!-- 긴 전체 경로를 포함한 클래스명을 위한 좀더 짧은 이름을 사용하기 위한 별칭을 타이핑한다. -->
	<typeAlias alias="TestVO" type="kr.human.ibatis.vo.TestVO" />
	<!--SimpleDataSource 를 이용한 SQL Map 를 사용하기 위한 데이터소스 설정. 위 자원으로 부터 프라퍼티 사용에 
		주의. -->
	<transactionManager type="JDBC">
		<dataSource type="SIMPLE">
			<property name="JDBC.Driver" value="${o.driverClassName}" />
			<property name="JDBC.ConnectionURL" value="${o.url}" />
			<property name="JDBC.Username" value="${o.user}" />
			<property name="JDBC.Password" value="${o.password}" />
			<property name="JDBC.DefaultAutoCommit" value="false" />
			<property name="Pool.MaximumActiveConnections" value="100" />
			<property name="Pool.MaximumIdleConnections" value="20" />
			<property name="Pool.MaximumCheckoutTime" value="120000" />
			<property name="Pool.TimeToWait" value="500" />
			<property name="Pool.PingQuery"
				value="select sysdate from dual" />
			<property name="Pool.PingEnabled" value="false" />
			<property name="Pool.PingConnectionsOlderThan" value="1" />
			<property name="Pool.PingConnectionsNotUsedFor" value="1" />
		</dataSource>
	</transactionManager>
	<!-- 이 SQL map 에 의해 로드되는 모든 SQL Map 파일을 인식한다. 경로는 클래스패스에 상대적이다. -->
	<sqlMap resource="testMapper.xml" />
</sqlMapConfig>

testMapper.xml

<!--긁지않은개발자-->
<!DOCTYPE sqlMap
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="test">
	<select id="selectToday" resultClass="java.util.Date">
		<![CDATA[
		select sysdate from dual
		]]>
	</select>
	<select id="testVO" parameterClass="TestVO" resultClass="TestVO">
		select 
			sysdate today, #num1# num1, #num2# num2, #num1#+#num2# sum, #num1#*#num2# mul
		from
			dual 
	</select>
	<select id="testVO2" parameterClass="hashmap" resultClass="TestVO">
		select 
			sysdate today, #num1# num1, #num2# num2, #num1#+#num2# sum, #num1#*#num2# mul
		from
			dual 
	</select>
	<select id="testVO3" parameterClass="hashmap" resultClass="hashmap">
		select 
			sysdate today, #num1# num1, #num2# num2, #num1#+#num2# sum, #num1#*#num2# mul
		from
			dual 
	</select>
</sqlMap>

ibatis 테스트 해보기 

ibatisTest.jsp

 

<!--긁지않은개발자-->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		SqlMapClient sqlMapClient = null;
		try{
			sqlMapClient = IbatisApp.getSqlMapClient();
			sqlMapClient.startTransaction();
			//==============================================
			Date today = (Date)sqlMapClient.queryForObject("test.selectToday");
			out.println("DB 시간 : " + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(today) + "<br>");
			
			TestVO testVO = new TestVO();
			testVO.setNum1(34);
			testVO.setNum2(27);
			
			TestVO result = (TestVO)sqlMapClient.queryForObject("test.testVO", testVO);
			out.println("결과값 : " + result + "<br><hr>");
			
			HashMap<String,Integer> map = new HashMap<>();
			map.put("num1", 45);
			map.put("num2", 21);
			result = (TestVO)sqlMapClient.queryForObject("test.testVO2", map);
			out.println("결과값 : " + result + "<br><hr>");
			
			HashMap<String,Object> resultMap =  
					(HashMap<String,Object>)sqlMapClient.queryForObject("test.testVO3", map);
			out.println("결과값 : " + resultMap + "<br><hr>");
			
			//==============================================
			sqlMapClient.commitTransaction();
		}finally{
			sqlMapClient.endTransaction();
		}
	%>
</body>
</html>

실행 결과

 

 


mybatis, ibatis차이점 

 

iBatis( ~ 2.3)의 버전이 변경되면서 MyBatis(2.5 ~)로 변경이 되었다.
Apache project팀에서 google code 팀으로 이동하면서 명칭이 변경

mybatis

SqlSession

 

ibatis

SqlMapClient

 

Java 요구 버전

Java 요구버전도 iBATIS는 JDK 1.4 이상에서 사용 가능하지만,

MyBatis는 JDK 1.5 이상에서 사용 가능하도록 변경되었다.MyBatis 3.2 이상 버전은 JDK 1.6 이상 요구

 

 

 

*( POJO : Plain Old Java Object, 간단히 POJO는 말 그대로 해석을 하면 오래된 방식의 간단한 자바 오브젝트)

 

 

 

728x90