MyBatis获取查询结果

150 阅读2分钟

使用 POJO 类接收查询结果

MyBatis 创建 POJO 类对象,使用 JDBC 的 get 方法从查询结果中读取结果并为 POJO 对象相应的属性赋值。

image.png

数据库字段名称与 POJO 属性名称不一致的情况

  • Java程序中变量常用驼峰命名法(camel case,第一个单词以小写字母开始;从第二个单词开始以后的每个单词的首字母都采用大写字母),例如 userAge
  • MySQL字段常用蛇形命名法(snake case,单词之间用下划线分隔),例如 user_age
  • 因此可能会出现数据库字段名与 POJO 类属性名称不一致的情况
  • 如果不进行相应处理,MyBatis 将无法从数据库读到这类字段的值

image.png

image.png

image.png

使用 as 为字段起别名

image.png

缺点:每个 SQL 都需要写重复的别名 SQL,重复代码多。

开启驼峰命名映射

  • 不需要修改 mapper.xml 文件。
  • 在MyBatis 核心配置文件 mybatis-config.xml 中增加配置项,将 mapUnderscoreToCamelCase 设置为 true,开启驼峰命名与蛇形命名的自动映射。

image.png

image.png

缺点:灵活性不够,不能处理字段名不匹配的情况。

使用 resultMap 实现结果映射

image.png

  • 在 mapper.xml 文件中定义 resultMap,type 为 POJO 类名。
  • resultMap 中定义 POJO 类字段和数据库字段的映射关系,主键使用 id 标签,其他字段使用 result 标签
  • propety 填 POJO 类属性名,column 填数据库字段名
  • javaType 表示 POJO 类属性类型,jdbcType 表示数据库字段类型,这两个属性可以不填,MyBatis 会自动识别。

image.png

  • 不使用 resultType,使用 resultMap,多个 SQL 可以复用 resultMap

项目中,推荐使用 resultMap 来实现结果映射。

查询结果返回单条记录与多条记录的情况

image.png

  • mapper 接口定义返回值类型如果是单个对象,MyBatis 底层调用 JDBC 的 selectOne 方法
  • mapper 接口定义返回值类型如果是List,MyBatis 底层调用 JDBC 的 selectList 方法
  • 如果 mapper 接口定义值类型是单个对象,但实际查询返回了多条记录,会抛出 TooManyResultsException

image.png

要正确定义 mapper 接口返回值的类型(单个对象 or List)

使用 map 接收查询结果 ( 较少使用,了解即可 )

  • 如果没有合适的 POJO 类来接收查询返回的结果,可以使用 map 来接收
  • 返回单条记录用 Map<String, Object>

image.png

image.png

image.png

  • 返回多条记录用 List<Map<String, Object>>

image.png

image.png

image.png

使用简单类型接收查询结果

  • 有些场景使用简单类型接收查询结果
  • 例如查询数据表中记录的条数

image.png

image.png