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>