序文
この記事では、主にMyBtisの方が重要だと思ういくつかのポイント、またはインタビューでのMyBatisのいくつかの高頻度の質問の分析を共有します。良い〜
あまりナンセンスではありません。乾物から始めましょう。!!
MyBatisフレームワーク
1.基本的な概要
1。概要:
MyBatisを学んだことのある人なら誰でも、MyBatisはJDBCの拡張バージョンと言えることを知っています。これはJDBCに関連しているため、誰もがMyBatisの役割を知っている必要があり、当然データベースから分離することはできません。
MyBatisは主流のORMフレームワークであり、以前はiBatisと呼ばれていましたが、後にデータ永続性のフレームワークであるMyBatisに名前が変更されました。
2.利点:
これはJDBCの拡張バージョンであるため、JDBCを学習していると、JDBCコードの量が比較的多く、MyBatisがJDBCをカプセル化するため、コードの量が大幅に削減されることがわかります。
- JDBCコードの開発を大幅に簡素化します
- シンプルで使いやすく、使いやすく、柔軟性が高い
- XMLでSQLを定義することにより、プログラムの結合を減らします
- 動的SQLをサポートし、特定のビジネスニーズに応じて柔軟に機能を実現できます
3.デメリット:
MyBatisは最高ですか?最適化されたJDBCでさえ、すべてに利点があります
- Hibernateと比較して、開発者はより多くの作業を完了する必要があります。たとえば、SQLの定義、POJOとデータ間のマッピング関係の設定などです。
- 開発者は特定のSQL書き込み能力を持っている必要があり、特定のシナリオではワークロードが比較的大きくなります
- データベースの移植性が悪いSQLは基盤となるデータベースに依存しているデータベースを移行する場合は、SQLの一部を書き直す必要があります
第二に、環境建設の問題
MyBatisを学び始めたばかりの友達にとって、環境の設定は頭痛の種になる可能性があります。次に、環境の設定と初めてのテストで誰もが犯す可能性のある間違いを要約します。
1.構成ファイルは登録に使用できません
2.バインディングインターフェイスエラー
3.メソッド名が間違っている
4.戻り値のタイプが正しくありません
5.Mavenエクスポートリソースエラー
6.mysqlは5.7より前です。ドライバーを登録するときはcom.mysql.jdbc.Driverである必要が
あり、mysql5.7以降はcom.mysql.cj.jdbc.Driverです。
3、CRUDの考慮事項
データベース操作を実行する場合:トランザクションの追加、削除、変更、およびコミット!!!
2つの方法があります。
手動送信: sqlSession.commit();トランザクションを送信するメソッド
自動送信:
ツールクラスを作成するときに手動でtrueに設定できます
//既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
// SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession(true);
}
4、構成分析
1.環境と属性
①環境:
MyBatisは複数の環境に適応するように構成できますが、注意してください:複数の環境を構成できますが、各SqlSessionFactoryインスタンスは1つの環境しか選択できません。
MybatisのデフォルトのトランザクションマネージャーはJDBCです
接続プール:POOLED
②プロパティ:
プロパティプロパティを使用して、参照構成ファイルを作成できます
これらの属性は外部で構成でき、動的に置き換えることができます。これらのプロパティは、一般的なJavaプロパティファイルで構成するか、properties要素のサブ要素で[db.properties]を設定できます。
<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>
2.一般的な構成
次に、次のことを説明します。タイプエイリアス
タイプエイリアスは、Javaタイプの省略名を設定できます。
これはXML構成にのみ使用され、完全修飾クラス名の冗長な書き込みを減らすことを目的としています。例えば:
<typeAliases>
<typeAlias type="com.zjd.pojo.User" alias="User"/>
</typeAliases>
または、パッケージ名を使用します。
エンティティクラスのパッケージをスキャンします。デフォルトのエイリアスは、このクラスのクラス名の小文字です。
<typeAliases>
<package name="com.zjd.pojo"/>
</typeAliases>
総括する:
エンティティクラスが少ない場合は、最初のメソッドを使用してください
エンティティクラスが多すぎる場合は、2番目を使用できます
しかし、最初のタイプはdiyによってエイリアス化できます
2番目のタイプは、アノテーション@Alias()を追加することでエイリアス化できます。
3.マッパー
mybatisプログラムを初めて実行したときは、次のエラーが表示されているはずです。MapperRegistryは、次の
ことを意味
します。コア構成ファイルで対応するインターフェイスをバインドしない場合、実行時にマッパーファイルが登録およびバインドされません。プログラムはMapper.xmlを認識しますか?
方法1:
<mappers>
<mapper resource="com/wdit/dao/userMapper.xml"/>
</mappers>
方法2:
クラスファイルバインディング登録を使用する
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mappers>
注意点:
- インターフェイスとそのマッパー設定ファイルは同じ名前である必要があります
- インターフェイスとそのマッパー設定ファイルは同じパッケージに含まれている必要があります
方法3:
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
注意点:
- インターフェイスとそのマッパー設定ファイルは同じ名前である必要があります
- インターフェイスとそのマッパー設定ファイルは同じパッケージに含まれている必要があります
4.ライフサイクルと範囲
SqlSessionFactoryBuilder:
- SqlSessionFactoryが作成されると、それは不要になります
- ローカル変数
SqlSessionFactory:
- 簡単に言えば、次のように理解できます。データベース接続プール
- SqlSessionFactoryが作成されると、アプリケーションの実行中に常に存在する必要があります。それを破棄したり、別のインスタンスを再作成したりする理由はありません。
- したがって、SqlSessionFactoryの最適なスコープはアプリケーションスコープです
- 最も簡単なのは、シングルトンモードまたは静的シングルトンモードを使用することです。
SqlSession:
- 接続プールへの接続要求!
- 使い切ったらすぐに閉じる必要があります。そうしないと、リソースが占有されます。
- SqlSessionのインスタンスはスレッドセーフではないため、共有できないため、最適なスコープはリクエストスコープまたはメソッドスコープです。
5.属性名とフィールド名の間の不整合の問題を解決します
pwdがデータベーステーブルに書き込まれている場合がありますが、エンティティクラスを作成するとパスワードとして書き込まれるため、テスト時にエラーが報告されます。どうすればよいですか。
1.方法1:
エイリアス
select id,name,pwd as password from user where id= #{id}
2.方法2:
ResultMap結果セットマッピングを使用する
<!-- 结果集映射-->
<resultMap id="UserMap" type="User">
<!-- column数据库中的字段,property实体类中的属性-->
<result column="id" property="id"/>
<result column="name" property="name"/>
<result column="pwd" property="password"/>
</resultMap>
<select id="getUserByID" resultMap="UserMap">
select * from mybatis.user where id= #{id}
</select>
6、多対1、1対多の問題
多対1と1対多の質問はMyBatisでよくある質問であり、インタビュアーからもよく聞かれます。
ここでは、2つの実装方法について簡単に説明し
ます。①結果に応じたネストされたクエリ--- ----- --------------> sqlステートメントが完了しました
②クエリのネストされたクエリに従います------------------ ---->サブクエリと同様に、sqlステートメントnested sqlステートメント
どちらの方法も問題を解決する方法であり、優位性はありませんが、注意が必要です。
- SQLの可読性を確保する[理解しやすい]
- 1対多および多対1の属性名とフィールドの問題に注意してください
- 問題を取り除くのは簡単ではありません、あなたはログを使うことができます
7つの動的SQL
いわゆる動的SQL、さまざまな条件に従って
動的にSQL動的SQLを生成することは比較的理解しやすいことを理解できます。ここでは、主にSQLフラグメントについて説明します。
<sql id="if-title-author">
<if test="title != null">
and title=#{title}
</if>
<if test="author != null">
and author = #{author}
</if>
</sql>
動的SQLを作成すると、同じコードが頻繁に表示されることがわかります。現時点では、SQLフラグメントのメソッドを使用して、繰り返されるSQLを抽出できます。
<include refid="if-title-author"></include>
後続のSQLステートメントで、使用するincludeタグを挿入して、コードの複雑さを軽減します。
8、キャッシュ
ここでは、主にMyBatisのキャッシュの原則について説明し
ます。ユーザークエリの順序:
実際には右から左、つまり、第2レベルのキャッシュ(第1レベルのキャッシュ)からデータベースへ