目次
1.SQL文にパラメータを渡す
1. MyBatisフレームワークの基本的な使い方
使用されるjarパッケージは次のとおりです。
<!-- 测试包-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
<!-- MyBatis核心-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- 数据库连接-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
MyBatisを利用するには、マッパーマッピングに対応したビジネスインターフェースに対応したテーブルに対応したエンティティクラスを実装する必要があります。
マッパーマッピングはビジネスインターフェースの実装クラスに相当します。Java コードと SQL コードが、mapper.xml 構成ファイルによって区別されるだけです。
注: XML を介して設定する場合、メソッド設定の SQL ステートメントはメソッド名のみを参照するため、ビジネス インターフェイスで定義されたメソッドをオーバーロードすることはできません。
次のように:
public interface EmployeeMapper {
//通过id查找员工
Employee queryById(Integer id);
//通过id name 查找员工
Employee queryById(Integer id,String name);
}
同じメソッド名が使用されるため、xml がメソッド名に基づいて SQL ステートメントをカプセル化するときに問題が発生します。
2. ${ key } と #{ key } を使用してパラメータを渡します
ケースコード:
<!-- 通过#{key}传入参数 -->
<select id="queryById" resultType="com.alphamilk.pojo.Employee">
select * from mysqltest.employee where id = #{id}
</select>
<!--通过${key} 传入参数-->
<select id="queryByName" resultType="com.alphamilk.pojo.Employee">
select * from mysqltest.employee where name = ${name}
</select>
違い:
#{key} の本質は、プレースホルダー処理を実行し、コード内の id の値を置き換えることです。【おすすめの使い方】
${key} の本質は文字列を結合することであり、文字列は case コード内の完全な SQL ステートメントにカプセル化されます。
注: 代わりに #{key} の値を使用する場合、列名とコンテナー名を渡すことはできません。
3. MyBatisテスト機能の実装
テスト関数を完了するには、次の手順を実装する必要があります。
1. ibatisのリソースクラスを作成します
2. SqlSessionFactoryBuilder オブジェクトを作成し、Build(is) を実行して SqlSessionFactory オブジェクトを取得します。
3. SqlSessionFactory オブジェクトの openSession メソッドを通じて SqlSession を取得します。
4. Mapperオブジェクトを取得する
5.操作を実行する
6. トランザクションをコミットし、関連するフローを閉じる
ケースコード:
public class MybatisTest {
@Test
public void Test() throws IOException {
//步骤1,读取资源
InputStream is = Resources.getResourceAsStream("mybatisConfig.xml");
//步骤2,创建sqlSessionFactory
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//步骤3,创建SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//步骤4,获取Mapper对象
EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
//执行对应操作
Employee employee = employeeMapper.queryById(1);
System.out.println(employee);
//管理事务提交与关闭操作
sqlSession.close();
}
}
2. データ入力
データ入力の概念:
ここでのデータ入力とは、具体的には、上位層のメソッド (Service メソッドなど) が Mapper インターフェイスを呼び出すときにデータが渡される形式を指します。
- 単純型: 値を 1 つだけ含むデータ型
- 基本データ型: int、byte、short、double、…
- 基本データ型のパッケージ化タイプ: Integer、Character、Double など
- 文字列タイプ: 文字列
- 複合型: 複数の値を含むデータ型
- エンティティ クラス タイプ: 従業員、部門など
- コレクションの種類: リスト、セット、マップなど
- 配列型: int[]、String[]、…
- 複合タイプ: List<Employee>、エンティティ クラスにはコレクションが含まれています...
1. 単一の単純なデータ型
単純なパラメータが 1 つしかないため、#{key} または ${key} のキーには任意の値を入力できますが、もちろん元のパラメータ名を使用することをお勧めします。
2. エンティティオブジェクトの種類
受信データがエンティティ オブジェクト タイプの場合は、その属性に 1 つずつ対応させるだけで済みます。
場合:
3. 複数の単純なデータ型
ビジネス メソッドに複数のパラメータがある場合、#{key} または ${key} のキーをランダムに書き込んだり、仮パラメータを介して直接入力したりすることはできないことに注意してください。複数の単純なデータ型を入力する問題には 2 つの解決策があります。
3.1 アノテーションパラメータを使用して解決する
@Param アノテーションを使用する必要がある
場合:
3.2 逐次的手法を使用して解決する
arg0、arg1...の順にパラメータを一致させることもできます。
ケースコード:
4.マップタイプ
key=map を渡すだけです
インターフェースに対応する抽象メソッド
int updateEmployeeByMap(Map<String, Object> paramMap);
対応するSQL文
<update id="updateEmployeeByMap">
update t_emp set emp_salary=#{empSalaryKey} where emp_id=#{empIdKey}
</update>
使用するシーン
渡す必要がある散在パラメータが多数ありますが、対応するエンティティ クラス タイプは使用できません。@Param アノテーションを使用して 1 つずつ渡すのは面倒すぎます。したがって、それらはすべて Map にカプセル化されます。
3. データ出力
データ出力の概念:
データ出力は通常、次の 2 つの形式で行われます。
- 追加、削除、および変更操作によって返される、影響を受ける行の数。直接受け取るには、int または long 型を使用するだけです。
- クエリ操作のクエリ結果
行う必要があるのは、クエリの出力データ型を指定することです。
また、挿入シナリオでは、主キー データを再表示できます。
1. 単一のシンプルなタイプ
<!--此处的namespace修改为对应的接口全类名-->
<mapper namespace="com.alphamilk.EmployeeMapper">
<!-- resultType 对应 类型的全限定符-->
<select id="querySalaryById" resultType="java.lang.Integer">
select salary from mysqltest.employee where id = #{id}
</select>
<select id="queryNameById" resultType="java.lang.String">
select name from mysqltest.employee where id=#{id}
</select>
</mapper>
一般的な単純型のうち、Java には対応する略語があり、java.lang.String などを String int で置き換えることができます。
2. エンティティクラスオブジェクトを返す
クラスの完全修飾修飾子とクラス名を返します。
<!--此处的namespace修改为对应的接口全类名-->
<mapper namespace="com.alphamilk.EmployeeMapper">
<!-- resultType 对应 类型的全限定符-->
<select id="" resultType="com.alphamilk.pojo.Employee">
</select>
</mapper>
3. マップの種類を返す
<!-- Map<String,Object> selectEmpNameAndMaxSalary(); -->
<!-- 返回工资最高的员工的姓名和他的工资 -->
<select id="selectEmpNameAndMaxSalary" resultType="map">
SELECT
emp_name 员工姓名,
emp_salary 员工工资,
(SELECT AVG(emp_salary) FROM t_emp) 部门平均工资
FROM t_emp WHERE emp_salary=(
SELECT MAX(emp_salary) FROM t_emp
)
</select>
4. 戻り値リストの型
<!-- List<Employee> selectAll(); -->
<select id="selectAll" resultType="com.atguigu.mybatis.entity.Employee">
select emp_id empId,emp_name empName,emp_salary empSalary
from t_emp
</select>
5. 主キーの値を返す
<!-- int insertEmployee(Employee employee); -->
<!-- useGeneratedKeys属性字面意思就是“使用生成的主键” -->
<!-- keyProperty属性可以指定主键在实体类对象中对应的属性名,Mybatis会将拿到的主键值存入这个属性 -->
<insert id="insertEmployee" useGeneratedKeys="true" keyProperty="empId">
insert into t_emp(emp_name,emp_salary)
values(#{empName},#{empSalary})
</insert>
4. エイリアス
戻り値を出力する際に記入する内容にはクラスの完全な修飾子が含まれるため、この操作が面倒なため、Javaにはデフォルトのエイリアスが72個用意されており、例えばjava.lang.StringをそのままStringとして記述することも可能です。ただし、一般的なエンティティ オブジェクト タイプの場合は、
1.xml のエイリアス設定
MyBatis-config.xmlで設定する
単一のエイリアス
ケースコード:
<typeAliases>
<!-- 单个xml配置-->
<typeAlias type="com.alphamilk.pojo.Employee" alias="Employee"/>
</typeAliases>
エイリアスをラップする
パッケージ内でエイリアスが使用されている場合、パッケージ内のすべてのクラスのエイリアスはそのクラス名に対応します。
<typeAliases>
<!-- 包起别名-->
<package name="com.alphamilk.pojo.Employee"/>
</typeAliases>
2. エイリアスに注釈を付ける
XML での設定が非常に面倒で見苦しいと思われる場合は、アノテーションを使用してエンティティ クラスにエイリアスを作成できます。