Mybatis 인터페이스 프로그래밍의 원리

Mybatis는 두 가지 실현 방식이 있습니다.
하나: xml 프로필을 통해 실현
둘째: 인터페이스 프로그래밍을 위한 실현
전자의 원리는 Mybatis 운행 세트에서 대체적으로 말했는데 이 절은 후자를 말한다. 인터페이스를 위한 프로그래밍은namespace/전입 매개 변수/반환값/Sql 관련 Id 등 여러 가지 위험을 해결할 수 있다.
즉, Mybatis 프로필 Dao입니다.xml은 자신의 모델로 인터페이스를 찾았고 다른 자바 대상에게 앞으로 데이터베이스에 접근해서 이 Dao를 더 이상 괴롭히지 말라고 말했다.xml 파일입니다. 제 대변인 보조를 찾아가면 전적으로 책임을 집니다.
인터페이스 보조가 Dao를 전적으로 책임져야 한다면.xml 파일의 모든 작업, 그럼, Dao.xml 파일은 반드시 모델 인터페이스와 업무 임무를 잘 전달해야 하며 인터페이스를 함부로 해서는 안 된다.
여전히 데이터베이스 정보 목록에 액세스하는 경우:
먼저 인터페이스 Imessage와 Dao를 정의해야 합니다.xml 파일 안의 각종 설정 항목은 일일이 대응합니다.

package hdu.terence.dao; 
import java.util.List; 
import hdu.terence.bean.Message; 
public interface IMessage { 
    publicList<Message> queryMessageList(Message message); 
} 
Dao.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="com.terence.dao.IMessage">  
 <resultMap type="hdu.terence.bean.Message" id="MessageResult">  
  <id column="id" jdbcType="INTEGER"property="id"/> <!-- --> 
  <result column="COMMAND" jdbcType="VARCHAR"property="command"/> 
  <result column="DESCRIPTION" jdbcType="VARCHAR" property="description"/> 
  <result column="CONTENT" jdbcType="VARCHAR"property="content"/> 
 </resultMap>   
 <select id="queryMessageList" parameterType="hdu.terence.bean.Message" resultMap="MessageResult"> 
  SELECTID,COMMAND,DESCRIPTION,CONTENT FROM message WHERE 1=1    
  <if test="command!=null and!"".equals(command.trim())"> 
  andCOMMAND=#{command} 
  </if> 
  <if test="description!=null and!"".equals(description.trim())"> 
  andDESCRIPTION like '%' #{description} '%' 
  </if>  
 </select><span style="color: teal; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span> 
테스트:

public List<Message> queryMessageListByMybatis(Stringcommand,String description) 
  { 
    DBAccess dbAccess =new DBAccess(); 
    SqlSession sqlSession=null; 
    List<Message>messageList=new ArrayList<Message>(); 
    try { 
      sqlSession=dbAccess.getSqlSession(); 
      Message message=new Message(); 
      message.setCommand(command); 
      message.setDescription(description);           
      // : sql  
      IMessageimessage=sqlSession.getMapper(IMessage.class); 
      messageList=imessage.queryMessageList(message); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
    finally{ 
      if(sqlSession!=null) 
      { 
        sqlSession.close(); //  
      } 
    } 
    return messageList; 
  } 
첫째, 다오.xml 파일 이름 공간은 인터페이스의 전체 이름과 일치해야 합니다. 인터페이스의 전체 이름 (com.terence.dao.IMessage 신청 포함) 을 사용하면 인터페이스에서 프로필의 이름 공간을 찾을 수 있습니다.
둘째, 인터페이스 정의 모델의 sql 문장에 대응하는 방법:query Message List (), 방법명은 모델의 sql 문장 설정 항목의 id:query Message List와 같고 인터페이스가 자신이 설명한 방법에 따라 대응하는 설정 항목 id에 비추기 편리하다.
셋째, 인터페이스 성명 방법이 가져온 인삼 메세지와 Dao.xml 파일은 설정 항목에 필요한 매개 변수와 일치합니다.
넷째, 인터페이스 선언 방법의 반환값 유형 List와 Dao.xml 파일 id 구성 항목resultMap 형식이 일치합니다.
이렇게 하면 인터페이스의 프록시 작업을 완성하고 프로필은 다른 자바 코드를 알려준다. 나중에 이 인터페이스를 통해 내가 원래 완성해야 할 일을 완성하고 Sql문장을 실행하여 데이터베이스에 대한 상호작용을 완성할 수 있다.분명히 이런 인터페이스식 프로그래밍은 이전의 직접 호출 프로필보다 훨씬 편리하다. 이전에 직접 프로필을 호출했다. 매번 프로필을 사용할 때마다 프로필의 명칭 공간, id, 파라미터와 반환 값을 써야 한다. 이런 부분은 때때로 손으로 미끄러져 쓰기가 일치하지 않을 때가 있다. 만약에 오류가 발생하면 컴파일러가 알림을 표시하지 않고 개발자는 실행 결과의 오류 알림에 따라 오류를 퇴고하는 곳만 천천히 디버깅할 수 있다.인터페이스 프로그래밍을 사용하면 프로필을 dao로 설정합니다.xml은 정의된 인터페이스와 일일이 일치하며 인터페이스 프록시 프로필을 통해 나중에 누가 사용하든지 인터페이스를 직접 호출할 수 있습니다. 프로필 안의 명칭 공간과 sql 프로필 ID를 상관하지 않고 인터페이스를 호출할 때 오류가 발생하면 자동으로 알림을 보내 오류 찾기에 더욱 유리합니다.
그러나 Mybatis에서만 인터페이스식 프로그래밍을 사용하면 뚜렷한 효과가 없지만 Mybatis가spring을 만났을 때 효과가 현저하다.
Mybatis가 Spring을 만났을 때 Mybatis의 핵심 프로필 Configuration입니다.xml에 데이터베이스를 연결하는 설정은 Spring의 DB 층을 대체하고 Mybatis의 SqlSession 세션은 Spring에 위탁됩니다. 상기 MessageDao.xml 부분에서 파라미터 호출 인터페이스를 가져온 부분은 스프링의 서비스에 위탁되어 완성됩니다.이때 우리가 정의한 IMessage 인터페이스는 원래의 Dao 층을 대체할 것이다. 이때의 Dao 층은 인터페이스 파일과 JavaDao만 남았다.xml 프로필입니다. 
Mybatis 인터페이스 프로그래밍의 원리
첫 번째 질문, 내일 왜 Imssage를 연결합니까?query MessageList () 는 실행 클래스가 없지만 대응하는 방법을 호출할 수 있습니까?
먼저 에이전트를 만드는 실례가 있는 클래스가 있어야 합니다. 클래스 안에 invoke () 방법이 있습니다.

MapperProxy implements InvocationHandler
{
 MapperProxy.invoke();
}
우리가 인터페이스를 호출할 때, Invoke () 방법은 Proxy를 통과합니다.NewProxyInstance()에 프록시 인스턴스를 로드합니다. 실제로는 sqlSession을 통해서입니다.getMapper () 는 프록시 인스턴스를 가져옵니다. 즉,

sqlSession.getMapper()==Proxy.newProxyInstance(); 
IMessage imessage=sqlSession.getMapper(IMessage.class);
messageList=imessage.queryMessageList(message);
이렇게 하면 IMessage 자체가 클래스를 실현하지 못하더라도 SqlSession의 getMapper 방법을 통해 인터페이스 클래스 IMessage를 가져옵니다.class는 IMessage 유형의 에이전트 실례를 얻을 수 있습니다. 이것은 범형이 작용하고 어떤 유형을 가져오면 어떤 유형의 인터페이스를 얻을 수 있습니다. 왜냐하면 Mybatis가 범형을 이용하여 강전했기 때문입니다. 
두 번째 문제는 invoke () 방법을 통해 우리가 sqlSession을 호출해야 한다는 것을 어떻게 알았는가입니다.selectList() 메서드?
sqlSession을 초기화할 때 Configuration을 로드했기 때문입니다.xml 파일, 그리고 수정 파일에 각 JavaDao를 불러옵니다.xml 파일, 이 Configuration.xml 파일은 Mybatis와 관련된 클래스에 대응합니다:Configuration, 인터페이스의 전체 이름은 Invoke() 방법에서 얻을 수 있습니다. 인터페이스의 전체 이름입니다.방법명 = Namespace.id, 그래서 프로필에 있는 검색 방법을 얻을 수 있습니다. 
SqlSession 가져오기

public SqlSession getSqlSession() throws IOException 
{ 
    //1、  
    Readerreader=Resources.getResourceAsReader("hdu/terence/config/Configuration.xml"); 
    //2、 SqlSessionFactory 
    SqlSessionFactorySSF=newSqlSessionFactoryBuilder().build(reader); 
    //3、 SqlSessionFactory  
    SqlSessionsqlSession=SSF.openSession(); 
    return sqlSession; } 
SqlSession은 위의 구성을 통해 먼저 Resources를 통해 구현됩니다.getResourceAsReader ("프로필 경로") 방법은 프로필을 불러와reader 대상을 포장한 다음 SqlSessionFactory 인터페이스를 통해reader 대상을 가져와 동적 에이전트, 즉 SqlSessionFactory 세션 공장을 가져오고 세션 공장을 통해 세션 SqlSession () 을 가져옵니다.   
그 중에서 세션 공장에서 실례를 얻을 때 밑바닥 실현 원본 코드는 가져온 매개 변수read를 키로 하고 맵에 대응하는value 값, 즉 Mapper Proxy Factory를 찾습니다.
위에서 말한 것은 편집자가 여러분께 소개한 Mybatis 인터페이스식 프로그래밍의 원리입니다. 여러분께 도움이 되었으면 합니다. 만약에 궁금한 것이 있으면 저에게 메시지를 남겨 주십시오. 편집자는 제때에 여러분에게 회답할 것입니다.여기에서도 저희 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기