【MyBatis】第四篇:浅聊resultType

news2024/12/25 10:27:44

前提

学生对象不会变如下:

package com.xzd.domain;

public class Student {
    Integer sid;
    String sname;
    int sage;
    String ssex;
    public Student() {
    }

    public Student(Integer sid, String sname, int sage, String ssex) {
        this.sid = sid;
        this.sname = sname;
        this.sage = sage;
        this.ssex = ssex;
    }

    public Integer getSid() {
        return sid;
    }

    public void setSid(Integer sid) {
        this.sid = sid;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public int getSage() {
        return sage;
    }

    public void setSage(int sage) {
        this.sage = sage;
    }

    public String getSsex() {
        return ssex;
    }

    public void setSsex(String ssex) {
        this.ssex = ssex;
    }

    @Override
    public String toString() {
        return "Student{" +
                "sid=" + sid +
                ", sname='" + sname + '\'' +
                ", sage=" + sage +
                ", ssex='" + ssex + '\'' +
                '}';
    }
}

数据库中的表和数据:

CREATE DATABASE /*!32312 IF NOT EXISTS*/`testmybatis` /*!40100 DEFAULT CHARACTER SET utf8mb3 */ /*!80016 DEFAULT ENCRYPTION='N' */;

USE `testmybatis`;

/*Table structure for table `student` */

DROP TABLE IF EXISTS `student`;

CREATE TABLE `student` (
  `s_id` int DEFAULT NULL,
  `sname` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
  `sage` int DEFAULT NULL,
  `ssex` varchar(2) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

/*Data for the table `student` */

insert  into `student`(`s_id`,`sname`,`sage`,`ssex`) values 

(1,'张三',18,'男'),

(2,'赛貂蝉',14,'女'),

(3,'胡铁花',23,'男'),

(4,'白飞飞',16,'女'),

(5,'李寻欢',16,'男'),

(4,'宫崎',18,'男');

对于查询,有时候返回的不一定是一个以定义对象类,所以也会返回不同的数据,如果处理,本篇就是简单的聊一些这个问题。主要是关键属性resultType。

返回对象

这个在前面演示的大都是返回的的是对象,所以就简单的说一下配置文件

  <select id="[包路径.]方法名" resultType="[包路径.]对象类">
 
    </select>

可以写完整的路径,或者在核心配置文件mybatis-config.xml使用typeAliases+package两个标签,加入包路径,直接写类名:

<typeAliases>
    <package name="对象类的包路径"/>
</typeAliases>

而方法的包路径可以如下写:

 <mappers>
  <package name="映射配置文件中id等于的方法包路径" ></package>
   </mappers>

如果不懂可以看下,核心配置文件的常用标签:传送阵

返回值是集合

比如返回的是多个对象呢,如下操作:

    <select id="getAllStudent" resultType="Student">
        SELECT sid,sname,sage,ssex FROM`testmybatis`.`student`
    </select>

在映射中如此:

public interface StudentMapper {
    List<Student> getAllStudent();
}

但是看配置文件的话,感觉其返回都是resultType=“Student” ,但是为什么返回的一个是对象,一个确实对象的list,其本质还是底层会通过接口返回的值进行判断而返回不同的数据。

所以看一下结果:

在这里插入图片描述

返回值(比如一共多少行)

有时候会通过聚合函数得到一个值,而这个值又不是对象属性值,如下操作。

    <select id="getStudentCount" resultType="java.lang.Integer">
        SELECT count(ssex)
        FROM `testmybatis`.`student`
    </select>

在映射中如此:

public interface StudentMapper {
    int getStudentCount();
}

然后运行程序:

在这里插入图片描述

可以看出因为反射回来的是一个数字所以类型用:java.lang.Integer

但是如果将resultType="java.lang.Integer"换成resultType="Integer"或resultType="int"运行结果一样,为什么会这样,其实看一下官网文档:

在这里插入图片描述

可以看出mybatis为了方便使用,其框架本身就些了一些别名,方便我们使用。可以通过别名来代替一些,可以如此从尝试:

补充

当然如果是对象也可以转换为map,比如这样

public interface StudentMapper {
    Map<String, String> getStudent(@Param("sid") String sid); 
}
  <select id="getStudent" resultType ="hashmap">
            SELECT sid,sname,sage,ssex FROM`testmybatis`.`student`  where sid=#{sid}
  </select>

在这里插入图片描述

这个可以看出一件事,那就是数据库返回的值,会自动将属性名作为map的key值。注意如果返回的某个值是null,那就不会放在map中。所以不是所有的属性值都会转换为map的key,也就是上面如果四个属性都有值,但是我只写三个,那就是map就含有三个key。

当然如果将映射文件写如下:

   <select id="getStudentByMap" resultType="hashmap">
        SELECT sid, sname, sage, ssex, COUNT(sid)
        FROM `testmybatis`.`student`
        WHERE sid = #{sid}
        GROUP BY sid, sname, sage, ssex
    </select>

如果是对象的话,可能无法得到了,这个时候需要resultType ="hashmap"来进行:

在这里插入图片描述

但是如果resultType ="Student"的话如下:

 <select id="getStudentByMap" resultType="Student">
        SELECT sid, sname, sage, ssex, COUNT(sid)
        FROM `testmybatis`.`student`
        WHERE sid = #{sid}
        GROUP BY sid, sname, sage, ssex
    </select>

那么就如上了:

在这里插入图片描述

因为Student中没有属性 COUNT(sid)这个值,所以无法得到这个值。

当然上面的例子返回的一条数据,如果是一个很多数据呢,其实很简单和返回,然后在映射类中如下下:

public interface StudentMapper {
    List<Map<String, String>> getStudent(@Param("sid") String sid); 
}

因为和返回对象集合类似,就不再演示了。

补充 注解@MapKey(“”)

这个时候如果返回的数据是一个集合的,如果非要用map进行保存,但是这个有一个问题,那就是如果单挑数据,可以同属性值作为key,但是一个大map保存所有数据得到的map,那么这个map的key值就需要用通过这个注解来实现,如下操作:

    @MapKey("sid")
    Map<String, Object> getStudent(@Param("sid") String sid);

也就是将属性sid作为key的值,演示如下:

在这里插入图片描述

处理数据库表列名与属性名无法匹配

一般的时候最理想的情况就是在创建表种的列名(字段)和java对象属性名。但是这个时候在开发过程种会有规范。

1:java开发中对象的属性名采用的是驼峰命名方式,比如:studentName
2:mysql中的列名(字段)名要求使用下划线(_),比如student_name

首先将表中的student中字段sid变为s_id,其它的不变。

然后映射接口:

public interface StudentMapper {
    Student getStudent(@Param("sid") String sid);
}    

映射文件如下:

   <select id="getStudent" resultType="Student">
        SELECT s_id, sname, sage, ssex
        FROM `testmybatis`.`student`
        WHERE s_id = #{sid}
    </select>

可以看结果:

在这里插入图片描述

当然不会报错,只不过是返回一个空值而已。

但是如果返回的map呢?

public interface StudentMapper {
      Map<String,String> getStudent(@Param("sid") String sid);
}   

当然如果使用接受数据的是map:

    <select id="getStudent" resultType="hashmap">
        SELECT s_id, sname, sage, ssex
        FROM `testmybatis`.`student`
        WHERE s_id = #{sid}
    </select>

在这里插入图片描述

如果返回的是map的话,就没有这个问题,因为从这个地方可以知道如果不是通过student接受数据而是map接受数据的话,其key值其实是字段名,而不一定是属性名。

通过sql中as 使用别名

当然还可以通过修改别名的方式也是可以的,也就是在sql语句中使用as修改别名,如果将其变成如下:

   <select id="getStudent" resultType="Student">
        SELECT s_id as sid, sname, sage, ssex
        FROM `testmybatis`.`student`
        WHERE s_id = #{sid}
    </select>

在这里插入图片描述

通过配置文件添加mapUnderscoreToCamelCase

但是如果字段很多的话,使用别名就有点麻烦了,所以可以通过配置文件来配置默认映射关系,将下划线和驼峰进行匹配:

在这里插入图片描述

在mybatis-config.xml添加如下配置信息:

      <setting name="mapUnderscoreToCamelCase" value="true"/>

然后还是通过上面的配置返回的

public interface StudentMapper { 
   Student getStudent(@Param("sid") String sid);
}    
    <select id="getStudent" resultType="Student">
        SELECT s_id, sname, sage, ssex
        FROM `testmybatis`.`student`
        WHERE s_id = #{sid}
    </select>

然后看得到结果:

在这里插入图片描述

使用resultMap

其实如果简单的这样说的话,可能有些懵,这个在resultType =“hashmap”,不就是返回一个map吗,为什么还要有这个属性名?

其实在IDE种输入会有提示如下:

在这里插入图片描述

这个如何使用呢?还是老规矩进行实例演示:

 <resultMap id="studentmap" type="Student">
        <id column="s_id" property="sid"></id>
        <result column="sname" property="sname"></result>
        <result column="sage" property="sage"></result>
        <result column="ssex" property="ssex"></result>

    </resultMap>

    <select id="getStudent" resultMap="studentmap">
        SELECT s_id, sname, sage, ssex
        FROM `testmybatis`.`student`
        WHERE s_id = #{sid}
    </select>

在这里插入图片描述

如果resultMap只是为了解决这个数据库列名(字段)那就是有的太简单了还有后面标签的意义,这个后面再聊。

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

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

相关文章

如何把图片转换成word文档?说一个转换途径

我们时常需要将图片上的文字资料归纳整理下来&#xff0c;转成Word文档的形式会方便很多&#xff0c;下面给大家介绍一下如何把图片转换成word文档&#xff0c;有多种方式&#xff0c;咱们自由选择。方式一、直接添加图片转换成Word这种方式非常简单&#xff0c;我们打开Word或…

校园IP网络广播系统方案

北京恒星科通发布于2023-2-2 一、校园IP网络广播系统概述 校园I P网络广播系统&#xff0c;是构建在当前广泛使用的TCP/IP通讯网络基础上的新一代交互式公共广播系统。系统采用分布式服务器架构&#xff0c;容量可以根据需要不断扩展&#xff0c;可以在局域网或者广域网内运行…

21-死锁的解除及银行家算法

预防死锁 不允许死锁的发生 静态策略:预防思索 破坏互斥条件 如果能把互斥使用的资源改造为允许共享使用,则系统不会进入死锁状态,比如SPOOLing技术,操作系统可以采用SPOOLing技术把独占设备在逻辑上改造为共享设备。 使用了SPOOLing技术后,在各进程看来,自己对打印机资源的…

2023年java面试常考知识点(12题)

一. 接⼝与抽象类区别 1、⼀个类声明可否既是abstract的,⼜是final的? 不能,这两个修式符⽭盾&#xff08;abstract就是要被继承&#xff09; 2、抽象类不⼀定包含抽象⽅法 3、有抽象⽅法,则⼀定是抽象类 4、抽象类不能被实例化&#xff0c;⼀般⽤作基类使⽤&#xff1b; a. 类…

数学建模比赛超全整理【数学建模有哪些比赛?】【全网最全数模整理】

文章目录一.全国大学生数学建模竞赛二.美国大学生数学建模竞赛三、中国研究生数学建模竞赛四、认证杯&#xff08;小美赛&#xff09;五、华数杯&#xff08;国内赛和国际赛&#xff09;六.MathorCup高校数学建模挑战赛七.全国大学生电工数学建模竞赛八.深圳杯九.数维杯大学生数…

用vue3+vant4开发的简单小众电商购物项目模板(纯前端)

简单录制如下 主要练习下界面和交互&#xff0c;顺带简单了解下 vue3 语法。 简单截图如下 首页 首页-猜你喜欢 分类 购物车 个人页面 部分文件代码 底部导航文件 <template><div class"nav" id"myNav"><divclass"nav-item-box"v…

Oracle VM VirtualBox  VMware下载使用教程

一、Oracle VM VirtualBox 使用教程官网&#xff08;https://www.virtualbox.org/wiki/Downloads&#xff09;下载安装包&#xff0c;此处选择下载的为windows版本点击安装包&#xff0c;进行安装新建虚拟机name&#xff1a;自定义虚拟机名称Folder&#xff1a;安装文件夹ISO I…

postgres源码解析48 Btree节点分裂点确认流程--1

由于Btree数据结构特性&#xff0c;当节点达到上溢条件时会发生分裂&#xff0c;进而保持Btree的原本特性 B树 详解及C语言简单实现&#xff0c;在之前的postgres 源码解析 45 btree分裂流程_bt_split已对分裂流程进行讲解&#xff0c;接下来将从源码角度学习postgres btree分裂…

揭密Realtek 致命漏洞:超过 1 亿次尝试破解物联网设备

国际知名白帽黑客、东方联盟创始人郭盛华警告说&#xff0c;自 2022 年 8 月开始&#xff0c;利用 Realtek Jungle SDK 中现已修补的关键远程代码执行漏洞进行攻击的攻击企图激增。 据郭盛华透露&#xff0c;截至 2022 年 12 月&#xff0c;正在进行的活动据称已记录了 1.34 亿…

前端sdk - 埋点

目录前端sdk 之小满np安装01 搭建环境01-项目目录01-2 依赖包01-3 rollup.config.js01-4 tsconfig.json 28行01-5 package.json01-6 src / core / index.ts01-7打包效果02 初始化 Tracher02-1 core / index.ts02-2 types/ index.ts03 重写history事件 监听history | hash 路由等…

【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战

文章目录前言I、微服务与Spring CloudII、Nacos 注册中心III、Spring Cloud Alibaba Nacos 实战1、新建父工程2、新建demo-a 服务3、新建 demo-b 服务4、实现服务调用&#xff1a;传统方式5、实现服务调用&#xff1a;NacosRibbon方式总结最后前言 Spring Cloud Alibaba微服务…

JS 设计模式(2)-- 复习

目录 策列模式 代理模式 观察者模式 发布订阅模式 模块模式 策列模式 策略模式定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使他们可以相互替换&#xff0c;且算法的变化不会影响使用算法的用户&#xff0c;策列模式属于对象行为模式&#xff0c;它通过…

Java面试题(自用-持续更新)

本文目录如下&#xff1a;Java面试题一、基础知识JDK 和 JRE 有什么区别&#xff1f;String 属于基础的数据类型吗&#xff1f;基础类型有哪些?String str"xqz"与 String strnew String("xqz")一样吗&#xff1f;java 中操作字符串都有哪些类&#xff1f;…

王佩丰 Excel 基础24讲 | 学习笔记(全)

第一讲&#xff1a;认识Excel 1.简介 excel能做什么&#xff1f; 数据存储 → 数据处理 → 数据分析 → 数据呈现 excel界面 补充&#xff1a;Excel数据分析步骤 ①提出问题&#xff1a;明确自己需要通过数据分析解决什么问题 ②理解数据&#xff1a;理解数据各个字段的含义…

【手写 Promise 源码】第十五篇 - 了解 generator 生成器

一&#xff0c;前言 上一篇&#xff0c;实现了 promisify 和应用场景介绍&#xff0c;主要涉及以下几个点&#xff1a; promisify 简介和测试&#xff1b;promisify 功能的实现&#xff1a;promisify、promisifyAll&#xff1b; 目前&#xff0c;Promise 部分已基本完成&…

FPGA实现图像任意位置显示,串口协议控制显示位置,提供工程源码和技术支持

目录1、图像任意位置显示理论基础2、设计思路和架构3、OV5640图像采集4、图像DDR3三帧缓存5、图像任意位置输出显示6、串口协议控制显示位置7、vivado工程介绍8、上板调试验证9、福利&#xff1a;工程源码获取1、图像任意位置显示理论基础 图像任意位置显示指的是在显示屏上的…

Linux新手渣渣上路史

时至2022年&#xff0c;IT行业的迅速发展大家也有目共睹&#xff0c;IT行业在社会的发展中起着举足轻重的作用。其中一角Linux系统&#xff0c;从诞生到开源&#xff0c;再到现在受大众的欢迎&#xff0c;是一个很好的例子。Linux和windows类似&#xff0c;是一个操作系统&…

java 微服务高级之分布式事务 Seata框架 CAP定理 BASE理论 XA模式 AT模式 TCC模式 SAGA模式

分布式事务问题 1.1.本地事务 1.2.分布式事务 一旦有一个失败了&#xff0c;其他两个不知情失败的情况&#xff0c;还是执行并成功 在分布式系统下&#xff0c;一个业务跨越多个服务或数据源&#xff0c;每个服务都是一个分支事务&#xff0c;要保证所有分支事务最终状态一致…

【JavaEE】线程安全的集合类

引言 在Java标准库中&#xff0c;大部分集合类都是线程不安全的。Vector(比ArrayList多了同步化机制就变得线程安全了)&#xff1b;Stack(继承Vector)&#xff1b;Hashtable(只比Hashmap多了线程安全)&#xff1b;以Concurrent开头的集合类&#xff1a;ConcurrentHashMap、Con…

Echarts 用图形纹理来填充颜色(color - pattern)

第006个点击查看专栏目录在上一篇文章中已经讲过 ECharts线性渐变色示例演示&#xff08;2种渐变方式&#xff09;&#xff0c;这个示例的颜色使用纹理来做填充&#xff0c;纹理填充&#xff1a; pattern color:{ //纹理填充 image: patternImg, repeat: ‘repeat’ } 示例效果…