详解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 数据封装到对象 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mybatis查询语句揭秘之封装数据

    一.前言 继上一篇mybatis查询语句的背后,这一篇主要围绕着mybatis查询的后期操作,即跟数据库交互的时候.由于本人也是一边学习源码一边记录,内容难免有错误或不足之处,还望诸位指正,本文只可当参考作用.谨记! 二.分析 继上一篇博文的查询例子,mybatis在最后的查询最终会走SimpleExecutor类的doQuery方法, @Override public <E> List<E> doQuery(MappedStatement ms, Object parameter

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

    一.前言 接到一个问题,数据库为Null的数据,传递到前端显示为0.之前有了解过,持久层框架(mybatis)在把数据库数据封装到对象中,是利用对象的Setter方法,这个大家也都知道,因此我就在Setter方法尝试,结果并不完全是这样.下面我用例子演示. 二.准备阶段 1.数据表 2.表对应的实体类 @Data @ApiModel("用户账号") public class User { @ApiModelProperty(value = "用户id") Integ

  • 详解MyBatis Mapper 代理实现数据库调用原理

    1. Mapper 代理层执行 Mapper 代理上执行方法调用时,调用被委派给 MapperProxy 来处理. public class MapperProxy<T> implements InvocationHandler, Serializable { private final SqlSession sqlSession; private final Class<T> mapperInterface; private final Map<Method, Mapper

  • 详解MyBatis的getMapper()接口、resultMap标签、Alias别名、 尽量提取sql列、动态操作

    一.getMapper()接口 解析:getMapper()接口 IDept.class定义一个接口, 挂载一个没有实现的方法,特殊之处,借楼任何方法,必须和小配置中id属性是一致的 通过代理:生成接口的实现类名称,在MyBatis底层维护名称$$Dept_abc,selectDeptByNo() 相当于是一个强类型 Eg 第一步:在cn.happy.dao中定义一个接口 package cn.happy.dao; import java.util.List; import cn.happy.e

  • 详解MyBatis Generator自动创建代码(dao,mapping,poji)

    连接的数据库为SQL server2008,所以需要的文件为sqljdbc4.jar 使用的lib库有: 在lib库目录下新建一个src文件夹用来存放生成的文件,然后新建generatorConfig.xml 里面代码为: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis G

  • 详解MyBatis直接执行SQL查询及数据批量插入

    一.直接执行SQL查询: 1.mappers文件节选 <resultMap id="AcModelResultMap" type="com.izumi.InstanceModel"> <result column="instanceid" property="instanceID" jdbcType="VARCHAR" /> <result column="insta

  • 详解MyBatis逆向工程

    1.什么是mybatis逆向工程 在使用mybatis时需要程序员自己编写sql语句,针对单表的sql语句量是很大的,mybatis官方提供了一种根据数据库表生成mybatis执行代码的工具,这个工具就是一个逆向工程. 逆向工程:针对数据库单表-->生成代码(mapper.xml.mapper.java.pojo..) mybatis-generator-core-1.3.2.jar-逆向工程运行所需要的jar核心 包 2.配置逆向工程的配置文件 配置文件generatorConfig.xml

  • 详解Mybatis框架SQL防注入指南

    前言 SQL注入漏洞作为WEB安全的最常见的漏洞之一,在java中随着预编译与各种ORM框架的使用,注入问题也越来越少.新手代码审计者往往对Java Web应用的多个框架组合而心生畏惧,不知如何下手,希望通过Mybatis框架使用不当导致的SQL注入问题为例,能够抛砖引玉给新手一些思路. 一.Mybatis的SQL注入 Mybatis的SQL语句可以基于注解的方式写在类方法上面,更多的是以xml的方式写到xml文件.Mybatis中SQL语句需要我们自己手动编写或者用generator自动生成.

  • 详解Mybatis中的 ${} 和 #{}区别与用法

    Mybatis 的Mapper.xml语句中parameterType向SQL语句传参有两种方式:#{}和${} 我们经常使用的是#{},一般解说是因为这种方式可以防止SQL注入,简单的说#{}这种方式SQL语句是经过预编译的,它是把#{}中间的参数转义成字符串,举个例子: select * from student where student_name = #{name} 预编译后,会动态解析成一个参数标记符?: select * from student where student_name

  • 详解mybatis plus使用insert没有返回主键的处理

    项目使用springboot搭建.最初的时候是使用mybatis,后来升级到mybatis plus.按照mp的官网介绍,使用mp的insert方法,对于自增的数据库表,mp会把主键写入回实例的对应属性.但实际操作起来,却没有主键. entity 类设置如下: @TableName(value = "USERINFO") public class UserInfo { /** * 指定自增策略 */ @TableId(value = "user_id",type =

  • 详解MyBatis XML配置解析

    MyBatis核心配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environm

随机推荐