Mybatisマッピングファイルのサンプルコードの詳細説明
この記事では主に Mybatis マッピング ファイルの例の詳細な説明を紹介しますので、必要な方は参考にしてください
1. 入力マッピング
parameterType
入力パラメータの Java タイプを指定します。クラスの別名または完全修飾名。単純型、POJO、HashMapを受け取ることができます。
1. 単純型を渡す
ユーザー ID に基づいてユーザー情報をクエリする:
<select id="findUserById" parameterType="int" resultType="com.itheima.mybatis.po.User"> SELECT * FROM USER WHERE id =#{id} </select>
2. POJO オブジェクトを渡す
ユーザーを追加する:
3 、POJOを渡すオブジェクト
の開発中に、クエリ条件はpojoを介して渡されます。クエリ条件は、ユーザーのクエリ条件だけでなく、他のクエリ条件(クエリ条件としてのユーザーの購入商品情報など)を含む包括的なクエリ条件です。この場合、入力パラメータを渡されたオブジェクトをパッケージ化することができます。ユーザー情報の包括的なクエリには、(ユーザー情報、注文情報、製品情報) などの複雑なクエリ条件が必要です。
3.2 パッケージ化オブジェクトを定義する一般に、User.java クラスはデータテーブルのフィールドと一致している必要があり、mybatis のリバースエンジニアリング中に、PO クラスが生成されないことが最善です。テーブル構造に基づいて、
po クラスのフィールドを拡張すると、この時点で上書きされます。
したがって、po クラスを拡張するには、それを継承する拡張クラスを作成する必要があります。
<insert id="insertUser" parameterType="com.itheima.mybatis.po.User"> <selectKey keyProperty="id" resultType="int" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO USER(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address}) </insert>
POJOパッケージングクラスを定義します:
public class UserExt extends User{ //这里可以定义user的一些扩展信息 }
3.3 マッパーインターフェイスを作成します//パッケージングクラスを使用して、複雑なユーザー情報の包括的なクエリを実行します
public List3.4 マッパーマッピングファイルの書き込み
public class UserQueryVO { //用户信息 private UserExt userExt; //商品ID集合 private List<Integer> idList; //商品信息 public List<Integer> getIdList() { return idList; } public void setIdList(List<Integer> idList) { this.idList = idList; } public UserExt getUserExt() { return userExt; } public void setUserExt(UserExt userExt) { this.userExt = userExt; } //订单信息 }
注: 入力パラメータのタイプは UserQueryVO になり、結果セットのタイプは UserExt になり、#{} 内のパラメータは UserQueryVO になります。オブジェクト の userExt 属性の性別とユーザー名のサブプロパティ。
3.5 テストコードを書く
<!-- 通过包装类来进行复杂的用户信息综合查询 --> <select id="findUserList" parameterType="userQueryVO" resultType="userExt"> SELECT * FROM USER WHERE sex=#{userExt.sex} AND username LIKE '%${userExt.username}%' </select>
4.mapのkeyはpojoの属性を渡すのと同じです。 4.1 マッピングファイル
@Test
public void findUserListTest() {
// 创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 通过SqlSession,获取mapper接口的动态代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//构造userQueryVO对象
UserQueryVO userQueryVO = new UserQueryVO();
// 构造UserExt对象
UserExt userExt = new UserExt();
userExt.setSex("1");
userExt.setUsername("小明");
userQueryVO.setUserExt(userExt);
// 调用mapper对象的方法
List<UserExt> list = userMapper.findUserList(userQueryVO);
System.out.println(list);
// 关闭SqlSession
sqlSession.close();
}
4.2 テストコード
<!-- 传递hashmap综合查询用户信息 -->
<select id="findUserByHashmap" parameterType="hashmap" resultType="user">
select * from user where id=#{<span style="color:#ff0000;">id</span>} and username like '%${<span style="color:#ff0000;">username</span>}%'
</select>
渡されたマップ内のキーは、SQL で解析されたキーと一致しません。
テスト結果ではエラーは報告されませんでしたが、キーを通じて取得された値は空でした。
2. 出力マッピング
1. resultType (1) 使用方法
結果マッピングに resultType を使用する場合、クエリのカラム名はマッピングされた pojo 属性名と完全に同じである必要がありますこれにより、列が正常にマップされます。 クエリされた列名とマップされた pojo 属性名がすべて一致しない場合、マップされたオブジェクトは空になり、pojo オブジェクトは作成されません
クエリされた列名とマップされた pojo 属性名のうちの 1 つが一致する場合、空の場合、pojo オブジェクトは作成されますが、正しくマップされた属性のみが値を持ちます。
(2) 出力単純型
単純型にマップする前に、クエリ列が 1 列である必要があることに注意してください。
出力結果が 1 列のみの場合、ResultType を使用して出力結果の型として単純型を指定できます。
2.1 要件
ユーザーの総数を包括的にクエリするには、(ユーザー情報、注文情報、製品情報) などの複雑なクエリ条件を渡す必要があります。 2.2Mapperマッピングファイル
Public void testFindUserByHashmap()throws Exception{
//获取session
SqlSession session = sqlSessionFactory.openSession();
//获限mapper接口实例
UserMapper userMapper = session.getMapper(UserMapper.class);
//构造查询条件Hashmap对象
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("id", 1);
map.put("username", "管理员");
//传递Hashmap对象查询用户列表
List<User>list = userMapper.findUserByHashmap(map);
//关闭session
session.close();
}
2.3Mapperインターフェース
<!-- 综合查询用户信息总数,需要传入查询条件复杂,比如(用户信息、订单信息、商品信息) -->
<select id="findUsersCount" parameterType="UserQueryVO"
resultType="int">
SELECT count(1) FROM USER WHERE sex = #{userExt.sex} AND username LIKE '%${userExt.username}%'
</select>
2.4 テストコード
//综合查询用户信息总数。学习:resultType输出简单类型
public int findUsersCount(UserQueryVO vo);
注: 単一の pojo オブジェクトと pojo リスト (pojo オブジェクトを保持) を出力する場合、マッパー マッピング ファイルの resultType の型は同じですが、マッパー インターフェイスのメソッドの戻り値は異なります。
3.1Mapperマッピングファイル
@Test
public void testFindUsersCount() {
// 创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 通过SqlSession,获取mapper接口的动态代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//构造userQueryVO对象
UserQueryVO userQueryVO = new UserQueryVO();
// 构造UserExt对象
UserExt userExt = new UserExt();
userExt.setSex("1");
userExt.setUsername("小明");
userQueryVO.setUserExt(userExt);
int count = mapper.findUsersCount(userQueryVO);
System.out.println(count); // 关闭SqlSession
sqlSession.close();
}
3.2Mapperインターフェース
1.単一のpojoオブジェクトを出力します<select id="findUsersByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User">
SELECT * FROM USER WHERE username LIKE '%${value}%'
</select>
2. ポジョリストを出力する
//根据用户名称来模糊查询用户信息 public User findUsersByName(String username);
概要: 同じマッパー マッピング ファイルが単一のオブジェクトとオブジェクトのリストを返す場合、マッパー インターフェイスが動的プロキシを生成する場合、
会根据返回值的类型,决定调用selectOne方法还是selectList方法。
2、resultMap
resultMap可以进行高级结果映射(一对一、一对多映射)。
(1)使用方法
如果查询出来的列名和属性名不一致,通过定义一个resultMap将列名和pojo属性名之间作一个映射关系。
1、 定义resultMap
2、 使用resultMap作为statement的输出映射类型。
(2)需求
把下面SQL的输出结果集进行映射
SELECT id id_,username username_,sex sex_FROM USER WHERE id = 1
(3)Mapper映射文件
定义resultMap:
<!-- 定义resultMap --> <!-- [id]:定义resultMap的唯一标识 [type]:定义该resultMap最终映射的pojo对象 [id标签]:映射结果集的唯一标识列,如果是多个字段联合唯一,则定义多个id标签 [result标签]:映射结果集的普通列 [column]:SQL查询的列名,如果列有别名,则该处填写别名 [property]:pojo对象的属性名 --> <resultMap type="user" id="userResultMap"> <id column="id_" property="id"/> <result column="username_" property="username"/> <result column="sex_" property="sex"/> </resultMap>
定义statement:
<!-- 根据ID查询用户信息(学习resultMap) --> <select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap"> SELECT id id_,username username_,sex sex_ FROM USER WHERE id = #{id} </select>
(4)Mapper接口定义
//根据ID查询用户信息(学习resultMap) public User findUserByIdResultMap(int id);<strong> </strong>
定义Statement使用resultMap映射结果集时,Mapper接口定义方法的返回值类型为mapper映射文件中resultMap的type类型。
(5)测试代码
@Test public void findUserByIdResultMapTest() { // 创建SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 通过SqlSession,获取mapper接口的动态代理对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 调用mapper对象的方法 User user = userMapper.findUserByIdResultMap(1); System.out.println(user); // 关闭SqlSession sqlSession.close(); }
三、动态SQL
1、If和where
Ø If标签:作为判断入参来使用的,如果符合条件,则把if标签体内的SQL拼接上。
注意:用if进行判断是否为空时,不仅要判断null,也要判断空字符串‘';
Ø Where标签:会去掉条件中的第一个and符号。
(1)需求
用户信息综合查询列表和用户信息综合查询总数这两个statement的定义使用动态SQL。
(2)映射文件
<!-- 综合查询用户信息,需要传入查询条件复杂,比如(用户信息、订单信息、商品信息) --> <select id="findUsersByQueryVO" parameterType="cn.itcast.mybatis.po.QueryUserVO" resultType="User"> SELECT * FROM USER <where> <if test="userExt != null"> <if test="userExt.sex != null and userExt.sex != ''"> AND sex = #{userExt.sex} </if> <if test="userExt.username != null and userExt.username != ''"> AND username LIKE '%${userExt.username}%' </if> </if> </where> </select> <!-- 综合查询用户信息总数,需要传入查询条件复杂,比如(用户信息、订单信息、商品信息) --> <select id="findUsersCount" parameterType="QueryUserVO" resultType="int"> SELECT count(1) FROM USER <where> <if test="userExt != null"> <if test="userExt.sex != null and userExt.sex != ''"> AND sex = #{userExt.sex} </if> <if test="userExt.username != null and userExt.username != ''"> AND username LIKE '%${userExt.username}%' </if> </if> </where> </select>
(3)Mapper接口
//通过包装类来进行复杂的用户信息综合查询 public List<UserExt> findUserList(UserQueryVO userQueryVO); //综合查询用户总数 public int findUsersCount(UserQueryVO userQueryVO);
(4)测试代码
不传用户名:
@Test public void testFindUserList() throws Exception{ // 创建UserMapper对象 SqlSession sqlSession = sqlSessionFactory.openSession(); // 由mybatis通过sqlsession来创建代理对象 UserMapper mapper = sqlSession.getMapper(UserMapper.class); QueryUserVO vo = new QueryUserVO(); User user = new User(); //此处使用动态SQL,不传username参数 user.setSex("1"); // user.setUsername("小明"); vo.setUser(user); List<User> list = mapper.findUserList(vo); System.out.println(user); sqlSession.close(); }
输出的SQL如下(也不包含用户名):
通过测试可以得知,打印出的SQL语句确实会随着条件的满足情况而不一样。
2、SQL片段
Mybatis提供了SQL片段的功能,可以提高SQL的可重用性。
2.1定义SQL片段
使用sql标签来定义一个SQL片段:
<!-- 定义SQL片段 --> <!-- [sql标签]:定义一个SQL片段 [id]:SQL片段的唯一标识 建议: 1、SQL片段中的内容最好是以单表来定义 2、如果是查询字段,则不要写上SELECT 3、如果是条件语句,则不要写上WHERE --> <sql id="select_user_where"> <if test="userExt != null"> <if test="userExt.sex != null and userExt.sex != ''"> AND sex = #{userExt.sex} </if> <if test="userExt.username != null and userExt.username != ''"> AND username LIKE '%${userExt.username}%' </if> </if> </sql>
2.2引用SQL片段
使用
<!-- 根据用户id来查询用户信息(使用SQL片段) --> <!-- [include标签]:引用已经定义好的SQL片段 [refid]:引用的SQL片段id --> <select id="findUserList" parameterType="userQueryVO" resultType="userExt"> SELECT * FROM USER <where> <include refid="select_user_where"/> </where> </select> <!-- 综合查询用户信息总数,需要传入查询条件复杂,比如(用户信息、订单信息、商品信息) --> <select id="findUsersCount" parameterType="QueryUserVO" resultType="int"> SELECT count(1) FROM USER <where> <include refid="select_user_where"/> </where> </select>
3、foreach
向sql传递数组或List时,mybatis使用foreach解析数组里的参数并拼接到SQL中。
(1)传递pojo对象中的list集合
1.1需求
在用户查询列表和查询总数的statement中增加多个id输入查询。
1.2SQL
SELECT * FROM user WHERE id IN (1,10,16)
1.3定义pojo中的list属性
package com.itheima.mybatis.po; import java.util.List; /** * <p>Title: UserQueryVO</p> * <p>Description: TODO(这里用一句话描述这个类的作用) <p> */ public class UserQueryVO { //用户信息 private UserExt userExt; //商品ID集合 private List<Integer> idList; //商品信息 public List<Integer> getIdList() { return idList; } public void setIdList(List<Integer> idList) { this.idList = idList; } public UserExt getUserExt() { return UserExt; } public void setUserExt(UserExt userExt) { this.UserExt = UserExt; } //订单信息 }
1.4映射文件
<!-- [foreach标签]:表示一个foreach循环 --> <!-- [collection]:集合参数的名称,如果是直接传入集合参数,则该处的参数名称只能填写[list]。 --> <!-- [item]:每次遍历出来的对象 --> <!-- [open]:开始遍历时拼接的串 --> <!-- [close]:结束遍历时拼接的串 --> <!-- [separator]:遍历出的每个对象之间需要拼接的字符 --> <if test="idList != null and idList.size > 0"> <foreach collection="idList" item="id" open="AND id IN (" close=")" separator=","> #{id} </foreach> </if>
1.5Mapper接口
//根据用户ID的集合查询用户列表(学习foreach标签之通过POJO对象传ID集合) public List<UserExt> findUserList(UserQueryVO vo);
1.6测试代码
@Test public void testFindUserList() { // 创建SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 通过SqlSession,获取mapper接口的动态代理对象 UserMapper mapper = sqlSession.getMapper(UserMapper.class); // 构造QueryUserVO对象 QueryUserVO vo = new QueryUserVO(); // UserExt ext = new UserExt(); // ext.setUsername("小明"); // ext.setSex("1"); // vo.setUserExt(ext); // 创建用户ID集合,然后设置到QueryUserVO对象中 List<Integer> idList = new ArrayList<Integer>(); idList.add(1); idList.add(10); idList.add(16); vo.setIdList(idList); // 调用mapper代理对象的方法 List<UserExt> list = mapper.findUserList(vo); System.out.println(list); // 关闭SqlSession sqlSession.close(); }
(2)直接传递List集合
2.1需求
根据用户ID的集合查询用户列表
2.2SQL
SELECT * FROM user WHERE id IN (1,10,16)
2.3映射文件
<!-- 根据用户ID的集合查询用户列表(学习foreach标签之直接传ID集合) --> <!-- [foreach标签]:表示一个foreach循环 [collection]:集合参数的名称,如果是直接传入集合参数,则该处的参数名称只能填写[list]。 [item]:定义遍历集合之后的参数名称 [open]:开始遍历之前需要拼接的SQL串 [close]:结束遍历之后需要拼接的SQL串 [separator]:遍历出的每个对象之间需要拼接的字符 --> <select id="findUsersByIdList" parameterType="java.util.List" resultType="user"> SELECT * FROM USER <where> <if test="list != null and list.size > 0"> <foreach collection="list" item="id" open="AND id IN (" close=")" separator=","> #{id} </foreach> </if> </where> </select>
2.4Mapper接口
//根据用户ID的集合查询用户列表(学习foreach标签之直接传ID集合) public List<User> findUsersByIdList (List<Integer> idList);
2.5测试代码
@Test public void findUsersByIdListTest() { // 创建SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 通过SqlSession,获取mapper接口的动态代理对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 构造List<Integer>集合 List<Integer> idList = new ArrayList<Integer>(); idList.add(1); idList.add(10); idList.add(16); // 调用mapper对象的方法 List<User> list = userMapper.findUsersByIdList (idList); System.out.println(list); // 关闭SqlSession sqlSession.close(); }
以上がMybatisマッピングファイルのサンプルコードの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









iBatis と MyBatis: どちらを選択するべきですか?はじめに: Java 言語の急速な発展に伴い、多くの永続化フレームワークが登場しました。 iBatis と MyBatis は 2 つの人気のある永続化フレームワークであり、どちらもシンプルで効率的なデータ アクセス ソリューションを提供します。この記事では、iBatis と MyBatis の機能と利点を紹介し、適切なフレームワークを選択するのに役立つ具体的なコード例をいくつか示します。 iBatis の紹介: iBatis はオープンソースの永続化フレームワークです。

MyBatis 動的 SQL タグの解釈: Set タグの使用法の詳細な説明 MyBatis は、豊富な動的 SQL タグを提供し、データベース操作ステートメントを柔軟に構築できる優れた永続層フレームワークです。このうち、Set タグは、UPDATE ステートメントで SET 句を生成するために使用され、更新操作でよく使用されます。この記事では、MyBatis での Set タグの使用法を詳細に説明し、特定のコード例を通じてその機能を示します。 SetタグとはMyBatiで使用するSetタグです。

MyBatis でバッチ削除ステートメントを実装するいくつかの方法には、特定のコード例が必要です。近年、データ量の増加により、バッチ操作がデータベース操作の重要な部分になっています。実際の開発では、データベース内のレコードを一括で削除する必要が生じることがよくあります。この記事では、MyBatis でバッチ削除ステートメントを実装するいくつかの方法に焦点を当て、対応するコード例を示します。 foreach タグを使用してバッチ削除を実装します。MyBatis は、セットを簡単に横断できる foreach タグを提供します。

JPA と MyBatis: 機能とパフォーマンスの比較分析 はじめに: Java 開発では、永続化フレームワークが非常に重要な役割を果たします。一般的な永続化フレームワークには、JPA (JavaPersistenceAPI) や MyBatis などがあります。この記事では、2 つのフレームワークの機能とパフォーマンスを比較分析し、具体的なコード例を示します。 1. 機能の比較: JPA: JPA は JavaEE の一部であり、オブジェクト指向のデータ永続化ソリューションを提供します。アノテーションまたはXが渡されます

MyBatis バッチ削除ステートメントの使用方法の詳細な説明には、特定のコード例が必要です はじめに: MyBatis は、豊富な SQL 操作機能を提供する優れた永続層フレームワークです。実際のプロジェクト開発では、データを一括で削除する必要がある場面に遭遇することがよくあります。この記事では、MyBatis のバッチ削除ステートメントの使用方法を詳しく紹介し、具体的なコード例を添付します。使用シナリオ: データベース内の大量のデータを削除する場合、削除ステートメントを 1 つずつ実行するのは非効率です。このとき、MyBatisの一括削除機能が利用できます。

MyBatis のキャッシュ メカニズムの分析: 1 次キャッシュと 2 次キャッシュの違いと応用 MyBatis フレームワークでは、キャッシュはデータベース操作のパフォーマンスを効果的に向上させることができる非常に重要な機能です。そのうち、一次キャッシュと二次キャッシュは、MyBatis でよく使用される 2 つのキャッシュ メカニズムです。この記事では、一次キャッシュと二次キャッシュの違いと用途を詳細に分析し、具体的なコード例を示して説明します。 1. レベル 1 キャッシュ レベル 1 キャッシュはローカル キャッシュとも呼ばれ、デフォルトで有効になっており、オフにすることはできません。 1次キャッシュはSqlSesです

MyBatisGenerator は、MyBatis が公式に提供するコード生成ツールで、開発者がデータベース テーブル構造に準拠した JavaBeans、Mapper インターフェイス、および XML マッピング ファイルを迅速に生成するのに役立ちます。コード生成に MyBatisGenerator を使用するプロセスでは、構成パラメーターの設定が重要です。この記事では、構成パラメータの観点から開始し、MyBatisGenerator の機能を詳しく説明します。

MyBatis の 1 対多のクエリ構成の詳細な説明: 一般的な関連クエリの問題を解決するには、特定のコード例が必要です。実際の開発作業では、マスター エンティティ オブジェクトとそれに関連付けられた複数のスレーブ エンティティ オブジェクトをクエリする必要がある状況によく遭遇します。 。 MyBatis では、1 対多のクエリが一般的なデータベース関連付けクエリであり、適切な設定を行うことで、関連付けられたオブジェクトのクエリ、表示、操作を簡単に実現できます。この記事では、MyBatis での 1 対多のクエリの構成方法と、関連するクエリに関する一般的な問題の解決方法を紹介します。
