1はじめに
Mybatis:データベースと相互作用する永続層フレームワーク(sqlマッピングフレームワーク)
。mybatisの前は、元のデータベース操作にはjdbc — dbUtils(QueryRunner)— JdbcTemplate —があります。これらのツールは面倒で、sqlはハードコーディングされています。
2.環境設定
2.1Javaプロジェクトを作成する
2.2データをカプセル化するためのセキュリティテストライブラリ、テストテーブル、javabean、およびデータベースを操作するためのdaoインターフェイスを作成します
2.3mybatisでデータベースを操作する
2.3.1ガイドパッケージ
mysql-connector-java-5.1.37-bin.jar
mybatis-3.4.1.jar
log4j-1.2.17.jar
2.3.2構成の書き込み
- 最初の構成ファイル-グローバル構成ファイル:(mybatisのグローバル構成ファイルと呼ばれ、接続するデータベースなど、mybatisを正しく実行する方法をガイドします)
<?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>
<environments default="development">
<environment id="development">
<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="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
- 2番目の構成ファイル-SQLマッピングファイル:(各メソッドの記述方法、データベースへのSQLステートメントの送信方法、実行方法...インターフェイスの実装クラスと同等)
<?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="org.mybatis.example.BlogMapper">
<select id="selectBlog" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>
- 上で書いたdaoインターフェースの実装ファイルは、デフォルトではmybatisには知られていません。
需要在全局的配置文件中注册
<!--引入我们自己编写的每一个接口的实现文件-->
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
注意:
parameterTypeを書き込むことはできません
。SQLに、追加、削除、および変更を行う戻り値の型を書き込む必要はありません。追加、削除、および変更によって影響を受ける行数、ブール値を返す場合(影響を受ける) 0行、falseを返します)
2.3.3テスト
- グローバル構成ファイルに従って、最初にSqlSessionFactoryオブジェクトを取得します
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
- SQLSessionオブジェクトを取得します(以前に接続を取得するのと同じです)
SQLSession openSession = sqlSessionFactory.openSession();
- 現在のセッション(マッパー)を介してdaoインターフェースの実装を取得します
EmployeeDao dao = openSession.getMapper(EmployeeDao.class);
//try{
dao.xxxById(); //调用查询方法
}finally{
//跟新数据库时必须commit,否则不生效(查询方法可以不用);也可在创建session时传入true参数代表自动提交: SQLSession openSession = sqlSessionFactory.openSession(true);
//openSession.commit();
openSession.closs();
}
3.mybatisの2つの構成ファイル
3.1グローバル構成ファイル
mybatis-config.xml:mybatisが正しく実行されるようにガイドするいくつかのグローバル構成
グローバル構成ファイルのプロパティ:
3.2SQLマッピングファイル
EmployeeDao.xml:daoインターフェースの実装記述と同等
セッションを介してdaoインターフェースの実装を取得します。取得されるのはインターフェース
EmployeeDao dao = openSession.getMapper(EmployeeDao.class);
のプロキシオブジェクトです(mybatisによって自動的に作成されます)
。SqlSessionFactoryはSQLSessionオブジェクトを作成し、ファクトリは1回だけ新しくする必要があります
。新しいsqlSessinを作成する必要があります。毎回;
3.2.1SQLマッピングファイルのタグ
-
cache、cache-ref:キャッシュに関連
-
削除、挿入、selete、更新
-
parameterMap:パラメータマップ、(廃止)...元々は複雑なパラメータマッピングに使用されていました
-
resultMap:結果マッピング:カスタム結果セットカプセル化ルール
データの各列のマッピングルールをカスタマイズし、javaBean
type = "":どのjavaBeanカスタムカプセル化ルールを指定します;完全なクラス名
id = "":一意の識別:エイリアスが
主キー列を参照できるようにします:<id property="id" column="id"/>
column = "主キー列 ":どの列が主キーであるかを指定します
。主キー列のProperty =" ":catのどの属性がIDのタイプをカプセル化するかを指定します。
結果セットにはオブジェクトの文言が含まれる
か
、コレクションが含まれます
-
sql:再利用可能なsqlを抽出します
3.2.1.1削除、更新、挿入
4. mybatisの#と$の違い
mybatisでは、値を取得する2つの方法があります。
#(属性名):これはパラメーターの事前コンパイルの方法であり、パラメーターの位置は?に置き換えられます。パラメーターは後で事前コンパイルされた設定であり、安全で、SQLインジェクションはありません。
$ {プロパティ名}:パラメータの事前コンパイルではありませんが、SQLステートメントと直接結合されます。安全ではありませんが、テーブル名を動的に取得できます。
5.動的SQL
5.1。 <where>
5.2。 <if>
5.3。 <trim>
トリム:文字列をインターセプトします:
prefix = "":プレフィックス:SQL
全体にプレフィックスを追加しますprefixOverrides = "":文字列全体の前にある余分な文字を削除します
suffix = "":全体にサフィックスを追加します;
SupplementOverrides = "":後者のどちらが多すぎるかを削除できます
5.4。 <foreach>
foreach:コレクションをトラバースするために使用されますコレクション
の属性は次のとおりです。
collection = "":トラバースするコレクションのキーを指定します。通常、リスト、マップ、その他のタイプを指定できます
- 注:その時点でタイプをカスタマイズする場合、この値は仮パラメーターの変数名ではなく、
@Param
指定された名前がインターフェースで使用されますclose = "":
index = ""で終わるもの:インデックス:
- トラバーサルが1の場合
list
、indexは、指定された変数が現在のインデックスを保存することを示しますitem
;:現在トラバーサルされた要素の値を保存します- トラバーサルが1の場合
map
、index:指定された変数は、現在トラバースされている要素を保存するキーであり、item
:は、現在トラバースされている要素の値です。item = "変数名":簡単に参照できるように、トラバースされた各要素の変数名で始まります
open = "":トラバースされた各要素の
セパレーターで始まります
5.5<choose
ブランチ選択ラベル
6.キャッシュメカニズム
Mybatisキャッシュメカニズム:マップ;クエリされたデータの一部を保存できます;
第1レベルのキャッシュ:スレッドレベルのキャッシュ;ローカルキャッシュ; SqlSessionレベルのキャッシュ;
第2レベルのキャッシュ:グローバルキャッシュ;現在のスレッドに加えて; SqlSession使用できる他のものを使用できます。
6.1。レベル1キャッシュ
6.1.1。デフォルトで存在するmybatisの第1レベルのキャッシュ(SqlSessionレベルのキャッシュ)。
以前にクエリされたデータである限り、mybatisはデフォルトで第1レベルのキャッシュ(マップ)に保存されます。次にデータが取得されると、キャッシュから直接取得されます。
6.1.2。第1レベルのキャッシュ無効化のいくつかのケース
- 別のSqlSession
- 同じ方法、異なるパラメータ
- 同じSqlSession中に追加、削除、および変更操作を実行すると、追加、削除、および変更によってキャッシュが空になります。
- キャッシュを手動でクリアする
openSession.clearCache();
6.2。第2レベルのキャッシュ
第1レベルのキャッシュは、SqlSessionが閉じられるか送信された後、第1レベルのキャッシュのデータが第2レベルのキャッシュに配置されます。
6.2.1.2番目のレベルのキャッシュをオンにします
Mybatisはデフォルトで第2レベルのキャッシュをオンにしません。
- グローバル構成ファイルで開きます
<settings>
<!--开启全局缓存开关-->
<setting name="cacheEnabled" value="true"/>
</settings>
- SQLマッピングファイル(xxxDao.xml)で、第2レベルのキャッシュを使用するようにします
<!-- 使用二级缓存-->
<cache></cache>
- シリアル化することを忘れないでください
6.2.2。
- 第1レベルのキャッシュと第2レベルのキャッシュに同じデータはありません
- 第2レベルのキャッシュ:第1レベルのキャッシュは、閉じられると閉じられます。
- 第1レベルのキャッシュ:第2レベルのキャッシュに二次データがない場合は、第1レベルのキャッシュを調べ、第1レベルのキャッシュがない場合はデータベースをチェックします。データベースの結果クエリは第1レベルのキャッシュに配置されます。
- いつでも、最初に第2レベルのキャッシュを確認し、次に第1レベルのキャッシュを確認します(キャッシュがない場合)。データベースに移動します。
6.3キャッシュ関連の設定
- グローバル設定
cacheEnable
:第2レベルのキャッシュを構成するためのスイッチ。第1レベルのキャッシュは常にオンです。 - selectタグの
useCache
属性:この選択に第2レベルのキャッシュを使用するかどうかを構成します。第1レベルのキャッシュは常に使用されます。 - sqlタグの
flushCache
属性:デフォルトを追加、削除、および変更しますflushCache=true
。SQLが実行された後、最初と2番目のキャッシュが同時にクリアされます。デフォルトのクエリflushCache=false
。 - sqlSession.clearCache():第1レベルのキャッシュをクリアするためにのみ使用されます。
- C / U / D操作が特定のスコープ(第1レベルのキャッシュセッション/第2レベルのキャッシュ名前空間)で実行されると、デフォルトでは、このスコープの下で選択されているすべてのキャッシュがクリアされます。
7.サードパーティのキャッシュを統合する
4.mybatisの4つの主要コンポーネント
4.1エグゼキュータ
エグゼキュータ:SQLを実行します
4.2 ParameterHandler
パラメータプロセッサ:(typeHandlers
タイププロセッサ)を呼び出してパラメータ変換を実行します
4.3。ResultSetHandler
結果セットプロセッサ:クエリ結果セットを指定されたオブジェクトにカプセル化する責任があります