MyBatis之Mapper.xml文件中parameterType,resultType,resultMap的用法

news2024/10/6 12:19:57

MyBatis之自定义数据类型转换器

  • 前言
  • 1.parameterType
  • 2.resultType
  • 3.resultMap
  • 实例代码
  • 总结

前言

今天我们来学习Mapper.xml(编写SQL的)文件中,增删改查标签中,使用parameterType属性指定传递参数类型,resultType属性指定返回结果类型,resultMap标签完成当数据库表字段和Java实体类属性名或类型不一致时的手动映射,另外,SQL文中,where条件中只有一个参数时,推荐使用基本类型(int,short,char,byte,float,double,long,boolean)+String,当有多个参数时,使用Java实体类,接下来,我们来讲讲具体的用法。


1.parameterType

定义在增删改查标签中的属性,指定SQL文中where条件的参数类型,可以是基本数据类型(8个)+String+对象类型
例如,根据id查询name,如果数据库中定义的字段id是int类型,就可以指定parameterType的属性值是int,可以参看下边的代码。

< select id=“queryPersonNameById” parameterType=“int” resultType=“String”>

常用类型也可以参看下表
在这里插入图片描述

2.resultType

也是定义在增删改查标签中的属性,用于指定查询结果或增删改执行结果的类型,同样可以是基本数据类型+String+对象类型,这里需要注意的是,当查询结果是多条时,无需写List,MyBatis底层会自动为我们生成List<数据类型>,我们只需指定类型即可。
同样是上边的例子,根据id查询name,name在数据库中是varchar类型,resultType就指定成String类型,类型不区分大小写,尽量保持和Java一致,使用大写。

< select id=“queryPersonNameById” parameterType=“int” resultType=“String”>

3.resultMap

当实体类的属性名和数据库表字段名或类型不一致时使用
例如,Person表中,定义的字段是id和name
Java实体类中,定义的是pid和pname,这种情况下,使用resultMap手动完成数据库和Java实体类属性的映射。
它是单独的< resultMap>标签,定义id,通常使用在查询标签中
例如下边的代码
id标签完成数据库主键的映射
result标签完成数据库非主键字段的映射
property属性指定java实体类中的属性名,column是数据库字段名

<?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="xxx.xxx.mapper.PersonMapper">
  <resultMap type="person" id="personMapping">
  	<id property="pid" column="id"/>
  	<result property="pname" column="name"/>
  	<result property="age" column="age"/>
  	<result property="sex" column="sex"/>
  </resultMap>

  <select id="queryAllPersonUseResultMap" resultMap="personMapping">
    select * from person
  </select>

</mapper>

resultMap常用在数据库表字段和Java实体类类型不一致时,进行手动映射,
通常项目中使用别名的形式,进行映射
例如,下边实例代码中,pid和pname是id和name的别名,MyBatis会自动为我们完成Java实体类映射

<?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="xxx.xxx.mapper.PersonMapper">

  <select id="queryAllPerson" resultType="person">
    select id pid, name pname, age, sex from person
  </select>

</mapper>

实例代码

PersonMapper.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">
<mapper namespace="xxx.xxx.mapper.PersonMapper">

  <resultMap type="person" id="personMapping">
  	<id property="pid" column="id"/>
  	<result property="pname" column="name"/>
  	<result property="age" column="age"/>
  	<result property="sex" column="sex" javaType="boolean" jdbcType="INTEGER"/>
  </resultMap>
  <select id="queryPersonNameById" parameterType="int" resultType="string">
    select name pname from person where id = #{id}
  </select>
  <select id="queryPersonCount" resultType="int">
    select count(1) from person
  </select>
  <select id="queryAllPerson" resultType="person">
    select id pid, name pname, age, sex from person
  </select>
  <select id="queryAllPersonUseResultMap" resultMap="personMapping">
    select * from person
  </select>

</mapper>

PersonMapper.java代码如下:

package xxx.xxx.mapper;

import java.util.List;

import xxx.xxx.pojo.Person;

public interface PersonMapper {

	public List<Person> queryAllPersonUseResultMap();

	public List<Person> queryAllPerson();

	public int queryPersonCount();

	public String queryPersonNameById(int id);

}

Person.java(实体类)代码如下:

package xxx.xxx.pojo;

public class Person {

	private int pid;
	private String pname;
	private int age;
	private boolean sex;

	public Person() {
	}

	public Person(int pid, String pname, int age, boolean sex) {
		this.pid = pid;
		this.pname = pname;
		this.age = age;
		this.sex = sex;
	}

	public int getPid() {
		return pid;
	}

	public void setPid(int pid) {
		this.pid = pid;
	}

	public String getPname() {
		return pname;
	}

	public void setName(String pname) {
		this.pname = pname;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public boolean isSex() {
		return sex;
	}

	public void setSex(boolean sex) {
		this.sex = sex;
	}

	@Override
	public String toString() {
		return "Person [pid=" + pid + ", pname=" + pname + ", age=" + age + ", sex=" + sex + "]";
	}

}

测试代码如下:

package xxx.xxx.test;

import java.io.IOException;
import java.io.Reader;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import xxx.xxx.mapper.PersonMapper;
import xxx.xxx.pojo.Person;

public class TestMyBatis {

	public static void main(String[] args) throws IOException {

//		queryAllPersonUseResultMap();
//		queryAllPerson();
//		queryPersonCount();
		queryPersonNameById();
	}

	public static void queryAllPersonUseResultMap() throws IOException {

		// 1.读取MyBatis配置文件
		Reader reader = Resources.getResourceAsReader("mybatis-config.xml");

		// 2.实例化SqlSessionFactory
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

		// 3.实例化SqlSession
		try (SqlSession session = sqlSessionFactory.openSession()) {

			// 4.获取PersonMapper接口
			PersonMapper personMapper = session.getMapper(PersonMapper.class);

			// 5.执行SQL
			List<Person> persons = personMapper.queryAllPersonUseResultMap();
			persons.forEach(System.err::println);
		}

	}

	public static void queryAllPerson() throws IOException {

		// 1.读取MyBatis配置文件
		Reader reader = Resources.getResourceAsReader("mybatis-config.xml");

		// 2.实例化SqlSessionFactory
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

		// 3.实例化SqlSession
		try (SqlSession session = sqlSessionFactory.openSession()) {

			// 4.获取PersonMapper接口
			PersonMapper personMapper = session.getMapper(PersonMapper.class);

			// 5.执行SQL
			List<Person> persons = personMapper.queryAllPerson();
			persons.forEach(System.err::println);
		}

	}

	public static void queryPersonCount() throws IOException {

		// 1.读取MyBatis配置文件
		Reader reader = Resources.getResourceAsReader("mybatis-config.xml");

		// 2.实例化SqlSessionFactory
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

		// 3.实例化SqlSession
		try (SqlSession session = sqlSessionFactory.openSession()) {

			// 4.获取PersonMapper接口
			PersonMapper personMapper = session.getMapper(PersonMapper.class);

			// 5.执行SQL
			int count = personMapper.queryPersonCount();
			System.err.println(count);
		}

	}

	public static void queryPersonNameById() throws IOException {

		// 1.读取MyBatis配置文件
		Reader reader = Resources.getResourceAsReader("mybatis-config.xml");

		// 2.实例化SqlSessionFactory
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

		// 3.实例化SqlSession
		try (SqlSession session = sqlSessionFactory.openSession()) {

			// 4.获取PersonMapper接口
			PersonMapper personMapper = session.getMapper(PersonMapper.class);

			// 5.执行SQL
			String name = personMapper.queryPersonNameById(1);
			System.err.println(name);
		}

	}

}


总结

到这里,我们就掌握了Mapper.xml文件中parameterType,resultType,resultMap的用法,大家可以动手试试其他的类型转换,欢迎留言交流,下篇见。

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

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

相关文章

C# OpenCvSharp 利用白平衡技术进行图像修复

目录 效果 灰度世界(GrayworldWB)-白平衡算法 完美反射(SimpleWB)-白平衡算法 基于学习的(LearningBasedWB)-白平衡算法 代码 下载 C# OpenCvSharp 利用白平衡技术进行图像修复 OpenCV xphoto模块中提供了三种不同的白平衡算法&#xff0c;分别是&#xff1a;灰度世界(G…

Linux进一步研究权限-----------ACL使用

一、使用情况 1.1、场景: 某个大公司&#xff0c;在一个部门&#xff0c;有一个经理和手下有两个员工&#xff0c;在操控一个Linux项目,项目又分为三期做&#xff0c;然而一期比较重要&#xff0c;经理带着员工做完了&#xff0c;公司就觉得技术难点已经做完攻克了&#xff0…

npm install报错解决记录

npm install报错解决记录 常见错误类型 权限错误: EACCES: permission denied EPERM: operation not permitted网络错误: ECONNREFUSED: Connection refused ETIMEDOUT: connect ETIMEDOUT包解析错误: Cannot find module ‘xxx’ Error: No compatible version found编译错误…

飞行机器人专栏(十三)-- 智能优化算法之粒子群优化算法与多目标优化

一、理论基础 1.1 引言 粒子群优化算法&#xff08;Particle Swarm Optimization, PSO&#xff09;自1995年由Eberhart和Kennedy提出以来&#xff0c;已经成为解决优化问题的一种有效且广泛应用的方法。作为一种进化计算技术&#xff0c;PSO受到社会行为模式&#xff0c;特别是…

互联设备-中继器-路由器等

网卡的主要作用 1 在发送方 把从计算机系统要发送的数据转换成能在网线上传输的bit 流 。 2 在接收方 把从网线上接收来的 bit 流重组成计算机系统可以 处理的数据 。 3 判断数据是否是发给自己的 4 发送和控制计算机系统和网线数据流 计算机的分类 1、台式机 2、小型机和服…

【DDD】学习笔记-薪资管理系统的测试驱动开发

回顾薪资管理系统的设计建模 在 3-15 课&#xff0c;我们通过场景驱动设计完成了薪资管理系统的领域设计建模。既然场景驱动设计可以很好地与测试驱动开发融合在一起&#xff0c;因此根据场景驱动设计的成果来开展测试驱动开发&#xff0c;就是一个水到渠成的过程。让我们先来…

rem适配方案

目录 一&#xff0c;rem实际开发适配方案 二&#xff0c;rem适配方案技术使用&#xff08;市场主流&#xff09; 方案一&#xff1a; 方案二&#xff1a;​编辑 一&#xff0c;rem实际开发适配方案 ① 按照设计稿与设备宽度的比例&#xff0c;动态计算并设置html根标签的fo…

【自然语言处理-二-attention注意力 是什么】

自然语言处理二-attention 注意力机制 自然语言处理二-attention 注意力记忆能力回顾下RNN&#xff08;也包括LSTM GRU&#xff09;解决memory问题改进后基于attention注意力的modelmatch操作softmax操作softmax值与hidder layer的值做weight sum 计算和将计算出来的和作为memo…

Jetpack Compose 架构层

点击查看&#xff1a;Jetpack Compose 架构层 官网 本页面简要介绍了组成 Jetpack Compose 的架构层&#xff0c;以及这种设计所依据的核心原则。 Jetpack Compose 不是一个单体式项目&#xff1b;它由一些模块构建而成&#xff0c;这些模块组合在一起&#xff0c;构成了一个完…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的人脸表情识别系统(附完整资源+PySide6界面+训练代码)

摘要&#xff1a;本篇博客呈现了一种基于深度学习的人脸表情识别系统&#xff0c;并详细展示了其实现代码。系统采纳了领先的YOLOv8算法&#xff0c;并与YOLOv7、YOLOv6、YOLOv5等早期版本进行了比较&#xff0c;展示了其在图像、视频、实时视频流及批量文件中识别人脸表情的高…

【elementUi-table表格】 滚动条 新增监听事件; 滚动条滑动到指定位置;

1、给滚动条增加监听 this.dom this.$refs.tableRef.bodyWrapperthis.dom.scrollTop 0let _that thisthis.dom.addEventListener(scroll, () > {//获取元素的滚动距离let scrollTop _that.dom.scrollTop//获取元素可视区域的高度let clientHeight this.dom.clientHeigh…

springboot+vue项目基础开发(17)路由使用

路由 在前端中,路由指的是根据不同的访问路径,展示不同的内容 vue Router的vue.js的官方路由 安装vue Router 再启动 在src下面新建router文件,创建index.js 代码 import {createRouter,createWebHashHistory} from vue-router //导入组件 import Login from @/views/Log…

SparkSQL学习03-数据读取与存储

文章目录 1 数据的加载1.1 方式一&#xff1a;spark.read.format1.1.1读取json数据1.1.2 读取jdbc数据 1.2 方式二&#xff1a;spark.read.xxx1.2.1 读取json数据1.2.2 读取csv数据1.2.3 读取txt数据1.2.4 读取parquet数据1.2.5 读取orc数据1.2.6 读取jdbc数据 2 数据的保存2.1…

RT-Thread-快速入门-2-时钟与定时器

时钟与定时器 阅读须知 定义与作用 定义 系统时钟 系统时钟在RT-Thread中用于管理时间&#xff0c;为系统运行提供时间基准。系统时钟由硬件计时器&#xff08;通常是CPU的内部定时器或外部定时器&#xff09;提供时钟节拍&#xff0c;这些时钟节拍通常以固定频率中断CPU&#…

opengl 学习纹理

一.纹理是什么&#xff1f; 纹理是一个2D图片&#xff08;甚至也有1D和3D的纹理&#xff09;&#xff0c;它可以用来添加物体的细节&#xff1b;类似于图像一样&#xff0c;纹理也可以被用来储存大量的数据&#xff0c;这些数据可以发送到着色器上。 采样是指用纹理坐标来获取纹…

npm install 失败,需要node 切换到 对应版本号

npm install 失败 原本node 的版本号是16.9&#xff0c;就会报以上错误 node版本问题了&#xff0c;我切到这个版本&#xff0c;报同样的错。降一下node&#xff08;14.18&#xff09;版本就好了 具体的方法&#xff1a;&#xff08;需要在项目根目录下切换&#xff09; 1. …

微服务学习

一、服务注册发现 服务注册就是维护一个登记簿&#xff0c;它管理系统内所有的服务地址。当新的服务启动后&#xff0c;它会向登记簿交待自己的地址信息。服务的依赖方直接向登记簿要Service Provider地址就行了。当下用于服务注册的工具非常多ZooKeeper&#xff0c;Consul&am…

JavaScript从零写网站《一瞬》开发日志20240223

产品介绍 一个无需注册能随时发布图片并配一段文字介绍的app&#xff0c;有时间线&#xff0c;用户在主页面向下滑动&#xff0c;可以看到被发布的若干图片&#xff0c;并且能够在每一个发布处做基本互动——评论&#xff0c;点赞 编程语言 本产品使用htmlcssJavaScript开发…

【Docker】构建pytest-playwright镜像并验证

Dockerfile FROM ubuntu LABEL maintainer "langhuang521l63.com" ENV TZAsia/Shanghai #设置时区 #安装python3依赖与下载安装包 RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone \&& apt update \&&…

Linux——进程概念

目录 冯诺依曼体系结构 操作系统 管理 系统调用和库函数 进程的概念 进程控制块——PCB 查看进程 通过系统调用获取进程标示符 通过系统调用创建进程 进程状态 运行状态-R ​编辑 浅度睡眠状态-S 深度睡眠状态-D 暂停状态-T 死亡状态-X 僵尸状态-Z 僵尸进程…