每日五道java面试题之mybatis篇(五)

在这里插入图片描述

目录:

  • 第一题. 实体类属性名和表中字段名不⼀样 ,怎么办?
  • 第二题. Mybatis是否可以映射Enum枚举类?
  • 第三题. Mybatis能执⾏⼀对⼀、⼀对多的关联查询吗?
  • 第四题. Mybatis是否⽀持延迟加载?原理?
  • 第五题. 如何获取⽣成的主键?

第一题. 实体类属性名和表中字段名不⼀样 ,怎么办?

第1种: 通过在查询的SQL语句中定义字段名的别名,让字段名的别名和实体类的属性名⼀致。

<select id="getOrder" parameterType="int" resultType="com.jourwon.pojo.Order">select order_id id, order_no orderno ,order_price price form orders where
order_id=#{id};
</select>

第2种: 通过resultMap 中的来映射字段名和实体类属性名的⼀⼀对应的关系。

<select id="getOrder" parameterType="int" resultMap="orderResultMap">select * from orders where order_id=#{id}
</select>
<resultMap type="com.jourwon.pojo.Order" id="orderResultMap"><!–⽤id属性来映射主键字段–><id property="id" column="order_id"><!–⽤result属性来映射⾮主键字段,property为实体类属性名,column为数据库表中的属性–><result property ="orderno" column ="order_no"/><result property="price" column="order_price" />
</resultMap>

第二题. Mybatis是否可以映射Enum枚举类?

  • Mybatis当然可以映射枚举类,不单可以映射枚举类,Mybatis可以映射任何对象到表的⼀列上。映射⽅式为⾃定义⼀个TypeHandler,实现TypeHandler的setParameter()和getResult()接⼝⽅法。
  • TypeHandler有两个作⽤,⼀是完成从javaType⾄jdbcType的转换,⼆是完成jdbcType⾄javaType的转换,体现为setParameter()和getResult()两个⽅法,分别代表设置sql问号占位符参数和获取列查询结果。

第三题. Mybatis能执⾏⼀对⼀、⼀对多的关联查询吗?

当然可以,不⽌⽀持⼀对⼀、⼀对多的关联查询,还⽀持多对多、多对⼀的关联查询。
⼀对⼀ < association>
⽐如订单和⽀付是⼀对⼀的关系,这种关联的实现:
实体类:

public class Order {private Integer orderId;private String orderDesc;/*** ⽀付对象*/private Pay pay;//……
}

结果映射

<!-- 订单resultMap -->
<resultMap id="peopleResultMap" type="cn.fighter3.entity.Order"><id property="orderId" column="order_id" /><result property="orderDesc" column="order_desc"/><!--⼀对⼀结果映射--><association property="pay" javaType="cn.fighter3.entity.Pay"><id column="payId" property="pay_id"/><result column="account" property="account"/></association>
</resultMap>

查询就是普通的关联查

<select id="getTeacher" resultMap="getTeacherMap" parameterType="int">select * from order oleft join pay p on o.order_id=p.order_idwhere o.order_id=#{orderId}
</select>

⼀对多 < collection>
⽐如商品分类和商品,是⼀对多的关系。

实体类

public class Category {private int categoryId;private String categoryName;/*** 商品列表**/List<Product> products;//……
}

结果映射

<resultMap type="Category" id="categoryBean"><id column="categoryId" property="category_id" /><result column="categoryName" property="category_name" /><!-- ⼀对多的关系 --><!-- property: 指的是集合属性的值, ofType:指的是集合中元素的类型 --><collection property="products" ofType="Product"><id column="product_id" property="productId" /><result column="productName" property="productName" /><result column="price" property="price" /></collection>
</resultMap>

查询
查询就是⼀个普通的关联查询

<!-- 关联查询分类和产品表 -->
<select id="listCategory" resultMap="categoryBean">select c.*, p.* from category_ c left join product_ p on c.id = p.cid
</select>

多对一关系映射

在多对一关系中,一个实体对象可以关联到另一个实体对象,但是另一个实体对象只能关联到一个实体对象。比如,订单(Order)和客户(Customer)之间的关系。
实体类:

public class Order {private int orderId;private String orderName;private Customer customer;// getters and setters
}public class Customer {private int customerId;private String customerName;// getters and setters
}

结果映射:

<resultMap type="Order" id="orderResultMap"><id property="orderId" column="order_id"/><result property="orderName" column="order_name"/><!-- 多对一关系 --><association property="customer" javaType="Customer"><id property="customerId" column="customer_id"/><result property="customerName" column="customer_name"/></association>
</resultMap>

多对多关系映射

在多对多关系中,一个实体对象可以关联到多个另一个实体对象,反之亦然。比如,学生(Student)和课程(Course)之间的关系。

实体类:

public class Student {private int studentId;private String studentName;private List<Course> courses;// getters and setters
}public class Course {private int courseId;private String courseName;private List<Student> students;// getters and setters
}

结果映射:

<resultMap type="Student" id="studentResultMap"><id property="studentId" column="student_id"/><result property="studentName" column="student_name"/><!-- 多对多关系 --><collection property="courses" ofType="Course"><id property="courseId" column="course_id"/><result property="courseName" column="course_name"/></collection>
</resultMap><resultMap type="Course" id="courseResultMap"><id property="courseId" column="course_id"/><result property="courseName" column="course_name"/><!-- 多对多关系 --><collection property="students" ofType="Student"><id property="studentId" column="student_id"/><result property="studentName" column="student_name"/></collection>
</resultMap>

第四题. Mybatis是否⽀持延迟加载?原理?

  • Mybatis⽀持association关联对象和collection关联集合对象的延迟加载,association指的就是⼀对⼀,collection指的就是⼀对多查询。在Mybatis配置⽂件中,可以配置是否启⽤延迟加载lazyLoadingEnabled=true|false。
  • 它的原理是,使⽤CGLIB创建⽬标对象的代理对象,当调⽤⽬标⽅法时,进⼊拦截器⽅法,⽐如调⽤a.getB().getName(),拦截器invoke()⽅法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调⽤a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()⽅法的调⽤。这就是延迟加载的基本原理。
  • 当然了,不光是Mybatis,⼏乎所有的包括Hibernate,⽀持延迟加载的原理都是⼀样的。

第五题. 如何获取⽣成的主键?

新增标签中添加:keyProperty=" ID " 即可

<insert id="insert" useGeneratedKeys="true" keyProperty="userId" >insert into user(user_name, user_password, create_time)values(#{userName}, #{userPassword} , #{createTime, jdbcType= TIMESTAMP})
</insert>

这时候就可以完成回填主键

mapper.insert(user);
user.getId;

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力
在这里插入图片描述

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

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

相关文章

每日三个JAVA经典面试题(十七)

1.Java 中的线程池是如何实现的 Java中的线程池主要通过java.util.concurrent包提供的Executor框架实现。线程池的核心是重用一组现有线程来执行任务&#xff0c;而不是为每个任务创建新线程。这样做可以减少因频繁创建和销毁线程带来的开销&#xff0c;提高系统资源的利用率&…

Android逆向(二)-系统调试开关

Android逆向(二)-系统调试开关 本篇文章主要介绍下android下的系统调试开关. 1: build.prop简介 android中有一些常用的配置信息都存放在一个文件中,如:设备系统/版本号/Cpu等信息. 而这个文件就是/system/build.prop 我们先简单看下这个文件: zhzh:~/workSpace$ adb she…

【项目实践day06】JWT令牌相关

什么是JWT 简洁的、自包含的格式&#xff0c;用于在通信双方以json数据格式安全的传输信息。 由于数字签名的存在&#xff0c;这些信息是可靠的。 jwt就是将原始的json数据格式进行了安全的封装&#xff0c;这样就可以直接基于jwt在通信双方安全的进行信息传输了。简洁&#…

Playwright中locator() 方法快速定位网页元素[全面总结]

Playwright 是一个用于浏览器自动化的库&#xff0c;它支持多种浏览器和多种语言。在 Playwright 中&#xff0c;page.locator() 方法用于创建一个元素定位器&#xff08;Element Locator&#xff09;。元素定位器是一个强大的工具&#xff0c;可以帮助你在页面上找到并操作元素…

【前端基础】什么是视口?

视口 了解视口相关概念及理想视口的设置 是移动Web开发非常重要环节。 什么是视口&#xff1f; 视口简单来说就是浏览器显示页面内容的区域。 在PC端&#xff0c;正常的视口宽度就是整个浏览器的窗口可视区的宽度&#xff0c;会随着浏览器窗口大小的重置而缩放&#xff1b;…

CTF 题型 SSRF攻击例题总结

CTF 题型 SSRF攻击&例题总结 文章目录 CTF 题型 SSRF攻击&例题总结Server-side Request Forgery 服务端请求伪造SSRF的利用面1 任意文件读取 前提是知道要读取的文件名2 探测内网资源3 使用gopher协议扩展攻击面Gopher协议 &#xff08;注意是70端口&#xff09;python…

前端项目,个人笔记(五)【图片懒加载 + 路由配置 + 面包屑 + 路由行为修改】

目录 1、图片懒加载 步骤一&#xff1a;自定义全局指令 步骤二&#xff1a;代码中使用 ​编辑步骤三&#xff1a;效果查看 步骤四&#xff1a;代码优化 2、封装组件案例-传对象 3、路由配置——tab标签 4、根据tab标签添加面包屑 4.1、实现 4.2、bug&#xff1a;需要…

智能合约 之 部署ERC-20

Remix介绍 Remix是一个由以太坊社区开发的在线集成开发环境&#xff08;IDE&#xff09;&#xff0c;旨在帮助开发者编写、测试和部署以太坊智能合约。它提供了一个简单易用的界面&#xff0c;使得开发者可以在浏览器中直接进行智能合约的开发&#xff0c;而无需安装任何额外的…

进销存管理完整方案:那些让人头疼的进销存难题及解决方法!

什么是进销存管理&#xff1f;为何进销存管理在企业管理中如此重要&#xff1f;进销存管理的核心模块包括哪些&#xff1f;为何企业在进销存管理中常常遭遇前后方协作不畅、数据不同步等痛点&#xff1f;又该如何针对进销存管理痛点进行优化&#xff1f;本文将从进销存管理的基…

代码随想录训练营第50天 | LeetCode 123.买卖股票的最佳时机III、LeetCode 188.买卖股票的最佳时机IV

LeetCode 123.买卖股票的最佳时机III 文章讲解&#xff1a;代码随想录(programmercarl.com) 视频讲解&#xff1a;动态规划&#xff0c;股票至多买卖两次&#xff0c;怎么求&#xff1f; | LeetCode&#xff1a;123.买卖股票最佳时机III_哔哩哔哩_bilibili 思路 代码如下&am…

java实现kml文件下载接口

根据业务需求&#xff0c;需提供一个下载kml格式航线文件的HTTP GET接口 示例代码 package com.kyrielx.kmzdemo.controller;import org.apache.commons.io.FileUtils; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org…

git是什么git能做什么

git是什么 git 是一个免费、开源、分布式的版本控制系统&#xff0c;跟踪个人和团队在项目上协作时的变更历史。随着开发者对项目进行更改&#xff0c;可以随时恢复项目的任何早期版本。 git能做什么 开发者可以通过git查看项目历史&#xff0c;了解&#xff1a; - 做了哪些…

5.首页搜索与瀑布流

搜索栏 官网 https://vkuviewdoc.fsq.pub/components/search.html 是否开启右边控件 该控件为类似按钮形式&#xff0c;可以设置为"搜索"或者"取消"等内容&#xff0c;如果开启动画效果&#xff0c;用户确认搜索后&#xff0c;该控件会自动消失 show-ac…

各种窗函数对脉压结果的影响

雷达导论专栏总目录链接: 雷达导论专栏总目录-CSDN博客 1. 各类窗函数 有几个窗函数的系数可配,配置如下: tukeywin(N,0.75)kaiser(N,2.5)gausswin(N,1.5)taylorwin(N,3,-24)2. 时域加窗 时域加窗时,直接加在匹配滤波函数上:Htw=exp(1j*pi*K*tp.^2).*win;。那么矩形窗就相…

使用jQuery的autocomplete实现数据查询一次,联想自动补全

书接上回&#xff0c;上次说到在jsp页面中&#xff0c;通过监听输入框的数值变化&#xff0c;实时查询数据库&#xff0c;得到返回值使用autocomplete属性自动补全&#xff0c;实现一个联想补全辅助操作&#xff0c;链接&#xff1a;使用jquery的autocomplete属性实现联想补全操…

73_Pandas获取分位数/百分位数

73_Pandas获取分位数/百分位数 使用 quantile() 方法获取 pandas 中 DataFrame 或 Series 的分位数/百分位数。 目录 Quantile() 的基本用法指定要获取的分位数/百分位数&#xff1a;参数 q指定interpolation方法&#xff1a;参数interpolation 数据类型 dtype 的差异 指定行…

二、Kubernetes(k8s)中部署项目wordpress(php博客项目,数据库mysql)

前期准备 1、关机顺序 2、开机顺序 (1)、k8s-ha1、k8s-ha2 (2)、master01、master02、master03 (3)、node01、node02 一、集群服务对外提供访问&#xff0c;需要通过Ingress代理发布域名 mast01上传 ingress-nginx.yaml node01、node02 上传 ingress-nginx.tar 、kube-webh…

鸿蒙开发实战:【网络管理-Socket连接】

介绍 本示例主要演示了Socket在网络通信方面的应用&#xff0c;展示了Socket在两端设备的连接验证、聊天通信方面的应用。 效果预览 使用说明 1.打开应用&#xff0c;点击用户文本框选择要登录的用户&#xff0c;并输入另一个设备的IP地址&#xff0c;点击确定按钮进入已登录…

【C++】用红黑树模拟实现set、map

目录 前言及准备&#xff1a;一、红黑树接口1.1 begin1.2 end1.3 查找1.4 插入1.5 左单旋和右单旋 二、树形迭代器&#xff08;正向&#xff09;2.1 前置 三、模拟实现set四、模拟实现map 前言及准备&#xff1a; set、map的底层结构是红黑树&#xff0c;它们的函数通过调用红…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Toggle)

组件提供勾选框样式、状态按钮样式及开关样式。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 仅当ToggleType为Button时可包含子组件。 接口 Toggle(options: { type: ToggleType, is…