RestultMapは、クラス属性名とテーブルフィールド名の不整合が原因でクエリがnullになるという問題を解決します

RestultMap

クエリがnullの問題です

解決すべき問題:属性名とフィールド名に一貫性がありません

環境:新しいプロジェクトを作成し、前のプロジェクトをコピーします

1.前のデータベースのフィールド名を表示します

画像

2.Javaでのエンティティクラスの設計

public class User {
    
    

   private int id;  //id
   private String name;   //姓名
   private String password;   //密码和数据库不一样!
   
   //构造
   //set/get
   //toString()
}

3.インターフェース

//根据id查询用户
User selectUserById(int id);

4.マッパーマッピングファイル

<select id="selectUserById" resultType="user">
  select * from user where id = #{id}
</select>

5.テスト

@Test
public void testSelectUserById() {
    
    
   SqlSession session = MybatisUtils.getSession();  //获取SqlSession连接
   UserMapper mapper = session.getMapper(UserMapper.class);
   User user = mapper.selectUserById(1);
   System.out.println(user);
   session.close();
}

結果:

User{
    
    id=1, name='狂神', password='null'}

クエリは、パスワードが空であることを示しています。これは、問題があることを意味します。

分析:

select * from user where id = #{id} 可以看做

select  id,name,pwd  from user where id = #{id}

mybatis会根据这些查询的列名(会将列名转化为小写,数据库不区分大小写) ,
 去对应的实体类中查找相应列名的set方法设值 , 由于找不到setPwd() ,
  所以password返回null ; 【自动映射】

解決

解決策1:列名のエイリアスを指定します。エイリアスはJavaエンティティクラスの属性名と同じです。

<select id="selectUserById" resultType="User">
  select id , name , pwd as password from user where id = #{id}
</select>

オプション2:結果セットマッピングを使用する-> ResultMap [推奨]

<resultMap id="UserMap" type="User">
   <!-- id为主键 -->
   <id column="id" property="id"/>
   <!-- column是数据库表的列名 , property是对应实体类的属性名 -->
   <result column="name" property="name"/>
   <result column="pwd" property="password"/>
</resultMap>

<select id="selectUserById" resultMap="UserMap">
  select id , name , pwd from user where id = #{id}
</select>

ResultMap

自動マッピング

resultMap要素は、MyBatisで最も重要で強力な要素です。これにより、JDBC ResultSetsデータ抽出コードの90%から解放されます。

実際、接続などの複雑なステートメントのマッピングコードを作成する場合、resultMapは、同じ機能を実現する数千行のコードを置き換えることができます。

ResultMapの設計上の考え方は、単純なステートメントの場合、明示的な結果マッピングを構成する必要はなく、より複雑なステートメントの場合、それらの関係のみを記述する必要があるということです。

単純なマッピングステートメントの例を見てきましたが、resultMapを明示的に指定していません。といった:

<select id="selectUserById" resultType="map">
select id , name , pwd
  from user
  where id = #{id}
</select>

上記のステートメントは、すべての列をresultType属性で指定されたHashMapのキーにマップするだけです。ほとんどの場合十分ですが、HashMapは適切なモデルではありません。プログラムは、モデルとしてJavaBeanまたはPOJO(Plain Old Java Objects)を使用する可能性が高くなります。

ResultMapの最も優れている点は、すでによく知っているものの、明示的に使用する必要がないことです。

手動マッピング

1.戻り値のタイプはresultMapです

<select id="selectUserById" resultMap="UserMap">
  select id , name , pwd from user where id = #{id}
</select>

2. resultMapを記述して、手動マッピングを実現します。

<resultMap id="UserMap" type="User">
   <!-- id为主键 -->
   <id column="id" property="id"/>
   <!-- column是数据库表的列名 , property是对应实体类的属性名 -->
   <result column="name" property="name"/>
   <result column="pwd" property="password"/>
</resultMap>

おすすめ

転載: blog.csdn.net/david2000999/article/details/115164433