MyBatisのマスター(5)SQLSESSIONのAPIの使用へのエントリから

MyBatisのマスター(5)SQLSESSIONのAPIの使用へのエントリから

 ディアンプロフィール

   SQLSESSION同様のMyBatisの外部インタフェース層、ほとんどすべての外部API、したがって、まだ必要SQLSESSION理解MyBatisのを使用することを学びます。

 対応する公式文書

二ディアン設定SQLSESSION環境<環境/>

   <環境/>二つの構成、トランザクション管理、データソースを含む。ここでの唯一の学習のために構成、トランザクションの実用化は、典型的には、ドルイドとして、一般に、データソース、洗練されたデータベース接続のプールで使用されるSpringコンテナを、参照され、HikariCP

    < 環境デフォルト= "開発" > 
        < 環境ID = "開発"  > 
            < トランザクションマネージャーのタイプ= "JDBC" /> 
            < データソースのタイプ= "POOLED" > 
                < プロパティ= "ドライバ" = "$ {ドライバ}" /> 
                < プロパティ= "URL" = "$ {URL}" /> 
                < プロパティ= "ユーザ名" = "$ {ユーザー名}"/> 
                < プロパティ= "パスワード" = "$ {パスワード}" /> 
            </ のdataSource > 
        </ 環境> 
    </ 環境>

 

 

SqlSessionFactoryに対応した構成を用いて構築水と

        文字列リソース= "MyBatisの-config.xmlの" ; 
        InputStream InputStreamは = Resources.getResourceAsStream(リソース)
        この .sqlSessionFactory = 新しい。SqlSessionFactoryBuilder()(InputStreamを)構築します。

 

 

四のディアン使用SqlSessionFactory GET SQLSESSION

  SQLSESSION例を取得する前に、以下の3つのことを考えてみます。

    取引:私はやる(自動コミット)のセッションでトランザクションを使用するか、または自動送信機能を使用する必要がありますか?(通常はデータベースおよび/またはJDBCドライバがない取引の多くを意味します)
    接続:私はそれを得るために、データソースからMyBatisの設定に依存する必要がありますか?それとも自分自身を提供するために、コンフィギュレーションを使うのか?
    文を実行します。私は、MyBatisのが行う(挿入や削除を含む)プリペアドステートメントおよび/またはバッチ更新を再利用する必要がありますか?

 

  4.1)デフォルトの方法

    @Test
     公共 ボイドsqlSessionTest(){
         // のOpenSession()がトランザクションをオープンし、それが自動的に送信しない
         // データソース環境から現在の構成接続インスタンスを取得
         // トランザクション分離レベルのJDBCのデフォルト設定またはデータソース
         / / たびに、処理新しいステートメント準備文を再利用しない
        試みを(= SQLSESSION SQLSESSION この.sqlSessionFactory.openSession()){ 
            UserMapperマッパー = sqlSession.getMapper(UserMapper。クラス); 
            ユーザーユーザー = mapper.selectUser (1。); 
            sqlSession.commit(); 
            Assert.assertTrue(user.getUserId() == 1 ); 
        } 
    }

 

  4.2)バッチ実行(カスタム)

    / * 
    デフォルトのトランザクションで有効になっSQLSESSIONのOpenSession()//が自動的に提出していない
    カスタム提出するかどうかを設定SQLSESSIONのOpenSession(ブール値はautoCommit)// 
    SQLSESSIONのOpenSession(コネクション接続)//カスタム接続を使用する必要性を、あなたはパラメータを渡すことができ、注意接続MyBatisのが使用するための設定は、両方のはautoCommitの同時期と方法を上書きすることはありませんが使用されている、環境、接続を設定
    SQLSESSIONのOpenSession(TransactionIsolationLevelレベル)//トランザクション分離レベル
    SQLSESSIONのOpenSession(ExecutorType execType、TransactionIsolationLevelレベル)
    SQLSESSIONのOpenSession (ExecutorType execType)
    SQLSESSIONのOpenSession(ExecutorType execType自動コミットブール)
    SQLSESSIONのOpenSession(ExecutorType execType、接続接続)
    の設定getConfiguration(); 
     
    ExecutorType.SIMPLE:エグゼキュータのこのタイプは特別何もしません。これは、各ステートメントを実行するための新しい準備文を作成します。
    ExecutorType.REUSE:エグゼキュータのこのタイプは準備されたステートメントを再利用します。
    ExecutorType.BATCH:このexecutorがバッチすべての更新ステートメントを、その中でSELECT実行された場合、必要に応じて、読みやすさの動作を保証するために、それらを区別するだろう。
     * / 
    @Test 
    公共 無効sqlSessionTest2(){ 
        SQLSESSION SQLSESSION = ヌル;
         試み{
             / * 
            バッチ実行
            DEBUG [メイン] -準備==> :,,(ユーザー(user_idは、USER_NAME、年齢、国)の値に挿入??? ?)
            DEBUG [メイン] - ==>パラメータ:11(整数)、ttxx​​xxxx(文字列)、11(整数)、ヌル
            DEBUG [メイン] - ==>パラメータ:12(整数)、ttxx​​xxx12(文字列)、12 (整数)、NULL 
             * / 
            SQLSESSION =sqlSessionFactory.openSession(ExecutorType.BATCH)。
            UserMapper userMapper = sqlSession.getMapper(UserMapper。クラス)。
            
            
            ユーザのユーザ = 新しいユーザー(); 
            user.setUserId( 11 )。
            user.setAge( 11 )。
            user.setUserName( "ttxxxxxx" ); 
            userMapper.insertUser(ユーザ)。
            
            
            user.setUserId( 12 )。
            user.setAge( 12 )。
            user.setUserName( "ttxxxxx12" ); 
            userMapper.insertUser(ユーザ)。
            
            sqlSession.commit(); 
            
        } キャッチ(例外e){ 
            e.printStackTrace(); 
            もし(!SQLSESSION = ヌル){ 
                sqlSession.rollback(); 
            } 
        } 最後に{
             場合(SQLSESSION!= NULL ){ 
                sqlSession.close()。
            } 
        } 
    }

 

  4.3)文は、対応するSQLを実行し、指定したメソッドに対応しました  

  sqlSession.getMapper(UserMapper。前の元の方法は、底部に、より近い。クラスマッパーの一例に相当するが、動的プロキシを使用して取得し、指定されたメソッドstementに対応する方法の使用で生成されたプロキシクラスは、対応を行いますSQL

    / * 
    ステートメントの方法SQLSESSION実行は
    、SQL文の指定に対応し、マッパークラス名+メソッド名に対応する文を指摘
    
    <T> T selectOne間(文の文字列、オブジェクトパラメータ)
    <E>リストの<E> SelectListのである(文字列ステートメント、パラメータオブジェクト)
    カーソルを戻す// <T>カーソル<T> selectCursor(文の文字列、オブジェクトパラメータ)は、検索データ延期することができる
    <K、V>地図<K 、V>のSelectMAP(文字列ステートメント、オブジェクトパラメータ、文字列MapKey)
    int型のINSERT(文の文字列、オブジェクトパラメータ)
    int型の更新(文の文字列、オブジェクトパラメータ)
    INT(文の文字列、オブジェクトパラメータ)を削除
     * / 
    @Test 
    公共 無効execSqlTest(){
         試み(= SQLSESSION SQLSESSION この.sqlSessionFactory.openSession()){ 
            
            カーソル <ユーザー> userCursor = sqlSession.selectCursor( "com.ttx.example.mapper.UserMapper.selectUser"、1); // 声明是类名+方法名
            
            のIterator <ユーザー> ITER = userCursor.iterator();
            一方、(iter.hasNext()){ 
                ユーザーユーザー = iter.next()。
                System.out.println(user.getUserId() + ":" + user.getUserName()); 
            } 
        } 
    }

 

  4.4)@SqlProviderのJava SQLコードで書かれました

      UserSqlProvider.java

公共の 静的な文字列buildSelectUserById(){
         返す 新しいSQL(){{ 
            SELECT( "*" ); 
            (FROM "ユーザー" ); 
            WHERE( "USER_ID =#{}はuserId" )。
            ORDER_BY( "USER_ID" ); 
        }}のtoString()。
    }

 

  UserSqlProviderMapper.java

    @ResultMap( "ユーザマップ" 
    @SelectProvider(タイプ = UserSqlProvider。クラス、メソッド= "buildSelectUserById" 
    ユーザselectUserById(@Param( "はuserId")のint USERID)。

 

  UserSqlProviderMapper.xml

<?のXmlバージョン= "1.0"エンコード= "UTF-8" ?> 
<!DOCTYPEマッパー
        PUBLIC " - // mybatis.org//DTDマッパー3.0 // EN" 
        「http://mybatis.org/dtd/mybatis mapper.dtd - 3 " > 
< マッパー名前空間=" com.ttx.example.mapper.UserSqlProviderMapper " > 
    
    <! - このresultMap、マッピング結果- > 
    < このresultMap ID ="ユーザマップ" タイプ=" com.ttx.example .entity.User " > 
        < コンストラクタ> </ コンストラクタ>   <! - 省略することができる構成パラメータを参照するために使用されます- > 
        <ID = "user_idは" プロパティ=「はuserId」/>   <! - 結果は、オブジェクトのプロパティを識別するエレメントIDによって表される- > 
        < 結果カラム=「USER_NAME」プロパティ=「ユーザ名が」/> 
        < 結果カラム=「年齢」プロパティ=「年齢」/> 
        < 結果= "国" プロパティ= "国" /> 
    </ このresultMap > 

</ マッパー>

 

  テストコード

    // 注解@SelectProvider 
    @Test
     公共 無効sqlProviderTest(){ 
        
        してみてください(SQLSESSION SQLSESSION = この.sqlSessionFactory.openSession()){ 
            UserSqlProviderMapperマッパー = sqlSession.getMapper(UserSqlProviderMapper。クラス)。
            ユーザのユーザ = mapper.selectUserById(1 )。
            
            Assert.assertTrue(user.getUserId() == 1 )。
        } 
        
    }
    

 

  メモは、使用後SQLSESSION、接続を閉じる必要が、上記のコードは、(){}試みを使用し、自動的にシャットダウンします

 

  ソースコードを表示するにはここをクリック

 

教材:

  公式ドキュメント

 

おすすめ

転載: www.cnblogs.com/timfruit/p/11391887.html