Mybatis查询语句返回对象和泛型集合的操作

 更新时间:2021年07月30日 11:53:56   作者:Sesshoumaru华  
这篇文章主要介绍了Mybatis查询语句返回对象和泛型集合的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Mybatis查询语句返回对象和泛型集合

EmpMapper映射接口:

package cn.et.mybatis.lesson03; 
import java.util.List; 
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select; 
public interface EmpMapper { 
 
 /**
  * 查询单条数据,
  *  每一列的列名都会去Emp实体类中去匹配对应的属性
  *   匹配时会把二边都转为小字母进行匹配
  *   匹配成功就会调用Emp实体类中对象的set方法
  * 
  * 如果列名和Emp的属性匹配不上,
  *  1.为查询结果的列设置一个别名
  *      2.将列名ename和属性ename1建立一个关系 单个属性建立关系
  * 
  *   column是不区分大小写的,property是区分大小写的
  * @return
  */
 @Results(
   {
    @Result(column="ename",property="ename1"),
    @Result(column="empNo",property="empNo1"),
    @Result(column="sal",property="sal1"),
   }
 )
 @Select("select * from emp where empno=#{0}")
 public Emp queryEmpByEmpNo(String empNo); 
 
 /**
  * 查询出多条数据,每一条数据都是一个Emp对象
  * 每一列的列名都会去Emp实体类中去匹配对应的属性
  *   匹配时会把二边都转为小字母进行匹配
  *   匹配成功就会调用Emp实体类中对象的set方法
  * 如果没有一条数据匹配成功,则不会创建Emp对象
  * @param empNo
  * @return
  */
 @Results(
   {
    @Result(column="ename",property="ename1"),
    @Result(column="empNo",property="empNo1"),
    @Result(column="sal",property="sal1"),
   }
 )
 @Select("select * from emp")
 public List<Emp> queryEmp(); 
}

测试类:

package cn.et.mybatis.lesson03; 
import java.io.InputStream;
import java.util.List; 
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
 
public class TestMybatis { 
 public static SqlSession getSession(){
  String resource = "/cn/et/mybatis/lesson03/mybatis.xml";
  InputStream inputStream = TestMybatis.class.getResourceAsStream(resource);
  SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  //打开会话
  SqlSession session = sqlSessionFactory.openSession();
  return session;
 }
 
 public static void main(String[] args) {
  SqlSession session = getSession();
  EmpMapper emp = session.getMapper(EmpMapper.class);
  Emp obj = emp.queryEmpByEmpNo("8000");
  System.out.println(obj);
 } 
 
 @Test
 public void test(){
  SqlSession session = getSession();
  EmpMapper emp = session.getMapper(EmpMapper.class);
  List<Emp> result = emp.queryEmp();
  for (Emp emp2 : result) {
   System.out.println(emp2);
  }
 }
}

xml映射-----------

dept_mapper.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  
<!-- 
 接口映射
 namespace必需跟接口的全名一致
 -->
<mapper namespace="cn.et.mybatis.lesson03.resultEntityXml.DeptMapper">
 
 <!-- column是不区分大小写的,property是区分大小写的 -->
  <resultMap type="cn.et.mybatis.lesson03.resultEntityXml.Dept" id="myDept">
    <result column="deptno" property="deptno1"/>
    <result column="dname" property="dname1"/>
    <result column="loc" property="loc1"/>
  </resultMap>
  <select id="queryDept" resultMap="myDept">
 select * from dept where deptno=#{0}
  </select>  
</mapper>

测试类:

package cn.et.mybatis.lesson03.resultEntityXml; 
import java.io.InputStream; 
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 
public class TestMybatis { 
 public static SqlSession getSession(){
  String resource = "/cn/et/mybatis/lesson03/mybatis.xml";
  InputStream inputStream = TestMybatis.class.getResourceAsStream(resource);
  SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  //打开会话
  SqlSession session = sqlSessionFactory.openSession();
  return session;
 }
 
 public static void main(String[] args) {
  SqlSession session = getSession();
  DeptMapper dept = session.getMapper(DeptMapper.class);
  Dept result = dept.queryDept("10");
  System.out.println(result);  
 } 
}

mybatis查询结果集有泛型属性时可能出现的问题

问题:

当接收结果为map或者对象的属性为泛型时:

@Data
public class GenericKeyValueVo<K,V> {
    private K key;
    private V value;
}

这时候如果直接将resultType指向对象全限定名称时,可能会出现问题。因为如果查询结果的某个字段大于1000会出现","如:1,000.56 。mybatis不会报错,因为这个对象的这个属性为泛型,可以接收。而当获取结果之后即使定义接收的变量类型为:

在这里插入图片描述

第二个属性也会存入String类型的值。后续再处理可能就会出现将string转为double数据类型转换错误。

解决方法:

定义一个resultMap,指明javaType

    <resultMap id="StrKeyDoubleValueMap" type="com.meinergy.mkting.commons.entity.wholesale.vo.GenericKeyValueVo">
        <result column="key" property="key" javaType="java.lang.String"/>
        <result column="value" property="value" javaType="java.lang.Double"/>
    </resultMap>

再用一个convert函数规范查询结果格式

convert(FORMAT(queryResult, decimal(12, 2))

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

相关文章

  • Java中的setting和getting使用方法

    Java中的setting和getting使用方法

    为了保障数据的安全性,通常将数据成员定义为private(封装或私有化),这样外部代码就无法直接访问这些数据,只能通过类提供的公共方法来进行访问,这种方法主要包括setter和getter方法,以及构造方法,setter方法用于给私有属性赋值
    2024-09-09
  • 通过实例解析java8中的parallelStream

    通过实例解析java8中的parallelStream

    这篇文章主要介绍了通过实例解析java8中的parallelStream,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 使用springboot访问图片本地路径并映射成url

    使用springboot访问图片本地路径并映射成url

    这篇文章主要介绍了使用springboot访问图片本地路径并映射成url的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java编写多功能万年历程序的实例分享

    Java编写多功能万年历程序的实例分享

    这里我们来作一个Java编写多功能万年历程序的实例分享,可以查询公元历、农历、节气与节日等,十分全面,下面就来具体看一下:
    2016-06-06
  • Maven jar包下载失败问题的处理方法

    Maven jar包下载失败问题的处理方法

    很多同学在Maven里下载一些依赖的时候,即下载jar包的时候总是会出现一些问题,本文将就这个问题给大家详细的讲解一下,需要的朋友可以参考下
    2023-06-06
  • 浅谈java中六大时间类的使用和区别

    浅谈java中六大时间类的使用和区别

    下面小编就为大家带来一篇浅谈java中六大时间类的使用和区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • SpringBoot项目部署到服务器上的方法(Jar包)

    SpringBoot项目部署到服务器上的方法(Jar包)

    这篇文章主要介绍了SpringBoot项目部署到服务器上的方法(Jar包),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • 指定springboot的jar运行内存方式

    指定springboot的jar运行内存方式

    这篇文章主要介绍了指定springboot的jar运行内存方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Spring JPA联表查询之OneToOne源码详解

    Spring JPA联表查询之OneToOne源码详解

    这篇文章主要为大家介绍了Spring JPA联表查询之OneToOne源码详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • 详解Spring Boot 项目中的 parent

    详解Spring Boot 项目中的 parent

    这篇文章主要介绍了Spring Boot中parent作用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04

最新评论