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

news2025/2/24 12:35:19

在这里插入图片描述

目录:

  • 第一题. 实体类属性名和表中字段名不⼀样 ,怎么办?
  • 第二题. 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 o
 left join pay p on o.order_id=p.order_id
 where 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.coloradmin.cn/o/1529187.html

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

相关文章

SAP HCM 读取上月考勤结果

转移前一期间都是累计读取上一个月de 数据&#xff0c;例如现在是4月&#xff0c;系统就会读取123月的累计 如果想只读取上个月的数据&#xff0c;就要设置前一期期间余额 因为一月只有31天 现在看3月 因为二月只有29天 2004年

软件设计师18--IO管理软件

软件设计师18--IO管理软件 考点1&#xff1a;IO管理软件例题&#xff1a; 考点1&#xff1a;IO管理软件 例题&#xff1a; 1、I/O设备管理软件一般分为4个层次&#xff0c;如下图所示。图中①②③分别对应(D&#xff09;。 A、设备驱动程序、虚设备管理、与设备无关的系统软件…

Java13_反转字符串中的单词 III(方法二String转换成字符数组)

反转字符串中的单词 III 给定一个字符串 s &#xff0c;你需要反转字符串中每个单词的字符顺序&#xff0c;同时仍保留空格和单词的初始顺序。 示例 1&#xff1a; 输入&#xff1a;s "Lets take LeetCode contest" 输出&#xff1a;"steL ekat edoCteeL tset…

退休人员档案管理系统

退休人员档案管理系统是一种用于管理退休人员档案信息的软件系统。该系统可以实现退休人员档案的录入、查询、修改、删除和统计等功能&#xff0c;方便管理人员对退休人员档案信息进行有效管理。 玖拓智能退休人员档案管理系统可以通过录入退休人员的个人信息、退休时间、退休单…

循环链表的用法

7.设 数 组 data[m] 作 为 循 环 队 列 SQ 的 存 储 空 间 &#xff0c;front 为 队 头 指 针 &#xff0c;rear 为 队 尾 指 针 &#xff0c;则 执 行 出 队 操 作 后 其 头 指 针 front 值 为 &#xff08; &#xff09; A&#xff0e;frontfront1 B&#xff0e;front(front1…

MyBatis是纸老虎吗?(三)

上篇文章——《MyBatis是纸老虎吗&#xff1f;&#xff08;二&#xff09;》——梳理了MyBatis的执行流程&#xff0c;这篇文章想详细聊聊MyBatis的解析过程。当我把这个想法讲个同事时&#xff0c;他不可置信的说道&#xff1a;“这有什么好梳理的&#xff1f;难道你要介绍xml…

腾讯春招后端一面(算法篇)

前言&#xff1a; 哈喽大家好&#xff0c;前段时间在小红书和牛客上发了面试的经验贴&#xff0c;很多同学留言问算法的具体解法&#xff0c;今天就详细写个帖子回复大家。 因为csdn是写的比较详细&#xff0c;所以更新比较慢&#xff0c;大家见谅~~ 就题目而言&#xff0c;…

实现:mysql-5.7.42 到 mysql-8.2.0 的升级(二进制方式)

实现&#xff1a;mysql-5.7.42 到 mysql-8.2.0 的升级&#xff08;二进制方式&#xff09; 1、操作环境1、查看当前数据库版本2、操作系统版本3、查看 Linux 系统上的 glibc&#xff08;GNU C 库&#xff09;版本&#xff08;**这里很重要&#xff0c;要下载对应的内核mysql版本…

深入探讨医保购药APP的技术架构与设计思路

随着移动互联网的发展&#xff0c;医疗保健行业也迎来了数字化转型的浪潮。医保购药APP作为医保体系数字化的一部分&#xff0c;其技术架构和设计思路至关重要。接下来&#xff0c;小编将为您讲解医保购药APP的技术架构与设计思路&#xff0c;为相关从业者提供参考和启发。 一、…

蓝桥杯第642题——跳蚱蜢

题目描述 如下图所示&#xff1a; 有 9 只盘子&#xff0c;排成 1 个圆圈。 其中 8 只盘子内装着 8 只蚱蜢&#xff0c;有一个是空盘。 我们把这些蚱蜢顺时针编号为 1 ~ 8。 每只蚱蜢都可以跳到相邻的空盘中&#xff0c; 也可以再用点力&#xff0c;越过一个相邻的蚱蜢跳到空盘…

【Maven入门篇】(3)依赖配置,依赖传递,依赖范围,生命周期

&#x1f38a;专栏【Maven入门篇】 &#xfeff;> &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#xfeff;> &#x1f386;音乐分享【The truth that you leave】 &#xfeff;> &#x1f970;欢迎并且感谢大家指出我的问题 文章目录 &…

Spring之@Value注解

前言 Value注解在Spring的依赖注入中占据重要地位,这里对Value注解的作用进行演示以及扩展 作用 注入字符串注入属性注入bean其他 代码准备 创建两个普通的bean Component public class ValueComponent { } Component public class Foo {private String sign;public Foo…

算法——位运算(一篇搞定)

本专栏为大家分享本人学习算法遇到的不同类型的题目以及解析! 此篇文章给大家分享一些关于位运算算法的题目,在开篇还讲述了常见位运算的公式以及题目,如果对您有帮助,麻烦点个关注,如有错误,请您指出! 1.常见位运算总结(包含5道题目) 1.1基础位运算 运算符操作<<左移&…

Google XSS Game Level 6 通关方式

文章目录 链接&#xff1a;[Google XSS Game](#https://xss-game.appspot.com/)Level 6 - Follow the &#x1f407;思路1 &#xff08;当然&#xff0c;我使用这个方式没有成功&#xff0c;所以才来记录下&#xff09;解法2 【最简单的解法】需要注意的一个小问题 链接&#x…

卡特兰数的部分解析(1)

直接开始 关于卡特兰数有三个公式 这里会解析一下第二个公式的含义 直接上公式 C n C 2 n n − C 2 n n − 1 或者是 C n C 2 n n − C 2 n n 1 C_n C_{2n}^n - C_{2n}^{n-1} 或者是 C_n C_{2n}^n - C_{2n}^{n1} Cn​C2nn​−C2nn−1​或者是Cn​C2nn​−C2nn1​ 解析…

网络编程—DAY5

select实现的TCP并发服务器 #include <myhead.h> #define SER_PORT 8888 #define SER_IP "192.168.117.96"int main(int argc, const char *argv[]) {int sfd -1;sfd socket(AF_INET,SOCK_STREAM,0);if(sfd -1){perror("socket");return -1;}prin…

Python文件操作相关知识点(读取/写入数据)

1.open函数的定义 &#xff08;1&#xff09;open函数的简要概述 open&#xff08;filename&#xff09;函数接受一个参数——要打开文件的名称&#xff0c;Python在当前执行的文件所在的目录中查找指定的文件。并返回一个表示文件的对象。 open&#xff08;&#xff09;函数…

基于python智慧社区家政服务系统的设计与实现flask-django-nodejs-php

随着现代网络技术发展&#xff0c;对于智慧社区家政服务系统的设计现在正处于发展的阶段&#xff0c;所以对的要求也是比较严格的&#xff0c;要从系统的功能和用户实际需求来进行对系统制定开发的发展方式&#xff0c;依靠网络技术的的快速发展和现代通讯技术的结合为人们带来…

MyBatis是纸老虎吗?(四)

在《MyBatis是纸老虎吗&#xff1f;&#xff08;三&#xff09;》这篇文章中我们一起梳理了MyBatis配置文件的解析流程&#xff0c;并详细介绍了其中的一些常见节点的解析步骤。通过梳理&#xff0c;我们弄清楚了MyBatis配置文件中的一些常用配置项与Java Bean之间的对应关系&a…

threejs之贴图原理

// 导入threejs import * as THREE from "three"; // 导入轨道控制器 import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";// 创建场景 const scene new THREE.Scene();// 创建相机 const camera new THREE.PerspectiveCame…