Mybatis 설정 의 속성 설정 요소 분석

이 어 지난 블 로그'Mybatis 프로필 입문 안내'에 이 어 우 리 는 my batis 핵심 프로필 의 각 요 소 를 상세 하 게 설명 하기 시작 했다.이 글 에서 우 리 는 먼저'properties'요 소 를 살 펴 보 았 다.이 요 소 는 위의 글 에서 가장 먼저 해석 되 고 설 치 된 속성 치 는 다른 요소 에 의 해 사 용 될 것 이다.
우 리 는 먼저 이전의 프로필 을 여기에 복사 해서 비교 관찰 할 수 있 도록 한다.다음 과 같다.

<!DOCTYPE configuration    
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"    
    "http://mybatis.org/dtd/mybatis-3-config.dtd">  
<configuration>  
  
    <settings>  
        <setting name="logImpl" value="LOG4J" />  
    </settings>  
  
    <!--  spring    environments      -->  
    <environments default="development">  
        <environment id="development">  
            <!--   jdbc     -->  
            <transactionManager type="JDBC" />  
            <!--        -->  
            <dataSource type="POOLED">  
                <property name="driver" value="com.mysql.jdbc.Driver" />  
                <property name="url"  
                    value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />  
                <property name="username" value="root" />  
                <property name="password" value="root" />  
            </dataSource>  
        </environment>  
    </environments>  
  
    <mappers>  
        <mapper resource="com\majing\learning\mybatis\dao\UserDaoMapper.xml" />  
    </mappers>    
</configuration>
속성 치 는 세 가지 방식 으로 쓰 인 다.다음 에 우리 하나씩 보 자.
(1)요 소 를 통 해요 소 를 설정 합 니 다.
이전 프로필 에 있 는요소 에 데이터베이스 드라이버,연결 문자열,계 정 비밀번호 등 정보 가 설정 되 어 있 습 니 다.그러나 저 희 는 이렇게 하고 싶 지 않 습 니 다.를 설정 하여 설정 합 니 다.다음 과 같 습 니 다.

<?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>
  <property name="username" value="root"/>
  <property name="password" value="root"/>
  <property name="driver" value="com.mysql.jdbc.Driver"/>
  <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"/>
 </properties>
 
 <settings>
  <setting name="logImpl" value="LOG4J" />
 </settings>
 
 <!--  spring    environments      -->
 <environments default="development">
  <environment id="development">
   <!--   jdbc     -->
   <transactionManager type="JDBC" />
   <!--        -->
   <dataSource type="POOLED">
    <property name="driver" value="${driver}" />
    <property name="url" value="${url}" />
    <property name="username" value="${username}" />
    <property name="password" value="${password}" />
   </dataSource>
  </environment>
 </environments>
 
 <mappers>
  <mapper resource="com\majing\learning\mybatis\dao\UserDaoMapper.xml" />
 </mappers>
 
</configuration>
이렇게 해서 우 리 는 설정 이 필요 한 곳 에서요소 로 통일 되 어 통일 적 으로 관리 할 수 있 습 니 다.
(2)요소 의 resource 속성 이나 url 속성 을 통 해 설정 합 니 다.
여기 서 우 리 는태그 요 소 를 설정 하지 않 고 속성 설정 파일 을 사용 합 니 다.다음 과 같다.

<?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="mysql.properties">
 </properties>
 
 <settings>
  <setting name="logImpl" value="LOG4J" />
 </settings>
 
 <!--  spring    environments      -->
 <environments default="development">
  <environment id="development">
   <!--   jdbc     -->
   <transactionManager type="JDBC" />
   <!--        -->
   <dataSource type="POOLED">
    <property name="driver" value="${driver}" />
    <property name="url" value="${url}" />
    <property name="username" value="${username}" />
    <property name="password" value="${password}" />
   </dataSource>
  </environment>
 </environments>
 
 <mappers>
  <mapper resource="com\majing\learning\mybatis\dao\UserDaoMapper.xml" />
 </mappers>
 
</configuration>
태그 요소 의 resource 속성 설정 my sql.properties(루트 디 렉 터 리 에 비해 경로)내용 은 다음 과 같 습 니 다.

프로필 을 사용 하면 한 번 에 여러 곳 에서 반복 적 으로 사용 할 수 있 습 니 다.다른 항목 에서 CTRL+C 와 CTRL+V 를 사용 하지 않 아 도 됩 니 다.
(3)초기 화 할 때 코드 로 Properties 클래스 인 스 턴 스 를 전송 합 니 다.
구체 적 으로 다음 과 같다.

package com.majing.learning.mybatis; 
import java.io.IOException;
import java.util.Properties; 
import junit.framework.TestCase;
 
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
 
import com.majing.learning.mybatis.dao.UserDao;
import com.majing.learning.mybatis.entity.User; 
public class UserDaoTest1 extends TestCase{
	
	@Test
	public void testFindUserById(){
		SqlSession sqlSession = getSessionFactory().openSession(true);  
		UserDao userMapper = sqlSession.getMapper(UserDao.class);  
 
		User user = userMapper.findUserById(10);  
		System.out.println("   :"+user);
	}
 
	// Mybatis   SqlSessionFactory  SqlSession,       SqlSession        
	private static SqlSessionFactory getSessionFactory() {
		SqlSessionFactory sessionFactory = null;
		String resource = "configuration.xml";
		try {
			sessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(resource), buildInitProperties());
		} catch (IOException e) {
			e.printStackTrace();
		}
		return sessionFactory;
	}
	
	private static Properties buildInitProperties(){
		Properties properties = new Properties();
		properties.put("driver", "com.mysql.jdbc.Driver");
		properties.put("url", "jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8");
		properties.put("username", "root");
		properties.put("password", "root");
		return properties;
	}
}
위 에서 알 수 있 듯 이 SqlSession Factory 를 만 들 때 코드 를 작성 하기 위해 속성 설정 을 입력 했 습 니 다.
위의 세 가지 방식 은 모두 같은 기능 을 실현 할 수 있다.그것 은 바로 my batis 를 초기 화 할 때 일련의 속성 값 을 설정 하여 사용 하 는 것 이다.
그런데 이 세 가 지 는 또 어떤 차이 가 있 을까요?
소스 코드 를 보면 직관 적 인 느낌 은 바로 이 세 가지 설정 이 우선 순위 관계 가 있 고 서로 다른 방식 으로 설정 한 설정 항목 이 공존 할 수 있다 는 것 이다.우선 순 위 는 다음 과 같다.세 번 째 방식>두 번 째 방식>첫 번 째 방식 이다.
즉,세 가지 방식 이 같은 설정 항목 을 설정 하면 우선 순위 가 높 은 설정 방식 의 설정 값 이 적 용 됩 니 다.
이것 은 주로 my bats 의 소스 코드 분석 과정 으로 인 한 것 이다.
다음은 구체 적 인 해석 논 리 를 살 펴 보 겠 습 니 다.

 private void propertiesElement(XNode context) throws Exception {
    if (context != null) {
      Properties defaults = context.getChildrenAsProperties();
      String resource = context.getStringAttribute("resource");
      String url = context.getStringAttribute("url");
      if (resource != null && url != null) {
        throw new BuilderException("The properties element cannot specify both a URL and a resource based property file reference.  Please specify one or the other.");
      }
      if (resource != null) {
        defaults.putAll(Resources.getResourceAsProperties(resource));
      } else if (url != null) {
        defaults.putAll(Resources.getUrlAsProperties(url));
      }
      Properties vars = configuration.getVariables();
      if (vars != null) {
        defaults.putAll(vars);
      }
      parser.setVariables(defaults);
      configuration.setVariables(defaults);
    }
  }
코드 로 볼 때요소 의 resource 속성 과 url 속성 은 동시에 설정 할 수 없습니다.그렇지 않 으 면 이상 이 발생 합 니 다.
또한,분석 할 때 는태그 요 소 를 먼저 분석 한 다음 resource 나 url 에서 지정 한 프로필 부터 설정 을 읽 습 니 다.같은 설정 항목 이 있 으 면 덮어 쓰 고 없 으 면 추가 합 니 다.
이후 세 번 째 방식 의 속성 설정 이 있 는 지 판단 하기 시 작 했 습 니 다.있 으 면 해당 설정 을 이전 속성 집합 에 추가 하고 같은 이름 의 설정 이 있 으 면 덮어 씁 니 다.이런 논리 도 왜 우선 순위 가 있 는 지 직접적인 원인 이다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기