웹프로젝트에서 DB를 연결할 때 많이쓰는 방법으로 Oracle iBatis 연동 방법에 대해서 알아보겠습니다.
1. iBatis란?
1) DB연결 프레임워크로 Java Bean이나 Map객체에 Sql문 결과를 매핑해주며 Sql문을 xml형태로 Java코드와 분리시켜 편리함을 제공
2) 본래는 아파치재단에서 만들어졌으나 개발자들이 구글로 이동하면서 현재 구글에서 MyBatis로 제공되고 있다(즉 iBatis는 MyBatis의 구버전인 셈)
2. 장점
1) DB연결 시에 쓰이는 코드의 간소화
2) SQL 문을 코드에서 분리함으로써 수정이 필요할시 편리하게 수정이 가능(생산성, 유지보수성 향상)
3) 자동매퍼 제공으로 Sql 결과를 객체에 자동으로 저장
3. Oracle과의 연동
1) iBatis 다운로드
2) iBatis, Ojdbc jar파일을 해당 프로젝트에 삽입(Danamic Web Project : Web-Inf -> lib)
3) SqlMapConfig.xml(DB 설정 파일) 작성 후 이를 객체화 하여 사용
프로젝트의 기본구조는 다음과 같습니다.
DB는 Oracle을 사용하며 테이블은 기본적으로 제공도는 emp 테이블을 사용하겠습니다.
4. 소스코드
import java.io.IOException; import java.io.Reader; import com.ibatis.common.resources.Resources; import com.ibatis.sqlmap.client.SqlMapClient; import com.ibatis.sqlmap.client.SqlMapClientBuilder; public class SqlMapConfig { //작성한 sqlMapConfig.xml 객체화 하는 클래스 private static final SqlMapClient sqlMap; static{ try { String resource ="./iBatisSetting/sqlMapConfig.xml"; Reader reader = Resources.getResourceAsReader(resource); sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("초기화 에러: "+ e); } } public static SqlMapClient getSqlMapInstance(){ return sqlMap; } }
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd" > <sqlMapConfig> <settings cacheModelsEnabled="true" enhancementEnabled="true" lazyLoadingEnabled="true" maxRequests="30" maxSessions="10" maxTransactions="5" useStatementNamespaces="false"/> <transactionManager type="JDBC"> <!-- Connection 정보 --> <dataSource type="SIMPLE"> <property name="JDBC.Driver" value="oracle.jdbc.driver.OracleDriver"/> <property name="JDBC.ConnectionURL" value="jdbc:oracle:thin:@localhost:1521:orcl"/> <property name="JDBC.Username" value="scott"/> <property name="JDBC.Password" value="tiger"/> <property name="Pool.MaximumActiveConnections" value="10"/> <property name="Pool.MaximumIdleConnections" value="5"/> <property name="Pool.MaximumCheckoutTime" value="120000"/> </dataSource> </transactionManager> <sqlMap resource="sql/Emp.xml"/> <!-- sql 문장이 있는 xml문서 지정 --> </sqlMapConfig>
import java.io.IOException; import java.sql.SQLException; import java.util.List; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Controller extends HttpServlet{ List<DTO> list; Dao dao = new Dao(); @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{ // TODO Auto-generated method stub try { list = dao.selectEmp(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("DB연결 실패"); } req.setAttribute("list", list); RequestDispatcher rd = req.getRequestDispatcher("/result.jsp"); rd.forward(req, resp); } }
import java.io.IOException; import java.sql.SQLException; import java.util.List; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Controller2 extends HttpServlet{ Dao dao = new Dao(); DTO dto = new DTO(); @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{ // TODO Auto-generated method stub dto.setEname("홍길동"); dto.setJob("개발자"); dto.setSal("1000"); int result = dao.insertdata(dto); if(result==0){ req.setAttribute("result", "입력성공"); }else{ req.setAttribute("result", "입력실패"); } RequestDispatcher rd = req.getRequestDispatcher("/insertresult.jsp"); rd.forward(req, resp); } }
import java.sql.SQLException; import java.util.List; import iBatisSetting.SqlMapConfig; import iBatistest.DTO; import com.ibatis.sqlmap.client.SqlMapClient; public class Dao { SqlMapClient smc = SqlMapConfig.getSqlMapInstance(); List<DTO> list; public List<DTO> selectEmp() throws SQLException { // TODO Auto-generated method stub list = smc.queryForList("selectEmp"); return list; } public int insertdata(DTO dto) { // TODO Auto-generated method stub int result = 0; try{ smc.insert("insertEmp",dto); System.out.println("입력"); }catch(Exception e){ result = 1; System.out.println("실패"); e.printStackTrace(); } return result; } }
public class DTO { private String ename; private String job; private String sal; public DTO() { // TODO Auto-generated constructor stub } public String getEname() { return ename; } public void setEname(String ename) { this.ename = ename; } public String getJob() { return job; } public void setJob(String job) { this.job = job; } public String getSal() { return sal; } public void setSal(String sal) { this.sal = sal; } public DTO(String ename, String job, String sal) { super(); this.ename = ename; this.job = job; this.sal = sal; } }
<?xml version="1.0" encoding="euc-kr"?> <!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd" > <sqlMap > <select id="selectEmp" resultClass="iBatistest.DTO"> select * from emp </select> <insert id="insertEmp" parameterClass="iBatistest.DTO"> insert into emp(empno, ename, job, sal) values(519, #ename#, #job#, to_number(#sal#)) </insert> </sqlMap>
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>IbatisTest</display-name> <!-- db select servlet매핑 --> <servlet> <servlet-name>ibatistestservlet</servlet-name> <servlet-class>iBatistest.Controller</servlet-class> </servlet> <servlet-mapping> <servlet-name>ibatistestservlet</servlet-name> <url-pattern>/ibatistest</url-pattern> </servlet-mapping> <!-- db insert servlet매핑 --> <servlet> <servlet-name>ibatistestservlet2</servlet-name> <servlet-class>iBatistest.Controller2</servlet-class> </servlet> <servlet-mapping> <servlet-name>ibatistestservlet2</servlet-name> <url-pattern>/ibatistest2</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>view.jsp</welcome-file> </welcome-file-list> </web-app>
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR"> <title>Insert title here</title> </head> <body> <%= request.getAttribute("result") %> </body> </html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@page import="iBatistest.DTO,java.util.*" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% ArrayList<DTO> list = (ArrayList<DTO>)request.getAttribute("list"); for(int i=0; i<list.size(); i++){ %> <Input type='text' value='<%=list.get(i).getEname() %>'> <Input type='text' value='<%=list.get(i).getJob() %>'> <Input type='text' value='<%=list.get(i).getSal() %>'><br> <% } %> </body> </html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>iBatis 테스트</h1> <hr> <form action="ibatistest2"> <input type="submit" value="DB에 홍길동 값 넣기"> </form><br> <form action="ibatistest"> <input type="submit" value="DB값 가져오기"> <br> </form> </body> </html>
위의 프로젝트 구조와 소스코드를 적용시켜 Oracle db 연동 프로젝트를 한번 구동시켜 보겠습니다.
5. 구동 결과
초기 화면은 다음과 같은데요.
각각의 버튼을 통해 insert와 select 쿼리가 동작하게 됩니다.
6. DB값 가져오기
기본 emp 테이블을 select해서 jsp화면에 보여주는 모습입니다.
7. DB Insert
emp 테이블에 값을 입력시킨 모습입니다.
새로운 값이 테이블에 들어갔는지 확인해 보겠습니다.
DB값을 다시 확인해 보니 홍길동 데이터가 정상적으로 들어간 모습입니다.
위의 예제 처럼 Oracle 연결 방법을 통해 웹프로젝트와 db와의 연결 프로젝트를 수행해 보았습니다. 아래에 위의 프로젝트 예제를 첨부하니 잘 안되시는 분들은 이를 활용해 보시기 바랍니다.
Oracle 연동 및 세팅(MVC 모델2 패턴) 프로젝트 파일 : IbatisTest.war
답글 남기기