關(guān)于mybatis傳入?yún)?shù)一直為null的問題
mybatis傳入?yún)?shù)一直為null
1.配置方面都對(duì)的情況下,考慮連接數(shù)據(jù)庫的時(shí)候是否設(shè)置了編碼為utf-8,如果沒設(shè)置,數(shù)據(jù)庫傳過來的時(shí)候有可能就是亂碼,就會(huì)一直是null。
2.有可能是字段名與實(shí)體不匹配。
3.可能是有空格問題
mybatis字段為null的解決
今天在寫項(xiàng)目的mapper.xml文件的時(shí)候,出現(xiàn)了個(gè)別字段查詢結(jié)果為null的情況,但sql語句沒有錯(cuò)誤,仔細(xì)查看了一遍,才發(fā)現(xiàn)錯(cuò)誤,現(xiàn)在記錄下來
先講一講sql語句和ResultMap的順序
首先會(huì)執(zhí)行sql語句,sql語句返回字段信息,然后才是ResultMap映射字段信息。
實(shí)體類UserInfo
package com.school.oauth.endpoint.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.school.parent.domain.BaseDomain;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Update;
import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat;
import javax.persistence.*;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.time.ZonedDateTime;
import java.util.Date;
import java.util.List;
@Table(name = "oauth_user")
@ApiModel(value = "用戶表")
@Data
public class UserInfo extends BaseDomain {
@Id
@GeneratedValue(generator = "JDBC")
@ApiModelProperty(value = "用戶主鍵,提供給其他表做外鍵")
private Long userId;
@Column(unique = true)
@NotBlank
@Length(max = 32)
@ApiModelProperty(value = "用戶名,必須唯一")
private String username;
@NotBlank
@Length(max = 32)
@ApiModelProperty(value = "昵稱,可以重復(fù)")
private String nickname;
@Length(max = 128)
@ApiModelProperty(value = "加密密碼")
private String encryptedPassword;
@Length(max = 32)
@Pattern(regexp = "^[1][3,4,5,7,8][0-9]{9}$"
,message = "手機(jī)號(hào)碼格式錯(cuò)誤")
@ApiModelProperty(value = "用戶手機(jī)號(hào)碼")
private String phone;
@Email
@Length(max = 128)
@ApiModelProperty(value = "用戶郵箱")
private String email;
@Length(max = 8)
@ApiModelProperty(value = "國(guó)際冠碼,默認(rèn) +86")
private String idd;
@Length(max = 16)
@ApiModelProperty(value = "性別:男/女")
private String gender;
@Length(max = 1024)
@ApiModelProperty(value = "頭像地址")
private String avatar;
@NotBlank
@Length(max = 128)
@ApiModelProperty(value = "所屬學(xué)校")
private String school;
@DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
@ApiModelProperty(value = "賬戶過期時(shí)間")
private Date accountExpiredTime;
@DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
@ApiModelProperty(value = "賬戶鎖定時(shí)間")
private Date accountLockedTime;
@DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
@ApiModelProperty(value = "憑證過期時(shí)間")
private Date credentialsExpiredTime;
@Column(name = "is_admin")
@ApiModelProperty(value = "是否是管理員")
private Boolean admin;
@Column(name = "is_able")
@ApiModelProperty(value = "賬戶是否啟用")
private Boolean able;
@Length(max = 32)
@NotBlank(groups = Insert.class)
@ApiModelProperty(value = "用戶注冊(cè)平臺(tái):WEB(默認(rèn))/AliPay/WeChat")
private String userType;
@Length(max = 64)
@ApiModelProperty(value = "微信用戶識(shí)別ID")
private String weChatUserId;
@Length(max = 64)
@ApiModelProperty(value = "支付寶用戶識(shí)別ID")
private String aliPayUserId;
@Transient
@NotBlank(groups = Insert.class)
@ApiModelProperty(value = "密碼")
private String password;
/**
* 一個(gè)用戶只能對(duì)應(yīng)一個(gè)角色(最高權(quán)限角色)
*/
@Transient
@ApiModelProperty(value = "用戶角色集合:guest/user/admin")
private List<Role> roleList;
public UserInfo() {
}
}UserMapper.xml錯(cuò)誤代碼
<resultMap id="BaseMap" type="com.school.oauth.endpoint.domain.UserInfo">
<id column="user_id" property="userId"/>
<result column="username" property="username"/>
<result column="nickname" property="nickname"/>
<result column="encrypted_password" property="encryptedPassword"/>
<result column="phone" property="phone"/>
<result column="email" property="email"/>
<result column="idd" property="idd"/>
<result column="gender" property="gender"/>
<result column="avatar" property="avatar"/>
<result column="school" property="school"/>
<result column="account_expired_time" property="accountExpiredTime"/>
<result column="account_locked_time" property="accountLockedTime"/>
<result column="credentials_expired_time" property="credentialsExpiredTime"/>
<result column="is_admin" property="admin" jdbcType="TINYINT"/>
<result column="is_able" property="able" jdbcType="TINYINT"/>
<result column="user_type" property="userType"/>
<result column="we_char_user_id" property="weChatUserId"/>
<result column="ali_pay_user_id" property="aliPayUserId"/>
<collection property="roleList" ofType="com.school.oauth.endpoint.domain.Role"
column="user_id" select="com.school.oauth.endpoint.mapper.RoleMapper.selectRoleByUserId">
</collection>
</resultMap>
<select id="selectByUsername" resultMap="BaseMap">
SELECT
u.user_id,
u.username,
u.nickname,
u.encrypted_password,
u.phone,
u.email,
u.idd,
u.gender,
u.avatar,
u.school,
u.account_expired_time,
u.account_locked_time,
u.credentials_expired_time,
u.is_admin AS admin,
u.is_able AS able,
u.user_type,
u.we_chat_user_id,
u.ali_pay_user_id
FROM oauth_user u
WHERE u.username = #{username}
</select>
這樣查詢出來的User對(duì)象的admin和able字段為空。這是因?yàn)槲覀兊膕electByUsername 引用了我們定義的ResultMap。
注意看sql語句,其中有兩個(gè)字段我們?nèi)×藙e名
?? ?u.is_admin AS admin, ? ? ? ? u.is_able AS able,
也就是說,當(dāng)sql語句查詢出來的is_admin字段和is_able 字段已經(jīng)變?yōu)榱薬dmin字段和able字段,而ResultMap里面這兩個(gè)字段的映射:
? ?<result column="is_admin" property="admin" jdbcType="TINYINT"/> ? ? ? ? <result column="is_able" property="able" jdbcType="TINYINT"/>
當(dāng)ResultMap去映射字段信息的時(shí)候,發(fā)現(xiàn)找不到is_admin字段和is_able字段,因?yàn)樵趕ql語句我們已經(jīng)為這兩個(gè)字段去了別名,現(xiàn)在這兩個(gè)字段叫admin和able。所有ResultMap映射到實(shí)體類的時(shí)候,就會(huì)出現(xiàn)這兩個(gè)字段為空的情況。
正確寫法
去掉sql語句里面的別名,就可以咯。這樣resultMap就可以找到相應(yīng)的字段了。
<resultMap id="BaseMap" type="com.school.oauth.endpoint.domain.UserInfo">
<id column="user_id" property="userId"/>
<result column="username" property="username"/>
<result column="nickname" property="nickname"/>
<result column="encrypted_password" property="encryptedPassword"/>
<result column="phone" property="phone"/>
<result column="email" property="email"/>
<result column="idd" property="idd"/>
<result column="gender" property="gender"/>
<result column="avatar" property="avatar"/>
<result column="school" property="school"/>
<result column="account_expired_time" property="accountExpiredTime"/>
<result column="account_locked_time" property="accountLockedTime"/>
<result column="credentials_expired_time" property="credentialsExpiredTime"/>
<result column="is_admin" property="admin" jdbcType="TINYINT"/>
<result column="is_able" property="able" jdbcType="TINYINT"/>
<result column="user_type" property="userType"/>
<result column="we_char_user_id" property="weChatUserId"/>
<result column="ali_pay_user_id" property="aliPayUserId"/>
<collection property="roleList" ofType="com.school.oauth.endpoint.domain.Role"
column="user_id" select="com.school.oauth.endpoint.mapper.RoleMapper.selectRoleByUserId">
</collection>
</resultMap>
<select id="selectByUsername" resultMap="BaseMap">
SELECT
u.user_id,
u.username,
u.nickname,
u.encrypted_password,
u.phone,
u.email,
u.idd,
u.gender,
u.avatar,
u.school,
u.account_expired_time,
u.account_locked_time,
u.credentials_expired_time,
u.is_admin,
u.is_able,
u.user_type,
u.we_chat_user_id,
u.ali_pay_user_id
FROM oauth_user u
WHERE u.username = #{username}
</select>
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java之Timer和TimerTask簡(jiǎn)單demo(分享)
下面小編就為大家?guī)硪黄猨ava之Timer和TimerTask簡(jiǎn)單demo(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12
SpringMVC中使用Thymeleaf模板引擎實(shí)例代碼
這篇文章主要介紹了SpringMVC中使用Thymeleaf模板引擎實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02
關(guān)于SSM框架下各層的解釋說明(Controller等)
這篇文章主要介紹了關(guān)于SSM框架下各層的解釋說明(Controller等),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
Spring bean加載控制實(shí)現(xiàn)方法
很多時(shí)候我們需要根據(jù)不同的條件在容器中加載不同的Bean,或者根據(jù)不同的條件來選擇是否在容器中加載某個(gè)Bean,這就是Bean的加載控制,一般我們可以通過編程式或注解式兩種不同的方式來完成Bean的加載控制2022-12-12
解決Mybatis-Plus更新方法不更新NULL字段的問題
這篇文章主要介紹了解決Mybatis-Plus更新方法不更新NULL字段的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
Java 獲取Html文本中的img標(biāo)簽下src中的內(nèi)容方法
今天小編就為大家分享一篇Java 獲取Html文本中的img標(biāo)簽下src中的內(nèi)容方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06

