详解Mybatis是如何把数据库数据封装到对象中的

一、前言

接到一个问题,数据库为Null的数据,传递到前端显示为0。之前有了解过,持久层框架(mybatis)在把数据库数据封装到对象中,是利用对象的Setter方法,这个大家也都知道,因此我就在Setter方法尝试,结果并不完全是这样。下面我用例子演示。

二、准备阶段

1.数据表

2.表对应的实体类

@Data
@ApiModel("用户账号")
public class User {

  @ApiModelProperty(value = "用户id")
  Integer id;

  @ApiModelProperty(value = "密码")
  String password;

  @ApiModelProperty(value = "用户名")
  String name;

  @ApiModelProperty(value = "状态")
  Integer type;

  public void setType(Integer type) {
    if (type == null) {
      this.type = 0;
    } else {
      this.type = type;
    }
    System.out.println("id为"+this.id+"的type = " + this.type);
  }


  public void setName(String name) {
    this.name = name;
    System.out.println("id为"+this.id+"的name = " + this.name);
  }
}

这里用到的是lombok和swagger2注解

3.Controller层

@RestController
@RequestMapping("/user")
@Api(tags = "UserController", description = "用户管理")
public class UserController {

  @Autowired
  private UserDao userDao;

  @GetMapping("/getUser/{id}")
  @ApiOperation("获取用户账号")
  public User getUser(@PathVariable @ApiParam("用户id") Integer id) {
    return userDao.selectOne(id);
  }

  @PostMapping("/setUser")
  @ApiOperation("添加用户账号")
  public void setUser(@RequestBody User user) {
    userDao.insert(user);
  }
}

图方便,我就将UserDao直接注入UserController层中,其中使用到spring boot注解加swagger2注解,稍后使用swagger2进行测试

4.Dao层

public interface UserDao{

  @Select("select * from user where id=#{id}")
  User selectOne(Integer id);

  @Insert("insert into user values(null,#{name},#{password},#{type})")
  void insert(User user);
}

注意:dao接口需要被扫描到才能完成映射

5.swagger2接口

6.测试

1.先获取id为1的用户账号:

swagger2结果:

控制台结果:


说明这里都有使用Setter方法赋值

2.再获取id为2的用户账号:

swagger2结果:

控制台结果:

首先,swagger2结果中 type为null,而不是我们期望的0;再就是,控制台也只打印出了一句话。这是怎么回事呢?别急,我们接着往下看。

3.我准备在实体类中做点改变,再测试获取id为2的用户账号,如下:

改变后的实体类:


其他地方不变,看结果。首先,swagger2结果:


再看,控制台结果:

小结:通过上面一些测试结果,我断言当数据库数据为null时,框架不会调用该属性的Setter方法为其赋值,而是会使用它的默认值。还有,从控制台输出顺序可看出,调用Setter方法顺序为数据表字段从左至右依次开始封装。

在此,我又冒出了一个新的想法,我想测试前端传到后端的json数据是不是也是这个结论。还是使用上面准备的环境开始测试:

注意:实体类中@ApiModelProperty(value = "状态") Integer type;

先把swagger2中数据设置好


先看控制台结果:


再看数据库中数据:


小结:跟我预想的结果有些出入,本以type为null也不会调用Setter方法。因此,spring boot在封装前端传来的json数据时,就算数据为null,也会去调用Setter方法。

三、结尾

到此这篇关于详解Mybatis是如何把数据库数据封装到对象中的的文章就介绍到这了,更多相关Mybatis 数据封装到对象 内容请搜索呐喊教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持呐喊教程!

声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#nhooo.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。