今天擼碼的時候,遇到了一個問題,以下是數據庫表字段和我的POJO實體類.
數據庫字段名稱:
對應的實體類:
package com.mybatisplus.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; import java.io.Serializable; import java.util.Date; /** * @author Adil * @date 2020-03-16 15:04:08 */ @Data public class User implements Serializable { private static final long serialVersionUID = -6391149300294480283L; @TableId(type = IdType.AUTO) private Integer id; private String username; private Date birthday; private Character sex; private String homeAddress; }
mapper.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.mybatisplus.mapper.UserMapper"> <select id="selectUsers" resultType="com.mybatisplus.pojo.User"> select u.id , u.user_name , u.user_birthday , u.user_sex , u.home_address from `user` u </select> </mapper>
這里提一點,我在application.yml配置文件中並沒有進行任何的關於mybatis的配置,按照我之前的認知,resultType只能適用實體類屬性名和數據庫表字段名完全一致的情況,也就是說除了id之外,其他屬性都應該返回null,然后測試的結果如下:
[{"id":41,"username":"鄭爽","birthday":null,"sex":null,"homeAddress":"北京"},
{"id":42,"username":"張天愛","birthday":null,"sex":null,"homeAddress":"北京"},
{"id":43,"username":"迪麗熱巴","birthday":null,"sex":null,"homeAddress":"北京"},
{"id":45,"username":"佟麗婭","birthday":null,"sex":null,"homeAddress":"北京"},
{"id":46,"username":"趙麗穎","birthday":null,"sex":null,"homeAddress":"北京"},
{"id":48,"username":"古力娜扎","birthday":null,"sex":null,"homeAddress":"北京"}]
很明顯,除了id之外,username和homeAddress屬性數據也成功返回了.疑惑的同時我查閱了相關資料,終於搞懂是什么導致了這種情況的發送,那就是我項目使用的是Mybatis-Plus,而不是Mybatis
Mybatis-Plus在實體類屬性和數據庫表字段映射時,會自動將數據庫表字段名中的下划線去掉,並且不受字母大小寫的影響,比如user_name和home_address去掉下划線后變為username和homeaddress,Mybatis-Plus會將其映射到實體類屬性username和homeAddress上,並且不考慮大小寫,這樣這兩個字段就能成功返回了.而user_birthday和user_sex即使去掉下划線,也不能和實體類屬性名birthday和sex保持一致,所以只能返回null.
注意:以上情況適用於Mybatis-Plus,如果你的項目使用的是Mybatis,那么就是另外一種情況了.這里我將pom.xml中Mybatis-Plus的依賴換成了Mybatis又測試了一遍.
xml映射文件不做任何修改,其返回結果如下:
[{"id":41,"username":null,"birthday":null,"sex":null,"homeAddress":null},
{"id":42,"username":null,"birthday":null,"sex":null,"homeAddress":null},
{"id":43,"username":null,"birthday":null,"sex":null,"homeAddress":null},
{"id":45,"username":null,"birthday":null,"sex":null,"homeAddress":null},
{"id":46,"username":null,"birthday":null,"sex":null,"homeAddress":null},
{"id":48,"username":null,"birthday":null,"sex":null,"homeAddress":null}]
發現除了Id正常返回外,其他數據都是null,這就說明Mybatis並沒有Mybatis-Plus那么強大了,只要實體類屬性名和數據庫字段名有所不同,使用resultType就不能映射到.
不過我們可以通過配置,令Mybatis達到Mybatis-Plus的那種強大之處.
在application.yml配置文件中添加Mybatis的配置
mybatis:
type-aliases-package: com.mybatisplus.pojo # 實體類包別名作用:可以用實體類名稱代替實體類的相對路徑
configuration:
map-underscore-to-camel-case: true # 駝峰命名
通過駝峰命名,將數據庫表字段名下划線去掉,然后去映射實體類屬性名,同樣不考慮字母大小寫問題,這樣就達到了和Mybatis-Plus一樣的效果.返回結果如下:
[{"id":41,"username":"鄭爽","birthday":null,"sex":null,"homeAddress":"北京"},
{"id":42,"username":"張天愛","birthday":null,"sex":null,"homeAddress":"北京"},
{"id":43,"username":"迪麗熱巴","birthday":null,"sex":null,"homeAddress":"北京"},
{"id":45,"username":"佟麗婭","birthday":null,"sex":null,"homeAddress":"北京"},
{"id":46,"username":"趙麗穎","birthday":null,"sex":null,"homeAddress":"北京"},
{"id":48,"username":"古力娜扎","birthday":null,"sex":null,"homeAddress":"北京"}]
當然,依然不能夠返回birthday和sex的數據,不過我們可以通過resultMap達到目的.
我們改寫xml文件如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.mybatisplus.mapper.UserMapper"> <resultMap id="BaseResultMap" type="com.mybatisplus.pojo.User"> <id column="id" property="id"></id> <result column="user_name" property="username"></result> <result column="user_birthday" property="birthday"></result> <result column="user_sex" property="sex"></result> <result column="home_address" property="homeAddress"></result> </resultMap> <select id="selectUsers" resultMap="BaseResultMap"> select u.id , u.user_name , u.user_birthday , u.user_sex , u.home_address from `user` u </select> </mapper>
這樣通過resultMap進行手動一一映射,就可以返回所有字段數據了.測試結果如下:
[{"id":41,"username":"鄭爽","birthday":"2019-05-27T09:47:08.000+0000","sex":"男","homeAddress":"北京"},
{"id":42,"username":"張天愛","birthday":"2019-03-02T07:09:37.000+0000","sex":"女","homeAddress":"北京"},
{"id":43,"username":"迪麗熱巴","birthday":"2019-03-04T03:34:34.000+0000","sex":"女","homeAddress":"北京"},
{"id":45,"username":"佟麗婭","birthday":"2019-03-04T04:04:06.000+0000","sex":"男","homeAddress":"北京"},
{"id":46,"username":"趙麗穎","birthday":"2018-09-07T09:37:26.000+0000","sex":"男","homeAddress":"北京"},
{"id":48,"username":"古力娜扎","birthday":"2019-03-08T03:44:00.000+0000","sex":"女","homeAddress":"北京"}]
總結:
Mybatis-Plus可以自動映射實體類屬性名和數據庫表字段名,前提是兩者間具有駝峰關系(例如實體類屬性名是homeAddress,數據庫字段名稱是home_address),並且跟字母大小寫無關;
Mybatis需要在配置文件中配置駝峰命名,來映射實體類屬性名和數據庫表字段名,並且跟字母大小寫無關,同樣,前提是兩者間具有駝峰關系;
resultMap手動實現實體類屬性名和數據庫表字段名的一一映射.