List

화요일, 12월 08, 2015

Mybatis 연결



Spring 데이터 베이스 연결

  • 어떻게 하면 DB연결을 손쉽게 할 수 있을 것인가에 대한 고민?
    • 연동방법에 대한 효과성
  • 구조
    • DB 및 설정 처리(mybatis-config.xml)
      • VO 클래스 선언
          • 1.type="해당클래스 실제 위치" alias="mapper에서 사용할 이름"                                ex) alias="emp"
      • environments : db연결정보 처리
        • transactionManager type="JDBC"
        • dataSource를 통해서 연결정보 선언
          • 속성 : type="POOLED"
          • 메서드(property)
            • driver : oracle.jdbc.driver.OracleDriver
            • url : jdbc : oracle:thin:@localhost:1521:orcl
            • username:scott
            • password:tiger
      • mappers : 실제 sql구문이 있는 위치를 설정
        • resource="경로/EmpMapper.xml"
    • spl 구문 처리(XXXMapper.xml)
      • namespace="구분되는 형식 내용 선언"
        • ex)패키지명.EmpMapper
      • resultMap:결과에 대한 선언
        • ResultSet = pstmt.excutequery
        • while (rs.next()){ <-- 요런식으루 ArrayList로 가지고옴
        • 해당 sql의 결과 값을 선언 ex) type(VO) 이 배열 형태로 모여있는것을정의
        • <resultMap type="emp" id="empRst"/>
          • config.xml에 선언된 alias의 이름의 배열 형태를  empRst라고 합니다
      • select id ="selectEmp" resultMap="empRst" parameterType="emp"
        • ArrayList<Emp> selectEmp(Emp sch){
          • ArrayList<Emp> empRst.......
          •  return empRst;
          • }
        • sql 구분을 쓰는데 외부에서 호출할 때 , selectEmp라고 하면 결과값은 empRst라고 합니다 라는내용
    • 데이터를 처리하는 dao단(struts) , repository단 호출 처리
      • SqlSessionFactory : 설정 xml호출하여 DB연결처리
        • SqlSession : getSqlSessionFactory()의 openSession()을 통해서 특정한 sql을 호출
          • sqlSession.selectList(namespace+".sql id")
            • ArrayList<VO>의 데이터를 가져올 때 처리하는 메서드

설정을 위한 파일들?

  • log4j.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%m%n" />
            <!--param name="ConversionPattern" value="
%d{yyyy-MM-dd HH:mm:ss} [%-5p](%-35c{1}:%-3L) %m%n" /-->
        </layout>
    </appender>
 
    <logger name="ldg.mybatis" additivity="false">
        <level value="DEBUG" />
        <appender-ref ref="console" />
    </logger>
    
    <root>
        <level value="DEBUG" />
        <appender-ref ref="console" />
    </root>
</log4j:configuration>
 
 
cs

  • mybatis-config.xml
    • DBConn에서 setConn부분의 역할
1
2
3
4
5
6
7
8
9
10
 
    public void setConn() throws ClassNotFoundException, SQLException{
        //1.메모리 로딩 jdbc
        Class.forName("oracle.jdbc.driver.OracleDriver");
        //2.db서버 연걸 sid:orcl port:1521
        String coninfo="jdbc:oracle:thin:@59.10.147.68:1521:orcl";
        con=DriverManager.getConnection(coninfo,"scott","tiger");
        System.out.println("접속성공");
        
    }
cs
    • 위와 같은 형태의 내용
    • typeAlias == 사용될 객체의 주소와 간단하게 선언(alias)
    • mapper.xml == mapper.xml파일의 주소
    • dataSource type == "POOLED" 데이터를 처리하는방식중 효율적인 방식(?)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
<?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>
<!-- vo 처리
    데이터의 한개당 입력되는 클래스를 간단하게 alias이름으로 선언 -->
    <typeAliases> 사용될 객체를 선언
        <typeAlias type="springwebPackage.d02_myBatis.model.Emp" 
alias="emp"/>
    </typeAliases>
    
<!-- db연결정보 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
                <property name="url" value="jdbc:oracle:thin:@59.10.147.68:1521:orcl"/>
                <property name="username" value="scott"/>
                <property name="password" value="tiger"/>
            </dataSource>
        </environment>
    </environments>
    
<!-- mapper.xml -->
    <mappers>
        <mapper resource="springwebPackage/d02_myBatis/mapper/EmpMapper.xml"/>
    </mappers>
</configuration>
 
cs

  • EmpMapper.xml 
    • 실제 sql쿼리문이 있는곳
    • select id 를 설정해서 해당 아이디를 실행단에서 불러옴
1
2
3
4
5
6
7
8
9
10
11
12
<?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">
<!-- namespace : 구분자 -->
<mapper namespace="EmpMapper">
    <!-- resultMap선언 -->
    <resultMap type="emp" id="empRst"/>
    <select id="selectEmplist" resultMap="empRst">
        select * from emp
    </select>
</mapper>
 
cs
    • DBConn에서 이부분의 역할
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public void insComment(Board ins){
        String sql=" insert INTO BOARDSJH VALUES(
                (select max(no+1) from BOARDSJH),"
                + " ?, ?, ?, sysdate, sysdate, ?, 0) ";
        try {
            setConn();
            pstmt=con.prepareStatement(sql);
            con.setAutoCommit(false);
            
            pstmt.setString(1, ins.getTitle());
            pstmt.setString(2,ins.getContent());
            pstmt.setString(3, ins.getWriter());
            pstmt.setInt(4, ins.getRefno());
            
            pstmt.executeUpdate();
            con.commit();
            pstmt.close();
            con.close();
cs
  • 실행단 EmpRepository
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class EmpRepository {
    
    private final String NAMESPACE="EmpMapper";
매핑된 mapper는 상수로 처리
    //db연결 및 공통 설정정보 처리
    private SqlSessionFactory getSqlSessionFactory(){
        String resource="mybatis-config.xml";//생성한 mybatis-config파일 매핑
        InputStream inputstream=null;
        
        //xml설정 냉용을 stream 형식으로 가져와서 sqlSessionFactory에 넘겨줌
        
        try {
            inputstream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return new SqlSessionFactoryBuilder().build(inputstream);
    }
    
    public List<Emp> selectEmplist(){
        SqlSession sqlsess = getSqlSessionFactory().openSession();
        
        
        try{
            return sqlsess.selectList((NAMESPACE)+".selectEmplist");
        }finally{
            //자원 해제 처리 (에러가나던 어쩌던)
            sqlsess.close();
        }
    }
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        new EmpRepository().selectEmplist();
    }
 
}
 
cs
    • vo단에서 직렬화 필수
1
2
 
public class Dept implements Serializable{
cs


  • 파일구조
    • src 바로 하위에 mybatis-config와 log4j 파일이 위치









특정 값을 parameter로 받아서 검색

  • EmpMapper.xml 단에 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<select id="setSchEmpList" parameterType="emp" resultMap="empRst">
         select * from emp where 1=1 
         
             <if test="ename != null">
<!-- if(sch.getEname()!=null)
        and ename like '%' +sch.getEname()+'%'  과 동일
        
        #{content} = 해당하는 VO property 설정해서 사용할때 preparestatement로
                            sql injection 을 차단
        ${내에용} = 동적 sql 을 사용할 때  : sql inject에 노출될 가망성이 있음
  -->
                 and ename like '%' ||#{ename}||'%'
             </if>
             
     </select>
</mapper>
 
cs

  • EmpRepository.java 에 메서드 추가
1
2
3
4
5
6
7
8
9
10
11
12
 
public List<Emp> setSchEmpList(Emp sch){
        SqlSession sqlsess = getSqlSessionFactory().openSession();
        try{
            //조건 검색해서 처리할 내용
            //select [ ,sch ] 뒤에 검색할 파라미터 값을 추가
            return sqlsess.selectList((NAMESPACE)+".setSchEmpList" ,sch );
        }finally{
            //자원 해제 처리 에러가나던 어쩌던
            sqlsess.close();
        }
    }
cs













댓글 없음:

댓글 쓰기