MyBatis的select标签的resultType属性

news2024/11/18 8:58:55

在MyBatis框架中,映射文件中select标签的resultType属性,用于指定从数据库查询返回结果集需要映射的Java类型,即Mapper接口中方法返回值类型(或集合中的泛型类型),可以是基本数据类型、基本数据类型的包装类型、自定义的PO类型、集合类型等类型。

一 基本类型和包装类

select标签的resultType属性指定基本数据类型,MyBatis会直接将结果列的值赋值给对应的变量,如果查询结果为空值或是其他类型无法转换成当前基本数据类型的值,那么MyBatis会抛出异常;

select标签的resultType属性指定基本数据类型的包装类型,MyBatis会将结果列的值转换为相应的包装类实例赋值给对应的变量,如果查询结果为空值,MyBatis会返回null,如果查询结果是其他类型,而且可以转换成当前基本数据类型的值,那么MyBatis会返回对应的值,否则会抛出异常;

创建一张成绩表,并插入一些数据,查询成绩的最值,接收数据库返回结果映射的Java类型,即resultType的类型分别使用基本数据类型和包装类型演示。

1.1 基本数据准备

创建score成绩表

CREATE TABLE `score` (
  `id` varchar(32) DEFAULT NULL,
  `username` varchar(32) DEFAULT NULL,
  `chinese` int DEFAULT NULL,
  `math` int DEFAULT NULL,
  `english` int DEFAULT NULL
) ENGINE=InnoDB 

表中插入数据,chinese、math和english的字段类型是int,模拟查询表中成绩的最大值

1.2 mapper接口

@Mapper
@Repository
public interface ScoreMapper {
    int getMaxEnglishIntScore();
    Integer getMaxEnglishIntegerScore();
}

1.3 mapper映射文件

<?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">
<mapper namespace="com.mango.mapper.ScoreMapper">

    <select id="getMaxEnglishIntScore" resultType="int">
        select MAX(english) from score
    </select>

    <select id="getMaxEnglishIntegerScore" resultType="java.lang.Integer">
        select MAX(english) from score
    </select>

</mapper>

1.4 功能测试

1.4.1 表中字段类型是int

@SpringBootTest
@RunWith(SpringRunner.class)
public class ScoreTest {

    @Autowired
    private ScoreMapper scoreMapper;

    @Test
    public void testInt() {
        int maxEnglishIntScore = scoreMapper.getMaxEnglishIntScore();
        // int value is: 98
        System.out.println("int value is: " + maxEnglishIntScore);
    }

    @Test
    public void testInteger() {
        Integer maxEnglishIntegerScore = scoreMapper.getMaxEnglishIntegerScore();
        // Integer value is: 98
        System.out.println("Integer value is: " + maxEnglishIntegerScore);
    }

}

表中数据类型是int,而且表中也有数据,那么resultType指定的int类型,或Integer类型都可以查到数据

1.4.2 表中字段是空值

设置english字段的值都是空值

UPDATE score SET english = NULL

再执行测试代码

@SpringBootTest
@RunWith(SpringRunner.class)
public class ScoreTest {

    @Autowired
    private ScoreMapper scoreMapper;

    @Test
    public void testInt() {
        int maxEnglishIntScore = scoreMapper.getMaxEnglishIntScore();
        //==>  Preparing: select MAX(english) from score
        //==> Parameters:
        //<==    Columns: MAX(english)
        //<==        Row: null
        //<==      Total: 1

        // org.apache.ibatis.binding.BindingException:
        // Mapper method 'x.x.getMaxEnglishIntScore attempted to 
        // return null from a method with a primitive return type (int).
        System.out.println("int value is: " + maxEnglishIntScore);
    }

    @Test
    public void testInteger() {
        Integer maxEnglishIntegerScore = scoreMapper.getMaxEnglishIntegerScore();
        //==>  Preparing: select MAX(english) from score
        //==> Parameters:
        //<==    Columns: MAX(english)
        //<==        Row: null
        //<==      Total: 1

        // Integer value is: null
        System.out.println("Integer value is: " + maxEnglishIntegerScore);
    }

}

表中数据类型是int,而且表中数据为null,那么resultType指定的int类型要抛出异常,而resultType指定的Integer类型可以将null值赋值给指定的变量。这种情况下,两种类型执行SQL的情况是一样的:

==>  Preparing: select MAX(english) from score预编译sql
==> Parameters:   占位符对应的值
<==    Columns: MAX(english)表中的字段名称或别名
<==        Row: null表中字段的值
<==      Total: 1表总共返回多少行

resultType指定的int类型要抛出异常,org.apache.ibatis.binding.BindingException: Mapper method 'x.x.getMaxEnglishIntScore attempted to return null from a method with a primitive return type (int).

1.4.3 表中字段类型改为其他类型

1.4.3.1 改为字符串类型

将表中english字段类型设置为varchar

ALTER TABLE score MODIFY COLUMN english VARCHAR(20)

给表的english字段设置数字值

再执行测试代码

@SpringBootTest
@RunWith(SpringRunner.class)
public class ScoreTest {

    @Autowired
    private ScoreMapper scoreMapper;

    @Test
    public void testInt() {
        int maxEnglishIntScore = scoreMapper.getMaxEnglishIntScore();
        // int value is: 98
        System.out.println("int value is: " + maxEnglishIntScore);
    }

    @Test
    public void testInteger() {
        Integer maxEnglishIntegerScore = scoreMapper.getMaxEnglishIntegerScore();
        // Integer value is: 98
        System.out.println("Integer value is: " + maxEnglishIntegerScore);
    }

}

给表的english字段设置非数字值

 再执行测试代码,两种类型都会抛出异常:

1.4.3.2 改为其他类型

english字段改为bigint类型,也是可以获取值,只要不超过数据范围;

english字段改为double类型可以获取值,只会获取到整数部分,小数部分会舍弃掉;

二 自定义的PO类型

将MyBatis中select标签的resultType属性设置为自定义PO类型

2.1 实体类对象

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Score {
    private String id;
    private String username;
    private int chinese;
    private int math;
    private int english;
}

2.2 mapper接口

@Mapper
@Repository
public interface ScoreMapper {
    Score getScoreById(String id);
}

2.3 mapper映射文件

<?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">
<mapper namespace="com.mango.mapper.ScoreMapper">

    <select id="getScoreById" resultType="com.mango.domain.Score">
        select id, username, chinese, math, english
        from score where id = #{id}
    </select>

</mapper>

2.4 功能测试

@SpringBootTest
@RunWith(SpringRunner.class)
public class ScoreTest {

    @Autowired
    private ScoreMapper scoreMapper;

    // score is: Score(id=1001, username=a01, chinese=87, math=90, english=80)
    @Test
    public void testScore() {
        Score score = scoreMapper.getScoreById("1001");
        System.out.println("score is: " + score);
    }
}

==>    Preparing: select id, username, chinese, math, english from score where id = ? 
==> Parameters: 1001(String)
<==      Columns: id, username, chinese, math, english
<==             Row: 1001, a01, 87, 90, 80
<==             Total: 1

自定义实体类型,会从查询到的Columns中找匹配类中属性的字段,完成赋值操作,如果实体类中还有未匹配到字段的属性,那么属性取本身默认值(基本类型默认值,引用类型null值);

三 Map集合

将MyBatis中select标签的resultType属性设置为Map集合类型,将表中id是1001的记录,使用map集合存储以字段名为key,字段值为value的键值对

3.1 mapper接口

@Mapper
@Repository
public interface ScoreMapper {
    // Map<K,V>中的K指定String类型, V最好指定Object类型
    Map<String, Object> getMapValue(String id);
}

3.2 mapper映射文件

<?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">
<mapper namespace="com.mango.mapper.ScoreMapper">

    <select id="getMapValue" resultType="java.util.Map">
        select id, username, chinese, math, english
        from score where id = #{id}
    </select>

</mapper>

3.3 功能测试

@SpringBootTest
@RunWith(SpringRunner.class)
public class ScoreTest {

    @Autowired
    private ScoreMapper scoreMapper;

    @Test
    public void testScoreMap() {
        Map<String, Object> map = scoreMapper.getMapValue("1001");
        // scoreMap is: {chinese=87, english=80, id=1001, math=90, username=a01}
        System.out.println("scoreMap is: " + map);
    }
}

在Map集合中,也可以给查询的字段起别名,别名支持大小写。之前遇到过给字段取小驼峰别名,后来在map中对应的key的名字是小写的,没有复现出来这个问题。

四 List集合

如果接口中方法返回值类型是List集合,List集合的泛型类型可以是自定义PO类型或Map类型,那么在select标签的resultType属性中指定的类型仍然是自定义PO类型或Map类型。

4.1 mapper接口

@Mapper
@Repository
public interface ScoreMapper {
    List<Score> getScoreList();
    List<Map<String, Object>> getMapList();
}

4.2 mapper映射文件

<?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">
<mapper namespace="com.mango.mapper.ScoreMapper">

    <select id="getScoreList" resultType="com.mango.domain.Score">
        select id, username, chinese, math, english
        from score
    </select>

    <select id="getMapList" resultType="java.util.Map">
        select id, username, chinese, math, english
        from score
    </select>

</mapper>

4.3 接口测试

@SpringBootTest
@RunWith(SpringRunner.class)
public class ScoreTest {

    @Autowired
    private ScoreMapper scoreMapper;

    //[
    // Score(id=1001, username=a01, chinese=87, math=90, english=80),
    // Score(id=1002, username=b01, chinese=93, math=95, english=87),
    // Score(id=1003, username=b02, chinese=89, math=88, english=98),
    // Score(id=1004, username=c01, chinese=91, math=97, english=81),
    // Score(id=1005, username=c02, chinese=94, math=83, english=86)
    // ]
    @Test
    public void testScoreList() {
        List<Score> scoreList = scoreMapper.getScoreList();
        System.out.println(scoreList);
    }

    //[
    // {chinese=87, english=80, id=1001, math=90, username=a01}, 
    // {chinese=93, english=87, id=1002, math=95, username=b01}, 
    // {chinese=89, english=98, id=1003, math=88, username=b02}, 
    // {chinese=91, english=81, id=1004, math=97, username=c01}, 
    // {chinese=94, english=86, id=1005, math=83, username=c02}
    // ]
    @Test
    public void testScoreMapList() {
        List<Map<String, Object>> mapList = scoreMapper.getMapList();
        System.out.println(mapList);
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2242713.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu20.04如何升级python3.8到python3.10

主要参考了这两个链接&#xff1a; 如何在Ubuntu 20.04安装Python 3.10 | myfreaxhttps://www.myfreax.com/how-to-install-python-3-10-on-ubuntu-20-04/#:~:text%E5%9C%A8%E8%B0%83%E8%AF%95%E5%92%8C%E5%85%B6%E4%BB%96%E5%B7%A5%E5%85%B7%E4%B8%AD%E4%BD%BF%E7%94%A8%E7%B…

AWTK-WIDGET-WEB-VIEW 发布

awtk-widget-web-view 是通过 webview 提供的接口&#xff0c;实现的 AWTK 自定义控件&#xff0c;使得 AWTK 可以方便的显示 web 页面。 项目网址&#xff1a; https://gitee.com/zlgopen/awtk-widget-web-view webview 提供了一个跨平台的 webview 接口&#xff0c;是一个非…

丹摩征文活动|FLUX.1+ComfyUI部署与使用

丹摩征文活动&#xff5c;FLUX.1ComfyUI部署与使用 1.引言 在人工智能飞速发展的今天&#xff0c;丹摩智算平台&#xff08;DAMODEL&#xff09;以其卓越的AI算力服务脱颖而出&#xff0c;为开发者提供了一个简化AI开发流程的强大工具。通过租赁GPU资源&#xff0c;丹摩智算平…

性能高于Transformer模型1.7-2倍,彩云科技发布基于DCFormer架构通用大模型云锦天章

2017年&#xff0c;谷歌发布《Attention Is All You Need》论文&#xff0c;首次提出Transformer架构&#xff0c;掀开了人工智能自然语言处理&#xff08;NLP&#xff09;领域发展的全新篇章。Transformer架构作为神经网络学习中最重要的架构&#xff0c;成为后来席卷全球的一…

【异常解决】Linux shell报错:-bash: [: ==: 期待一元表达式 解决方法

博主介绍&#xff1a;✌全网粉丝21W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…

Linux解决普通用户无法使用sudo指令的问题

问题描述&#xff1a; Linux解决普通用户无法使用sudo指令的问题 sudo 指令是允许 普通用户 临时 以 超级用户 root 的权限运行。 普通用户如果没有配置而直接使用 sudo 指令&#xff1a;系统会提示没有权限&#xff08;如下图&#xff09; 使用sudo时系统提示&#xff08;当前…

9.1 使用haarcascade_frontalface_default.xml分类器对静态图像进行人脸检测。

1&#xff09;程序代码&#xff1a; # 1. 使用haarcascade_frontalface_default.xml分类器对静态图像进行人脸检测。 import cv2 import numpy as np # 构造级联分类器对象face_cascade cv2.CascadeClassifier(./data/haarcascades/haarcascade_frontalface_default.xml# ./…

【Mysql】Mysql函数----字符串函数

1、字符串函数 函数 描述 示例 CHAR_LENGTH(S) 返回字符串S的字符个数 返回字符串runoob的字符个数&…

(干货)Jenkins使用kubernetes插件连接k8s的认证方式

#Kubernetes插件简介 Kubernetes 插件的目的是能够使用 Kubernetes 配合&#xff0c;实现动态配置 Jenkins 代理&#xff08;使用 Kubernetes 调度机制来优化负载&#xff09;&#xff0c;在执行 Jenkins Job 构建时&#xff0c;Jenkins Master 会在 kubernetes 中创建一个 Sla…

微积分第五版课后习题答案详解PDF电子版 赵树嫄

(一) 习题解答与注释 该部分基本上对《微积分》(第五版) 中的习题给出了解答&#xff0c; 并结合教与学作了大量注释。通过这些注释&#xff0c; 读者可以深刻领会教材中基本概念的准确含义&#xff0c; 开阔解题思路&#xff0c; 掌握解题方法&#xff0c; 避免在容易发生错误…

【Linux庖丁解牛】—权限!

目录 1、shell命令以及运行原理 2、Linux中的用户及用户切换 3、sudo指令 ​编辑 4、角色与目标属性 5、修改权限 5.1修改文件属性(chmod) 5.2修改文件角色(chown/chgrp) 6、rwx对目录意味着什么 7、Linux中多用户之间的相互“隔离” 8、Linux中的缺省权限 ​编辑 9…

uniapp对接极光推送,实现消息推送功能

通过集成JG-JPush和JG-JCore插件&#xff0c;可以在应用中添加消息推送功能&#xff0c;向用户发送通知、消息等。这对于提升用户体验、增加用户粘性非常有帮助‌。 效果图&#xff1a; 一、登录极光官网 官网链接&#xff1a;portalhttps://www.jiguang.cn/console/#/home点…

【3D Slicer】的小白入门使用指南八

3D Slicer DMRI(Diffusion MRI)-扩散磁共振认识和使用 0、简介 大脑解剖 ● 白质约占大脑的 45% ● 有髓神经纤维(大约10微米轴突直径) 白质探索 朱尔斯约瑟夫德杰林(Jules Joseph Dejerine,《神经中心解剖学》(巴黎,1890-1901):基于髓磷脂染色标本的神经解剖图谱)…

IP数据云 识别和分析tor、proxy等各类型代理

在网络上使用代理&#xff08;tor、proxy、relay等&#xff09;进行访问的目的是为了规避网络的限制、隐藏真实身份或进行其他的不正当行为。 对代理进行识别和分析可以防止恶意攻击、监控和防御僵尸网络和提高防火墙效率等&#xff0c;同时也可以对用户行为进行分析&#xff…

GPU分布式通信技术-PCle、NVLink、NVSwitch深度解析

GPU分布式通信技术-PCle、NVLink、NVSwitch 大模型时代已到来&#xff0c;成为AI核心驱动力。然而&#xff0c;训练大模型却面临巨大挑战&#xff1a;庞大的GPU资源需求和漫长的学习过程。 要实现跨多个 GPU 的模型训练&#xff0c;需要使用分布式通信和 NVLink。此外&#xf…

基于 PyTorch 从零手搓一个GPT Transformer 对话大模型

一、从零手实现 GPT Transformer 模型架构 近年来&#xff0c;大模型的发展势头迅猛&#xff0c;成为了人工智能领域的研究热点。大模型以其强大的语言理解和生成能力&#xff0c;在自然语言处理、机器翻译、文本生成等多个领域取得了显著的成果。但这些都离不开其背后的核心架…

数据集的重要性:如何构建AIGC训练集

文章目录 一、为什么数据集对AIGC如此重要&#xff1f;1. 数据决定模型的知识边界2. 数据质量直接影响生成效果3. 数据集多样性提升模型鲁棒性 二、构建AIGC训练集的关键步骤1. 明确目标任务和生成需求2. 数据源的选择3. 数据清洗与预处理4. 数据标注5. 数据增强 三、针对不同类…

全网首发:Ubuntu编译跨平台嵌入式支持ffmpeg的OpenCV

难题&#xff1a; 使用cmake编译&#xff0c;死活找不到ffmpeg 使用cmake-gui&#xff0c;能找到ffmpeg&#xff0c;不能编译。 解决思路 结合cmake和cmake-gui。 为了给初次编译的朋友一点方便&#xff0c;这里专门完整详细记录。 安装编译环境 其他的略。 apt -y in…

算法——两两交换链表中的节点(leetcode24)

这是一道对于链表节点进行操作的题目非常考验对于链表操作的基本功&#xff1b; 解法: 本题的解法结合下图来进一步解释 创建一个虚拟节点指向头结点以便使代码逻辑看起来更为简便且操作节点容易,定义cur是为了方便找到cur之后的两个节点进行交换操作定义pre和aft是为了保存执…

非对称加密算法RSA的实现

一、实验目的 1、了解非对称密码体制基本原理 2、掌握编程语言实现非对称加密、解密 二、实验原理 RSA加密算法是一种非对称加密算法&#xff0c;所谓非对称&#xff0c;就是指该算法加密和解密使用不同的密钥&#xff0c;即使用加密密钥进行加密、解密密钥进行解密。在RAS…