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 数组基础知识

    新手了解java 数组基础知识

    这篇文章主要介绍了Java 数组分析及简单实例的相关资料,在Java中它就是对象,一个比较特殊的对象,需要的朋友可以参考下,希望可以对你有所帮助
    2021-07-07
  • Java 实现图片压缩的两种方法

    Java 实现图片压缩的两种方法

    这篇文章主要介绍了Java 实现图片压缩的两种方法,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-09-09
  • 深入浅出探索Java分布式锁原理

    深入浅出探索Java分布式锁原理

    单体系统中,在高并发场景下想要访问共享资源的时候,我们需要通过加锁的方式来保证共享资源并发的安全性,确保在同一时刻只有一个线程对共享资源进行操作
    2022-02-02
  • java多线程编程之join方法的使用示例

    java多线程编程之join方法的使用示例

    join方法的功能就是使异步执行的线程变成同步执行。也就是说,当调用线程实例的start方法后,这个方法会立即返回,如果在调用start方法后后需要使用一个由这个线程计算得到的值,就必须使用join方法
    2014-01-01
  • Spring中@DependsOn注解的使用代码实例

    Spring中@DependsOn注解的使用代码实例

    这篇文章主要介绍了Spring中@DependsOn注解的使用代码实例,Spring中@DependsOn,主要是使用在类和方法上, 作用是当前对象要依赖另外一些对象,被依赖的对象会先注册到Spring的IOC容器中,需要的朋友可以参考下
    2024-01-01
  • SpringBoot开发详解之Controller接收参数及参数校验

    SpringBoot开发详解之Controller接收参数及参数校验

    数据校验是为了使系统更完整,数据更精确,同时也有利于维护数据的安全性,下面这篇文章主要给大家介绍了关于SpringBoot开发详解之Controller接收参数及参数校验的相关资料,需要的朋友可以参考下
    2022-03-03
  • Java中的5种同步辅助类介绍

    Java中的5种同步辅助类介绍

    你提交了一些任务,但你想等它们都完成了再做另外一些事情;你提交了一些任务,但是不想让它们立刻执行,等你喊123开始的时候,它们才开始执行;等等这些场景,线程之间需要相互配合,或者等待某一个条件成熟执行。这些场景想你就需要用到同步辅助类
    2014-04-04
  • Jackson将json string转为Object,org.json读取json数组的实例

    Jackson将json string转为Object,org.json读取json数组的实例

    下面小编就为大家带来一篇Jackson将json string转为Object,org.json读取json数组的实例,具有很好的参考价值,希望对大家有所帮助
    2017-12-12
  • Java并发之AQS与自旋锁详解

    Java并发之AQS与自旋锁详解

    这篇文章主要介绍了Java并发之AQS与自旋锁详解,类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch,需要的朋友可以参考下
    2023-10-10
  • Spring重试支持Spring Retry的方法

    Spring重试支持Spring Retry的方法

    本篇文章主要介绍了Spring重试支持Spring Retry的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04

最新评论