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(整数)、ttxxxxxx(文字列)、11(整数)、ヌル DEBUG [メイン] - ==>パラメータ:12(整数)、ttxxxxx12(文字列)、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、接続を閉じる必要が、上記のコードは、(){}試みを使用し、自動的にシャットダウンします
教材: