穴埋めシリーズ | Mybatis入門

MyBatis フレームワーク

学習するのに2日以上かかりましたが、今回は王和先生の​​ビデオに従って学習しましたが、ビデオにあるように、学習中は孤独に耐え、学習を継続しなければなりません。

第 1 章 フレームワークの概要

1. 3層アーキテクチャ

mvc: Web 開発では、mvc アーキテクチャ パターンを使用します。m: データ、v: ビュー、c: コントローラー。

Cコントローラ:リクエストを受け取り、サービスオブジェクトを呼び出し、リクエストの処理結果を表示します。現在サーブレットをコントローラーとして使用しています

vView: jsp、html、css、js を使用します。リクエストの処理結果を表示し、データをm単位で表示します。

m デ​​ータ: データベース mysql から、ファイルから、ネットワークから

mvc の機能:
1) デカップリングを実現します。
2) mvc にその役割を実行させます。
3) システムの拡張を改善します。メンテナンスが容易になります。

3 層アーキテクチャ:

1. インターフェース層(ビュー層):ユーザーリクエストを受け付け、サービスを呼び出し、リクエストの処理結果を表示します。jsp、html、サーブレット、その他のオブジェクトが含まれます。対応するパッケージコントローラー

2. ビジネス ロジック層: ビジネス ロジックを処理し、アルゴリズムを使用してデータを処理します。データをインターフェース層に返します。サービス パッケージと、パッケージ内の多くの XXXService クラスに対応します。例: StudentService、OrderService、ShopService

3. 永続層 (データベース アクセス層): データベースへのアクセス、ファイルの読み取り、またはネットワークへのアクセス。データを取得します。対応するパッケージはdaoです。dao パッケージには StudentDao、OrderDao、ShopDao などが多数含まれています。

2. 3層アーキテクチャのリクエスト処理フロー

ユーザーがリクエストを開始 ----> インターフェイス層 ----> ビジネス ロジック層 ----> 永続層 ----> データベース (mysql)

3. なぜ 3 つのレイヤーを使用するのですか?

1. 明確な構造、低結合、各層の明確な分業
2. 高い保守性と拡張性
3. 標準化に貢献
4. 開発者は構造全体の 1 つの層の機能実装のみに集中できる
5.各レベルでのロジックの再利用

4. 3層アーキテクチャモデルとフレームワーク

各層はフレームワークに対応します。
1) インターフェイス層 - SpringMVC フレームワーク
2) ビジネス層 - Spring フレームワーク
3) 永続層 - MyBatis フレームワーク

5.フレームワーク

1) フレームワークとは何ですか? フレームワーク
: いくつかの機能を完成させるソフトウェアです。ソフトウェア内のクラスとクラス間のメソッド呼び出しが規定されています。これらを通じて特定の機能を実行できます。フレームはテンプレートとして考えられます。

フレームワークはアップグレードおよび変更できます。フレームは安全です。
フレームワークは特定の側面では役立ちますが、全能ではありません。

6. フレームワークによって解決される問題

1) フレームワークは技術統合を実現できます。

2) 開発効率を提供します。難易度を下げます。

7. jdbcによるデータベースアクセスのメリットとデメリット

アドバンテージ:

  1. 直感的でわかりやすい

欠点:

  1. 多くのオブジェクトを作成します Connection、Statement、ResultSet
  2. ドライバーを登録する
  3. SQL文を実行する
  4. ResultSet を Student、List コレクションに変換します。
  5. リソースを閉じる
  6. SQL ステートメントとビジネス ロジック コードが混在している

8 MyBatis フレームワーク

mybatis とは: 永続化レイヤー フレームワークです。元の名前は ibatis で、2013 年に MyBatis に名前変更されました。MyBatis はデータベースを操作し、データの追加、削除、変更、クエリを実行できます。高度な JDBC と考えてください。jdbcの欠点を解決します。

マイバティスって何ができるの?

  1. ドライバーを登録します。
  2. jdbcで使用するConnection、Statement、ResultSetを作成する
  3. SQL文を実行してResultSetを取得します。
  4. ResultSet を処理し、レコード セット内のデータを Java オブジェクトに変換し、さらに Java オブジェクトを List コレクションに入れます。
  5. リソースを閉じる
  6. SQL ステートメントと Java コードの分離を実現します。

mybatisのドキュメント

第 2 章 MyBatis の使用を開始する

2.1 最初の例

実装手順:
0. 学生テーブル (ID、名前、電子メール、年齢) を作成します。

1. 新しい Maven プロジェクトを作成する

2.pom.xmlを変更する

  • mybatis、mysql driver、junit への依存関係を追加する

  • <build>リソースプラグインの追加

<resources>
            <resource>
                <directory>src/main/java</directory><!--所在的目录-->
                <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
</resources>

3. エンティティ クラス Student を作成します。属性を定義し、属性名と列名の一貫性を保つ

4. Dao インターフェースを作成し、データベースを操作するメソッドを定義します。

5. XML ファイル (マッパー ファイル) を作成し、SQL ステートメントを記述します。

  • Mybatis フレームワークの推奨事項は、SQL ステートメントと Java コードを分離することです

  • マッパー ファイル: 定義は dao インターフェイスと同じディレクトリにあり、各テーブルに 1 つのマッパー ファイルがあります。

6. mybatis のメイン設定ファイル (xml ファイル) を作成します。リソース ディレクトリに 1 つあります。

1) 接続インスタンスを作成するデータソース (DataSource) オブジェクトを定義します。

2) 他のマッパー ファイルの場所を指定する

7. テストコンテンツを作成します。

main メソッドを使用して、データベースへの mybatis アクセスをテストします。

junit を使用してデータベースにアクセスすることもできます

2.2 コンセプト

1. 自動送信: SQL ステートメントが実行された後、トランザクションをコミットします。データベース更新操作の間にデータを保存する

2. トランザクションを手動で送信する (手動): トランザクションを送信する必要がある場合は、メソッドを実行し、トランザクションを送信するか、トランザクションを確認します。

2.3 MyBatis のいくつかの重要なオブジェクト

1) リソース: mybatis フレームワーク内のオブジェクト。1 つの機能は、主要な構成情報を読み取ることです。

InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");

2) SqlSessionFactoryBuilder: SqlSessionFactory オブジェクトの作成を担当します。

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);

3) SqlSessionFactory: 重要なオブジェクト

SqlSessionFactory は重量のあるオブジェクトです。このオブジェクトを作成するには、より多くのリソースと時間が必要です。プロジェクトに 1 つだけ入れてください。

SqlSessionFactory インターフェイス: SqlSession オブジェクトを作成する、SqlSession のファクトリーとして機能します。

DefaultSqlSessionFactory 実装クラス

public class DefaultSqlSessionFactory implements SqlSessionFactory {
    
     } 

SqlSessionFactory インターフェイスのメソッド

openSession(): デフォルトの SqlSession オブジェクトを取得します。これには、デフォルトでトランザクションを手動で送信する必要があります。

openSession(boolean): ブール値パラメータは、トランザクションを自動的にコミットするかどうかを示します。

true: トランザクションを自動的にコミットする SqlSession を作成します

false: パラメーターなしの openSession と同等

4) SqlSession オブジェクト

SqlSession オブジェクトは、SqlSessionFactory を通じて取得されます。SqlSession 自体はインターフェイスです

DefaultSqlSession: 実装クラス

public class DefaultSqlSession implements SqlSession {
    
     }

SqlSession の機能は、SQL ステートメントを実行するための多数のメソッドを提供することです。

selectOne:执行sql语句,最多得到一行记录,多余1行是错误。
selectList:执行sql语句,返回多行数据
selectMap:执行sql语句的,得到一个Map结果
insert:执行insert语句
update:执行update语句
delete:执行delete语句
commit:提交事务
rollback:回滚事务

SqlSession オブジェクトはスレッドセーフではないことに注意してください 使用手順:
①: メソッド内で SQL ステートメントを実行する前に、SqlSession オブジェクトを取得します
②: SqlSession メソッドを呼び出して SQL ステートメントを実行します
③: SqlSession オブジェクトを閉じて実行しますSqlSession.close()

2.4 ツールクラスとテンプレートの使用

1) テンプレート、マッパー ファイル テンプレート、mybatis メイン設定ファイル テンプレートを作成します。

  • テンプレートを作成する手順:
    [外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが備わっている可能性があります。画像を保存して直接アップロードすることをお勧めします (img-xOjXJoGU-1675148488209) (images/image-20201019094212830.png)]
  • テンプレート ファイルを作成します。
    [外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが備わっている可能性があります。画像を保存して直接アップロードすることをお勧めします (img-yz4ETn2M-1675148488211) (images/image-20201019094359625.png)]
  • ファイルの作成時に使用するテンプレートを選択します。
    [外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが備わっている可能性があります。画像を保存して直接アップロードすることをお勧めします (img-91oYMVmv-1675148488211) (images/image-20201019094616208.png)]

2) ツールクラスの作成

	public class MyBatisUtil {
    
    
    	private static SqlSessionFactory factory = null;

    	static {
    
    
       	 try {
    
    
       	     InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
        	    factory = new SqlSessionFactoryBuilder().build(inputStream);
        	} catch (IOException e) {
    
    
            e.printStackTrace();
       	 }
    	}

   	 public static SqlSession getSqlSession() {
    
    
        SqlSession session = null;
        if (factory != null) {
    
    
        	   session= factory.openSession();
      	}
      	return session;
     }
}

使用

SqlSession session=MyBatisUtil.getSqlSession();
String sqlId=""+"."+""

第 3 章 MyBatis Dao エージェント

3.1 daoエージェント

3.1.1 mybatis はプロキシを提供します

mybatisはDaoインターフェースの実装クラスオブジェクトを作成し、SQL文の実行を完了します。mybatis は、クラス関数を実装するために dao を置き換えるオブジェクトを作成します。

3.1.2 mybatis プロキシを使用するための要件

1) マッパー ファイル内の名前空間は、dao インターフェイスの完全修飾名である必要があります。

2) マッパーファイル内のラベルのIDは、daoインターフェースのメソッド名です。

3.1.3 mybatisプロキシの実装方法

SqlSession オブジェクトのメソッド getMapper(dao.class) を使用します。

例: StudentDao インターフェースが登場しました。

SqlSession session  = MyBatisUtils.getSqlSession();
StudentDao dao  = session.getMapper(StudentDao.class);
Student student = dao.selectById(1001);

//上面代码中
StudentDao dao  = session.getMapper(StudentDao.class);
等同于
StudentDao dao  = new StudentDaoImpl();

3.2 パラメータを理解する

理解するパラメータは次のとおりです。 Java プログラムを通じてデータをマッパー ファイルの SQL ステートメントに渡します。パラメータは主に dao インターフェイス メソッドの仮パラメータを指します。

3.2.1 パラメータの種類

パラメータタイプ: パラメータのタイプを示し、dao メソッドの仮パラメータのデータ型を指定します。この仮パラメータのデータ型は、mybatis によって使用されます。MybatisはSQL文のパラメータに値を代入する際に使用されます。PreparedStatement.setXXX(位置, 値)

第一个用法: java类型的全限定类型名称   parameterType="java.lang.Integer"
第二个用法: mybatis定义的java类型的别名  parameterType="int"

parameterType:mybatis通过反射机制可以获取 dao接口方法参数的类型, 可以不写

<select id="selectById"  parameterType="integer"
                 resultType="com.bjpowernode.domain.Student">
   select id,name,email,age from student where id=#{studentId}
</select>

3.2.2 dao インターフェースメソッドは単純な型パラメータです

//dao接口的方法形参是一个简单类型的
//简单类型: java基本数据类型和String
Student selectByEmail(String email);
<!--
   dao接口是一个简单类型的参数
   mapper文件,获取这个参数值,使用#{任意字符}
-->
<select id="selectByEmail" resultType="com.bjpowernode.domain.Student">
    select id,name,email,age from student where email=#{studentEmail}
</select>

3.2.3 dao インターフェースメソッドには複数の単純型パラメータがあります

@Param: 名前付きパラメータ。メソッドの仮パラメータの前で使用され、パラメータ名を定義します。この名前はマッパー ファイルで使用できます。

daoインターフェース、メソッド定義

/*
  多个简单类型的参数
  使用@Param命名参数, 注解是mybatis提供的
  位置:在形参定义的前面
  属性:value 自定义的参数名称
 */
List<Student> selectByNameOrAge(@Param("myname") String name,
                                @Param("myage") Integer age);

マッパーファイル

<!--
   多个简单类型的参数.
   当使用了@Param命名后,例如@Param("myname").
   在mapper中,使用#{命名的参数}, 例如 #{myname}
-->
<select id="selectByNameOrAge" resultType="com.bjpowernode.domain.Student">
    select id,name,email,age from student where name=#{myname} or age=#{myage}
</select>

3.2.4 dao インターフェースメソッドはオブジェクトをパラメータとして使用します

メソッドの仮パラメータは Java オブジェクトです。この Java オブジェクトは複数のパラメータを表します。
オブジェクトのプロパティ値をパラメータとして使用するJavaオブジェクトの使用

public class Student {
    
    
    private Integer id;
    private String name;
    private String email;
    private Integer age;
    //set|get方法
}
public class QueryParam {
    
    
    private Object p1;
    private Object p2;
    //set|get方法
}

daoインターフェースでのメソッド定義

/*
 * 一个java对象作为参数( 对象由属性, 每个属性有set,get方法)
 */
List<Student> selectByObject(Student student);

List<Student> selectByQueryParam(QueryParam param);

マッパーファイル

<!--
   一个java对象作为方法的参数,使用对象的属性作为参数值使用
   简单的语法: #{属性名} , mybatis调用此属性的getXXX()方法获取属性值
-->
<select id="selectByObject" resultType="com.bjpowernode.domain.Student">
    select id,name,email,age from student where name=#{name} or age=#{age}
</select>

<select id="selectByQueryParam" resultType="com.bjpowernode.domain.Student">
     select id,name,email,age from student where name=#{p1} or age=#{p2}
</select>

<!--负责的语法格式: #{属性名,javaType=java类型的全限定名称,jdbcType=mybatis中定义列的数据类型}-->
<select id="selectByObject" resultType="com.bjpowernode.domain.Student">
        select id,name,email,age from student where
        name=#{name,javaType=java.lang.String,jdbcType=VARCHAR}
        or
        age=#{age,javaType=java.lang.Integer,jdbcType=INTEGER}
</select>

3.2.5 [理解] daoインターフェースの複数の単純なタイプのパラメータとその使用場所

パラメータの位置: dao インターフェイスのメソッドの仮パラメータ リスト。左から右に、パラメータの位置は 0、1、2... です。

構文形式: #{arg0}、#{arg1}

daoインターフェースメソッド

/*
   使用位置,获取参数
 */
List<Student> selectByPosition(String name,Integer age);

マッパーファイル

<!--
   mybatis版本是 3.5.1
   使用位置获取参数值, dao接口方法是多个简单类型的参数
   语法: #{arg0}, #{arg1}....
-->
<select id="selectByPosition" resultType="com.bjpowernode.domain.Student">
    select id,name,email,age from student where name=#{arg0} or age=#{arg1}
</select>

3.2.6 【理解】daoインターフェースパラメータはMapである

mapはdaoインターフェースのパラメータとして使用されます。パラメータ値を取得するにはkeyを使用します。マッパーファイル内の構文形式は#{key}です。

daoインターフェースメソッド

//使用Map作为参数
List<Student> selectStudentByMap(Map<String,Object> map);

マッパーファイル

<!--
   使用Map传递参数,
   在mapper文件中,获取map的值,是通过key获取的,语法:#{key}
-->
<select id="selectStudentByMap" resultType="com.bjpowernode.domain.Student">
     select id,name,email,age from student where name=#{myname} or age=#{myage}
</select>

メソッドが呼び出されるテスト

@Test
public void testSelectByMap(){
    
    
    SqlSession sqlSession = MyBatisUtil.getSqlSession();
    StudentDao dao  = sqlSession.getMapper(StudentDao.class);

    //使用map传递参数
    Map<String,Object> data = new HashMap<>();
    data.put("myname", "李思思");
    data.put("myage", 20);
    List<Student> students = dao.selectStudentByMap(data);

    students.forEach( stu-> System.out.println("stu="+stu));
    sqlSession.close();

}

3.3 # と $ の違い

3.3.1 #プレースホルダー

構文: #{文字}

Mybatis の処理 #{} では、jdbc オブジェクトが PrepareStatment オブジェクトを使用します

<select id="selectById"  parameterType="integer"
             resultType="com.bjpowernode.domain.Student">
    select id,name,email,age from student where id=#{studentId}
</select>

mybatis出创建PrepareStatement对象,执行sql语句
String sql=" select id,name,email,age from student where id=?";
PrepareStatement pst = conn.prepareStatement(sql);
pst.setInt(1,1001);  //传递参数
ResultSet rs  = pst.executeQuery(); //执行sql语句

#{}特徴:

1) PrepareStatement オブジェクトを使用して SQL ステートメントを効率的に実行します。

2) 使用される PrepareStatement オブジェクトは SQL インジェクションを回避し、SQL ステートメントの実行をより安全にします。

3) #{} は列の値としてよく使用され、等号の右側に配置されます。#{} の位置の値はデータ型に関連します。

3.3.2 $ プレースホルダー

構文: ${character}

mybatis は ${} プレースホルダーの SQL ステートメントを実行します

<select id="selectById"  parameterType="integer"
             resultType="com.bjpowernode.domain.Student">
    select id,name,email,age from student where id=${studentId}
</select>	

${} 表示字符串连接, 把sql语句的其他内容和 ${}内容使用 字符串(+) 连接的方式连在一起
String sql="select id,name,email,age from student where id=" + "1001";

mybatis创建Statement对象, 执行sql语句。
Statement stmt  = conn.createStatement(sql);
ResultSet rs  = stmt.executeQuery();

${} の特徴

1) Statement オブジェクトを使用して SQL ステートメントを実行するのは非効率的です

2) ${} プレースホルダーの値と使用される文字列接続方法には SQL インジェクションのリスクがあります。コードのセキュリティ上の問題がある

3) ${} データはそのまま使用され、データ型は区別されません。

4) ${} はテーブル名やカラム名としてよく使用されますが、データのセキュリティが確保できる場合には ${} を使用してください。

3.4 MyBatis の出力結果をカプセル化する

出力結果をカプセル化します。MyBatis は SQL ステートメントを実行し、ResultSet を取得し、それを Java オブジェクトに変換します。

2 つの resultType と resultMap について話します。

3.4.1 結果の種類

resultType 属性: select を実行するときに使用され、ラベルの属性として表示されます。

resultType: 結果の型を示します。Mysql は SQL ステートメントを実行し、Java オブジェクトの型を取得します。これには 2 つの値があります。 1) Java タイプの完全修飾名。2) エイリアスを使用する

1) resultType: Java カスタム オブジェクトを表します。

Student selectById(Integer id);

<select id="selectById"  parameterType="integer"
             resultType="com.bjpowernode.domain.Student">
    select id,name,email,age from student where id=#{studentId}
</select>

resultType:现在使用java类型的全限定名称。 表示的意思 mybatis执行sql,把ResultSet中的数据转为Student类型的对象。  mybatis会做以下操作:
1. 调用com.bjpowernode.domain.Student的无参数构造方法,创建对象。
    Student student = new Student(); //使用反射创建对象
2. 同名的列赋值给同名的属性。
    student.setId( rs.getInt("id"));
    student.setName(rs.getString("name"));
3. 得到java对象, 如果dao接口返回值是List集合, mybatis把student对象放入到List集合。

所以执行 Student mystudent = dao.selectById(1001); 得到 数据库中 id=1001这行数据, 
这行数据的列值, 付给了mystudent对象的属性。 你能得到mystudent对象。 就相当于是 id=1001这行数据。

2) resultType は単純型の
dao メソッドを表します

long countStudent();

マッパーファイル

<!--
  执行sql语句,得到是一个值(一行一列)
-->
<select id="countStudent" resultType="java.lang.Long">
    select count(*) from student
</select>

3) resultType: マップ構造の
dao メソッドを表します。

//查询结果返回是一个Map
Map<Object,Object> selectMap(@Param("stuid") Integer id);

マッパーファイル

<!--
   执行sql得到一个Map结构数据, mybatis执行sql,把ResultSet转为map
   sql执行结果, 列名做map的key , 列值作为value
   sql执行得到是一行记录,转为map结构是正确的。

   dao接口返回是一个map, sql语句最多能获取一行记录,多余一行是错误
-->
<select id="selectMap" resultType="java.util.HashMap">
    select id,name,email from student where id != #{stuid}
</select>

演習:
省 ID を入力して、省 ID、省名、都市 ID、都市名を取得します。
たとえば、省 ID=1
1 河北 1 石家荘
1 河北 2 秦皇島と入力します。

3.4.2 結果マップ

resultMap: 結果マップ。カスタム列名と Java オブジェクト属性の対応。列名と属性名が異なる場合によく使用されます。

使用方法:
1. 最初に resultMap タグを定義し、列名と属性名の対応関係を指定します
2. select タグの resultMap 属性を使用して、上で定義した resultMap の id 値を指定します。

<!--使用resultMap定义列和属性的关系-->
<!--定义resultMap
    id:给resultMap的映射关系起个名称,唯一值
    type:java类型的全限定名称
-->
<resultMap id="customMap" type="com.bjpowernode.vo.CustomObject">
    <!--定义列名和属性名的对应-->
    <!--主键类型使用id标签-->
    <id column="id" property="cid" />
    <!--非主键类型使用result标签-->
    <result column="name" property="cname" />
    <!--列名和属性名相同不用定义-->
    <result column="email" property="email" />
    <result column="age" property="age" />
</resultMap>

<!--使用resultMap属性,指定映射关系的id
    resultMap和resultType 不能同时使用, 二选一。
-->
<select id="selectById2" resultMap="customMap">
  select id,name,email,age from student where id=#{stuid}
</select>

3.5 カスタムエイリアス

mybatis が提供する Java 型定義は短く、覚えやすいです。

エイリアスをカスタマイズする手順:

1) mybatis メイン設定ファイルで、typeAliases タグを使用してエイリアスを宣言します。

2) マッパーファイル内で、resultType="alias"

エイリアスの宣言 (mybatis メイン設定ファイル)

<typeAliases>
    <!--第一种语法格式
        type:java类型的全限定名称(自定义类型)
        alias:自定义别名
    -->
    <typeAlias type="com.bjpowernode.domain.Student" alias="stu" />
</typeAliases>

マッパーファイルで使用される

resultType="别名"
<select id="selectById"  parameterType="integer" resultType="stu">
    select id,name,email,age from student where id=#{studentId}
</select>

3.6 列名とJavaオブジェクトの属性名が異なる場合の解決策

1) resultMap を使用: 列名と属性名の対応をカスタマイズします。
2) resultType を使用: 列の別名を使用して、別名を Java オブジェクトの属性名と同じにします。

3.7 いいね

1 つ目の方法: Java プログラムで、like の内容をアセンブルします。この内容を SQL ステートメントに渡します

//like第一种方式
List<Student> selectLikeOne(@Param("name") String name);
<!--like第一种方式-->
<select id="selectLikeOne" resultType="com.bjpowernode.domain.Student">
    select * from student where name like #{name}
</select>
@Test
public void testLikeOne(){
    
    
    SqlSession sqlSession = MyBatisUtil.getSqlSession();
    StudentDao dao  = sqlSession.getMapper(StudentDao.class);

    String name="%李%";
    List<Student> students = dao.selectLikeOne(name);

    sqlSession.close();

    students.forEach( stu-> System.out.println(stu));
}

2 番目の方法: like の内容を SQL ステートメント内に整理します。

SQL ステートメントの形式は次のとおりです。 where name like "%"space#{name}space"%"

//like第二种方式
List<Student> selectLikeTwo(@Param("name") String name);
<!--like第二种方式-->
<select id="selectLikeTwo" resultType="com.bjpowernode.domain.Student">
    select * from student where name like "%" #{name} "%"
</select>
@Test
public void testLikeTwo(){
    
    
    SqlSession sqlSession = MyBatisUtil.getSqlSession();
    StudentDao dao  = sqlSession.getMapper(StudentDao.class);

    String name="李";
    List<Student> students = dao.selectLikeTwo(name);

    sqlSession.close();

    students.forEach( stu-> System.out.println(stu));
}

第 4 章 動的 SQL

動的 SQL とは: 同じ dao メソッドでも、主に where 部分の変更など、さまざまな条件に応じて異なる SQL ステートメントを表現できます。

mybatis が提供するタグを使用して、主に if、where、foreach、および sql について説明する動的 SQL の機能を実現します。

動的 SQL を使用する場合、dao メソッドの仮パラメータは Java オブジェクトを使用します。

動的 SQL を使用する場合:
[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが備わっている可能性があります。画像を保存して直接アップロードすることをお勧めします (img-hMWKdkfR-1675305031656) (images/image-20201020114831474.png)]

4.1 ifタグ

文法:

<if test="boolean判断结果">
   sql 代码
</if>

在mapper文件中
<select id="selectStudent" resultType="com.bjpwoernode.domain.Student">
      select * from student
      <if test="条件">
          sql语句
      </if>
      <if test="条件">
          sql语句
      </if>
</select>

例:

List<Student> selectIf(Student student);
<!--if
    test: 使用对象的属性值作为条件
-->
<select id="selectIf" resultType="com.bjpowernode.domain.Student">
    select * from student
    where id=-1
    <if test="name !=null and name!=''">
       or  name = #{name}
    </if>

    <if test="age >0">
        or age &lt; #{age}
    </if>
</select>

4.2 whereタグ

if タグを使用すると、SQL ステートメントの構文エラーが発生しやすくなります。if によって引き起こされる文法上の問題を解決するには、where タグを使用します。

使用する場合、where には 1 つ以上の if タグが含まれます。if タグが条件が true であると判断すると、where タグは WHERE キーワードに変換され、SQL ステートメントの末尾に追加されます。どの if 条件も true に該当しない場合は、内部の where と if を無視します。

where タグは最も近い or または and を削除します。

语法:
<where>
    <if test="条件1">sql语句1</if>
    <if test="条件2">sql语句2</if>
</where>

例:

//where
List<Student> selectWhere(Student student);
<!--where-->
<select id="selectWhere" resultType="com.bjpowernode.domain.Student">
    select * from student
    <where>
        <if test="name !=null and name!=''">
            or  name = #{name}
        </if>

        <if test="age >0">
            or age &lt; #{age}
        </if>
    </where>
</select>

4.3 foreach ループ

foreach を使用すると、配列とリスト コレクションをループすることができ、通常は in ステートメントで使用されます。

文法:

< foreach collection="集合类型" open="开始的字符" close="结束的字符"
          item="集合中的成员" separator="集合成员之间的分隔符">
              #{item 的值}
</ foreach>

标签属性:
collection: 表示循环的对象是 数组, 还是list集合。
			 如果dao接口方法的形参是数组, collection="array" ;
			 如果dao接口形参是List, collection="list"
			 
open:循环开始时的字符。  sql.append("(");
close:循环结束时字符。  sql.append(")");
item:集合成员, 自定义的变量。   Integer item  = idlist.get(i);// item是集合成员
separator:集合成员之间的分隔符。  sql.append(","); //集合成员之间的分隔符
#{item 的值}:获取集合成员的值。

最初の方法:

//foreach-1
List<Student> selectForeachOne(List<Integer> idlist);

<!--foreach第一种方式, 循环简单类型的List-->
<select id="selectForeachOne" resultType="com.bjpowernode.domain.Student">
      select * from student
        <if test="list !=null and list.size>0">
            where id in
            <foreach collection="list" open="(" close=")" separator="," item="myid">
                  #{
    
    myid}
            </foreach>
        </if>
</select>

@Test
public void testSelectForeachOne(){
    
    
        //1.获取SqlSession
        SqlSession session = MyBatisUtil.getSqlSession();
        //2.获取dao的代理
        StudentDao dao = session.getMapper(StudentDao.class);

        List<Integer> idlist = new ArrayList<>();
        idlist.add(1001);
        idlist.add(1002);
        idlist.add(1003);

        List<Student> students  = dao.selectForeachOne(idlist);
        
        students.forEach( stu-> System.out.println("stu=="+stu));
        //3.关闭SqlSession对象
        session.close();
    }

2番目の方法:

//foreach-2
List<Student> selectForeachTwo(List<Student> studentList);

<!--foreach第二种方式, 循环的List<Student>-->
<select id="selectForeachTwo" resultType="com.bjpowernode.domain.Student">
        select * from student
        <if test="list != null and list.size>0">
            where id in
            <foreach collection="list" open="(" close=")" separator="," item="stu">
                  #{
    
    stu.id}
            </foreach>
        </if>
</select>
            
 @Test
 public void testSelectForeachTwo(){
    
    
        //1.获取SqlSession
        SqlSession session = MyBatisUtil.getSqlSession();
        //2.获取dao的代理
        StudentDao dao = session.getMapper(StudentDao.class);

        List<Student> list  = new ArrayList<>();
        Student s1 = new Student();
        s1.setId(1001);
        Student s2 = new Student();
        s2.setId(1002);
        list.add(s1);
        list.add(s2);

        List<Student> students  = dao.selectForeachTwo(list);

        students.forEach( stu-> System.out.println("stu=="+stu));
        //3.关闭SqlSession对象
        session.close();
    }

4.4 SQLタグ

sql タグは、テーブル名、複数のフィールド、または where 条件などの SQL コードを表します。sql タグの内容は、他の場所で再利用できます。

使い方:

1) 在mapper文件中定义 sql代码片段 <sql id="唯一字符串">  部分sql语句  </sql>
2)在其他的位置,使用include标签引用某个代码片段

例えば:

<!--定义代码片段-->
<sql id="selectStudent">
    select * from student
</sql>

<sql id="studentFieldList">
    id,name,email
</sql>

<select id="selectIf" resultType="com.bjpowernode.domain.Student">
        <include refid="selectStudent" />
        where id=-1
        <if test="name !=null and name!=''">
           or  name = #{name}
        </if>

        <if test="age >0">
            or age &lt; #{age}
        </if>
</select>

    <!--where-->
    <select id="selectWhere" resultType="com.bjpowernode.domain.Student">
        select <include refid="studentFieldList"/> from student
        <where>
            <if test="name !=null and name!=''">
                or  name = #{name}
            </if>

            <if test="age >0">
                or age &lt; #{age}
            </if>
        </where>
    </select>

第 5 章 MyBatis 設定ファイル

mybatis 設定ファイルには 2 つのカテゴリがあります: 1 mybatis メイン設定ファイル; 2 mybatis マッパー ファイル

  1. mybatis のメイン設定ファイルは、mybatis のグローバル設定を提供します。含まれる内容: ログ、データ ソース、マッパー ファイルの場所
  2. マッパーファイル: SQL ステートメントを記述するために使用されます。1 つのテーブルと 1 つのマッパー ファイル

5.1 設定セクション

設定は mybatis のグローバル設定であり、mybatis 全体の動作に影響します。通常、この設定にはデフォルト値を使用できます。

<settings>
  <setting name="cacheEnabled" value="true"/>
  <setting name="lazyLoadingEnabled" value="true"/>
  <setting name="multipleResultSetsEnabled" value="true"/>
  <setting name="useColumnLabel" value="true"/>
  <setting name="useGeneratedKeys" value="false"/>
  <setting name="autoMappingBehavior" value="PARTIAL"/>
  <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
  <setting name="defaultExecutorType" value="SIMPLE"/>
  <setting name="defaultStatementTimeout" value="25"/>
  <setting name="defaultFetchSize" value="100"/>
  <setting name="safeRowBoundsEnabled" value="false"/>
  <setting name="mapUnderscoreToCamelCase" value="false"/>
  <setting name="localCacheScope" value="SESSION"/>
  <setting name="jdbcTypeForNull" value="OTHER"/>
  <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>

5.2 typeAliase エイリアス

エイリアスの設定

	<typeAliases>
        <!--第一种语法格式
            type:java类型的全限定名称(自定义类型)
            alias:自定义别名
            优点: 别名可以自定义
            缺点: 每个类型必须单独定义
        -->
        <typeAlias type="com.bjpowernode.domain.Student" alias="stu" />
        <typeAlias type="com.bjpowernode.vo.QueryParam" alias="qp" />
        <!--第二种方式
            name:包名, mybatis会把这个包中所有类名作为别名(不用区分大小写)
            优点:使用方便,一次给多个类定义别名
            缺点: 别名不能自定义,必须是类名。
        -->
        <package name="com.bjpowernode.domain" />
        <package name="com.bjpowernode.vo" />
    </typeAliases>

5.3 環境の構成

environments: 环境标签,在它里面可以配置多个environment
       		  属性:default ,必须是某个environment的id属性值。 表示mybatis默认连接的数据库
environment: 表示一个数据库的连接信息。
       		 属性:id ,自定义的环境的标识(唯一值)
transactionManager: 事务管理器
       			    属性:type 表示事务管理器的类型。
                    属性值:1)JDBC: 使用Connection对象, 由mybatis自己完成事务的处理。
                          2)MANAGED: 管理,表示把事务的处理交给容器实现(由其他软件完成事务的提交,回滚)
dataSource: 数据源, 创建的Connection对象, 连接数据库。
       		属性:type 数据源的类型
     	    属性值:1) POOLED, mybatis会在内存中创建PooledDataSource类,管理多个Connection连接对象,使用的连接池
              2) UNPOOLED, 不使用连接池, mybatis创建一个UnPooledDataSource这个类, 每次执行sql语句先创建Connection对象,再执行sql语句, 最后关闭Connection
              3) JNDI : java的命名和目录服务。
<environments default="online">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <!--配置数据源: 创建Connection对象。-->
            <dataSource type="POOLED">
                <!--driver:驱动的内容-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <!--连接数据库的url-->
                <property name="url"
                          value="jdbc:mysql://localhost:3306/springdb"/>
                <!--用户名-->
                <property name="username" value="root"/>
                <!--密码-->
                <property name="password" value="123"/>
            </dataSource>
        </environment>
        <!-- 项目上线后使用的数据库 -->
        <environment id="online">
            <transactionManager type="JDBC"/>
            <!--配置数据源: 创建Connection对象。-->
            <dataSource type="POOLED">
                <!--driver:驱动的内容-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <!--连接数据库的url-->
                <property name="url"
                          value="jdbc:mysql://localhost:3306/springdb"/>
                <!--用户名-->
                <property name="username" value="admin"/>
                <!--密码-->
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

5.4 データベースプロパティ設定ファイルの利用(※)

データベース構成情報は別のファイルに入れて独立して管理する必要があります。ファイル拡張子はプロパティです。このファイルでは、カスタム key=value 形式を使用してデータを表します

使用手順:

1. リソースディレクトリに、xxxx.properties を作成します。

2. ファイルでは、key=value 形式を使用してデータを定義します。
たとえば、jdbc.url=jdbc:mysq://localhost:3306/springdb

3. mybatis メイン構成ファイルで、properties タグを使用して外部プロパティ構成ファイルを参照します。

4. 値が使用されている場合、${key} を使用してキーに対応する値 (等号の右側の値) を取得します。

例:
jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/springdb?useUnicode=true&amp;characterEncoding=utf-8
jdbc.username=root
jdbc.password=123

mybatis メイン設定ファイル

<!--使用外部属性配置文件
    resource:指定类路径下的某个属性配置文件
-->
<properties resource="jdbc.properties" /> 

<environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <!--配置数据源: 创建Connection对象。-->
            <dataSource type="POOLED">
                <!--driver:驱动的内容-->
                <property name="driver" value="${jdbc.driver}"/>
                <!--连接数据库的url-->
                <property name="url" value="${jdbc.url}"/>
                <!--用户名-->
                <property name="username" value="${jdbc.username}"/>
                <!--密码-->
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
         </environment>
</environments>

5.5マッパータグ(*)

マッパーを使用して他のマッパー ファイルの場所を指定します。

マッパー タグをフォーマットするには 2 つの一般的な方法があります。

<mappers>
    <!--第一种方式, resources="mapper文件的路径"
        优点:文件清晰。 加载的文件是明确的。
              文件的位置比较灵活。
        缺点:文件比较多,代码量会比较大,管理难度大
    -->
    <mapper resource="com/bjpowernode/dao/StudentDao.xml"/>
    <mapper resource="com/bjpowernode/dao/OrderDao.xml"/>
    <!--
       第二种方式,使用<package>
       name:包名, mapper文件所在的包名。
       特点: 把这个包中的所有mapper文件,一次加载。

       使用要求:
        1. mapper文件和dao接口在同一目录
        2. mapper文件和dao接口名称完全一样。
    -->
    <package name="com.bjpowernode.dao" />
    <package name="com.bjpowernode.dao1" />
</mappers>

第6章 ページヘルパー

PageHelper はデータのページングを行います。select ステートメントの後にページング SQL コンテンツを追加します。mysql データベースを使用する場合は、select * from Student の後に limit ステートメントを追加します。

使用手順:

1. 依存関係の追加 pagehelper 依存関係

<dependency>
	<groupId>com.github.pagehelper</groupId>
	<artifactId>pagehelper</artifactId>
	<version>5.1.10</version>
</dependency>

2. mybatis メイン設定ファイルに、plugin ステートメントを追加します。

<environments> 之前加入
<plugins>
   <plugin interceptor ="com.github.pagehelper.PageInterceptor" />
</plugins>    

3. select ステートメントの前に、PageHelper.startPage (ページ番号、各ページのサイズ) を呼び出して
比較します。


PageHelper select * from students order by ID は使用されません

PageHelper を使用
SELECT count(0) FROM 学生
select * 学生から ID 順に並べる LIMIT ?

おすすめ

転載: blog.csdn.net/Peanut31434331/article/details/128812676