@insert 对象_Mybatis是如何把数据库数据封装到对象中的?

本文探讨了Mybatis如何将数据库数据封装到对象中。在测试过程中发现,当数据库字段为null时,Mybatis并不会调用对象的Setter方法赋值,而是使用默认值。同时,setter方法的调用顺序与数据表字段顺序一致。而在处理前端传来的json数据时,即使值为null,Spring Boot仍会调用setter方法进行封装。
摘要由CSDN通过智能技术生成

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

一、前言

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

二、准备阶段

1.数据表

c378d8c0f12b40e845d4f7fd3cc08f0b.png

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

63f111033835d56502c8ed3f17f5addb.png

6.测试

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

swagger2结果:

cb549f7ec315530f1b6926e048a5813d.png

控制台结果:

35fe1e5deffbfc1f19ad0530366f8919.png

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

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

swagger2结果:

7c8f816125107dbda5ba45711145cc3d.png

控制台结果:

735af4ce5317119f0c692ffb948f7534.png

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

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

改变后的实体类:

217802d956387cdc4e50e466625bce46.png


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

78ab1294bce047fcb54712f244669bce.png


再看,控制台结果:

b4ea4ebd351f4e9db03f1a4106567533.png

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

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

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

先把swagger2中数据设置好

2ece60836b7e01220b710d49ca8b8e0e.png


先看控制台结果:

36a7d0e17c9cbdccf4d1df313abc13fc.png


再看数据库中数据:

6d8998dcf531b9a6e363eecc7720806b.png

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

三、结尾

今天分享的内容简单,不过也希望能帮助到你!如有问题,欢迎留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值