mybatis传入参数一直为null

1.配置方面都对的情况下,考虑连接数据库的时候是否设置了编码为utf-8,如果没设置,数据库传过来的时候有可能就是乱码,就会一直是null。

2.有可能是字段名与实体不匹配。

3.可能是有空格问题

mybatis字段为null的解决

今天在写项目的mapper.xml文件的时候,出现了个别字段查询结果为null的情况,但sql语句没有错误,仔细查看了一遍,才发现错误,现在记录下来

先讲一讲sql语句和ResultMap的顺序

首先会执行sql语句,sql语句返回字段信息,然后才是ResultMap映射字段信息。

实体类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 = "昵称,可以重复")
    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 = "手机号码格式错误")
    @ApiModelProperty(value = "用户手机号码")
    private String phone;
    @Email
    @Length(max = 128)
    @ApiModelProperty(value = "用户邮箱")
    private String email;
    @Length(max = 8)
    @ApiModelProperty(value = "国际冠码,默认  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 = "所属学校")
    private String school;
    @DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
    @ApiModelProperty(value = "账户过期时间")
    private Date accountExpiredTime;
    @DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
    @ApiModelProperty(value = "账户锁定时间")
    private Date accountLockedTime;
    @DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
    @ApiModelProperty(value = "凭证过期时间")
    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 = "用户注册平台:WEB(默认)/AliPay/WeChat")
    private String userType;
    @Length(max = 64)
    @ApiModelProperty(value = "微信用户识别ID")
    private String weChatUserId;
    @Length(max = 64)
    @ApiModelProperty(value = "支付宝用户识别ID")
    private String aliPayUserId;
    @Transient
    @NotBlank(groups = Insert.class)
    @ApiModelProperty(value = "密码")
    private String password;
    /**
     * 一个用户只能对应一个角色(最高权限角色)
     */
    @Transient
    @ApiModelProperty(value = "用户角色集合:guest/user/admin")
    private List<Role> roleList;
    public UserInfo() {
    }
}

UserMapper.xml错误代码

<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对象的admin和able字段为空。这是因为我们的selectByUsername 引用了我们定义的ResultMap。

注意看sql语句,其中有两个字段我们取了别名

    u.is_admin AS admin,
        u.is_able AS able,

也就是说,当sql语句查询出来的is_admin字段和is_able 字段已经变为了admin字段和able字段,而ResultMap里面这两个字段的映射:

   <result column="is_admin" property="admin" jdbcType="TINYINT"/>
        <result column="is_able" property="able" jdbcType="TINYINT"/>

当ResultMap去映射字段信息的时候,发现找不到is_admin字段和is_able字段,因为在sql语句我们已经为这两个字段去了别名,现在这两个字段叫admin和able。所有ResultMap映射到实体类的时候,就会出现这两个字段为空的情况。

正确写法

去掉sql语句里面的别名,就可以咯。这样resultMap就可以找到相应的字段了。

<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>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持Devmax。

关于mybatis传入参数一直为null的问题的更多相关文章

  1. ios检查是否nsarray == null

    我收到了JSON的一些响应,并且工作正常,但是我需要检查一些空值,我找到不同的答案,但似乎不工作,我试过了那么发生了什么呢?如何解决这个问题并在我的数组中检查null?

  2. ios – TabBarController返回null

    我在故事板中有一个tabbarcontroller作为初始视图控制器这是如何返回null的本来就是我想要做的为什么我会变空?

  3. Swift解析Json返回值为null的问题

    nil用来给对象赋值,NULL则给任何指针赋值,NULL和nil不能互换,nil用于类指针赋值,而NSNull则用于集合操作,虽然它们表示的都是空值,但使用的场合完全不同。

  4. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  5. AngularJS下$http服务Post方法传递json参数的实例

    下面小编就为大家分享一篇AngularJS下$http服务Post方法传递json参数的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  6. Springboot集成mybatis实现多数据源配置详解流程

    在日常开发中,若遇到多个数据源的需求,怎么办呢?通过springboot集成mybatis实现多数据源配置,简单尝试一下,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  7. php检查函数必传参数是否存在的实例详解

    这篇文章主要介绍了php检查函数必传参数是否存在的实例详解的相关资料,需要的朋友可以参考下

  8. vue-router如何实时动态替换路由参数(地址栏参数)

    这篇文章主要介绍了vue-router如何实时动态替换路由参数(地址栏参数),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  9. redirect_uri参数错误的解决方法(必看)

    下面小编就为大家带来一篇redirect_uri参数错误的解决方法(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. 深入理解JS函数的参数(arguments)的使用

    下面小编就为大家带来一篇深入理解JS函数的参数(arguments)的使用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

随机推荐

  1. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  3. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  4. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  5. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  6. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  7. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  8. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  9. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Spring JdbcTemplate执行数据库操作详解

    JdbcTemplate是Spring框架自带的对JDBC操作的封装,目的是提供统一的模板方法使对数据库的操作更加方便、友好,效率也不错,这篇文章主要介绍了Spring JdbcTemplate执行数据库操作,需要的朋友可以参考下

返回
顶部