每日五道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 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.mfbz.cn/a/470203.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

初识数据库|数据库的特点、分类以及作用

数据库系统&#xff08;DateBase System&#xff0c;简称DBS&#xff09;是指在计算机系统中引入数据库后的系统构成&#xff0c;由计算机硬件&#xff0c;操作系统&#xff0c;DBMS&#xff0c;DB&#xff0c;应用程序和用户以及数据库开发和管理人员等组成。 &#xff08;一…

连锁门店收银系统和普通的门店收银系统有什么不同

连锁门店收银系统和普通门店收银系统在功能和应用上可能会有一些不同之处&#xff1a; 多店管理功能&#xff1a; 连锁门店收银系统通常具备多店管理功能&#xff0c;可以连接和管理多家门店的数据&#xff0c;实现统一的数据分析和管理。而普通门店收银系统可能只适用于单一门…

Docker-安装

Docker ⛅Docker-安装&#x1f320;各平台支持情况&#x1f320;Server 版本安装☃️Ubuntu☃️Centos &#x1f320;Docker 镜像源修改&#x1f320;Docker 目录修改 ⛅Docker-安装 &#x1f320;各平台支持情况 &#x1f320;Server 版本安装 ☃️Ubuntu &#x1f342;安装…

计算机二级(Python)真题讲解每日一题:《方菱形》

描述‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬ 请写代码替换横线&#xff0…

苹果意将Gemini引入iPhone;英伟达发布新AI GPU;Grok正式开源

苹果正在谈判将 Gemini 引入 iPhone Mark Gurman 报道&#xff0c;苹果正在谈判将 Google 的生成式 AI 大模型 Gemini 引入 iPhone。 知情人士透露&#xff0c;两家公司正在积极谈判&#xff0c;让苹果获得 Gemini 授权&#xff0c;为今年 iPhone 软件的一些新功能提供动力。苹…

【CSS】overflow中scroll和hidden的区别是什么?

overflow: scroll; 和 overflow: hidden; 是CSS中用于处理元素内容溢出其容器时的两种不同属性值。它们的主要区别在于当内容超出指定容器的尺寸时&#xff0c;它们如何显示或隐藏内容。 如果你有一个包含大量文本或图片的元素&#xff0c;并且希望用户能够滚动查看所有内容&am…

OLLVM环境配置

虚拟机配置: 4g 40g 增加源 deb [archamd64] http://archive.ubuntu.com/ubuntu focal main universe安装cmake sudo apt-get install cmake -y安装gcc8 sudo apt-get install gcc-8 g-8 -y切换为默认版本 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/…

服务器硬件基础知识和云服务器的选购技巧

概述 服务器硬件基础知识涵盖了构成服务器的关键硬件组件和技术&#xff0c;这些组件和技术对于服务器的性能、稳定性和可用性起着至关重要的作用。其中包括中央处理器&#xff08;CPU&#xff09;作为服务器的计算引擎&#xff0c;内存&#xff08;RAM&#xff09;用于数据临…

MySQL 搭建双主复制服务 并 通过 HAProxy 负载均衡

一、MySQL 搭建双主复制高可用服务 在数据库管理中&#xff0c;数据的备份和同步是至关重要的环节&#xff0c;而双主复制&#xff08;Dual Master Replication&#xff09;作为一种高可用性和数据同步的解决方案&#xff0c;通过让两个数据库实例同时充当主服务器和从服务器&…

Laravel框架项目首页内容修改

#Laravel# 安装Laravel框架成功后运行项目&#xff0c;看到下面这个图就说明安装框架成功了 需要根据自己的需求修改页面时&#xff0c;先找到首页的文件 首页对应的页面文件为项目根目录下的resources/views/welcome.blade.php文件 <!DOCTYPE html> <html lang&quo…

Spark-Scala语言实战(3)

在之前的文章中&#xff0c;我们学习了如何在来如何在IDEA离线和在线安装Scala&#xff0c;想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 Spark-Scala语言实…

Flutter与Xamarin跨平台APP开发框架的区别

嘿&#xff0c;各位亲爱的朋友们&#xff01;大家好&#xff0c;我是咕噜铁蛋&#xff01;今天我们要探讨的话题是&#xff1a;Flutter与Xamarin这两款热门的跨平台APP开发框架。我深知选择合适的开发工具对于开发者来说有多么重要。那么&#xff0c;当我们需要开发跨平台应用时…

PPT好看配色

放几个链接&#xff01;画图时候可以参考&#xff01;转自知乎 Color Hunt ColorDrop 中国色 Flat UI Colors Coolors

Trent-FPGA硬件设计课程

本课程涵盖FPGA硬件设计的基础概念和实践应用。学生将学习Verilog语言编程、数字电路设计原理、FPGA架构和开发工具的使用。通过项目实践&#xff0c;掌握FPGA设计流程和调试技巧&#xff0c;为硬件加速和嵌入式系统开发打下坚实基础。 课程大小&#xff1a;4.3G 课程下载&am…

开源工具专题-01 Superset的CICD流程构建

开源工具专题 注&#xff1a; 本教程由羞涩梦整理同步发布&#xff0c;本人技术分享站点&#xff1a;blog.hukanfa.com 转发本文请备注原文链接&#xff0c;本文内容整理日期&#xff1a;2024-01-28 csdn 博客名称&#xff1a;五维空间-影子&#xff0c;欢迎关注 说明 此搭…

java算法题每日多道

274. H 指数 题目 给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义&#xff1a;h 代表“高引用次数” &#xff0c;一名科研人员的 h 指数 是指他&#xff08;…

windows11右键老是要点显示更多选项解决方案

windows11右键老是要点显示更多选项解决方案 右键老出现这个提示&#xff0c;每次得点两次很不方便 网上搜了好几个都没解决呢 改回windows10这个方式 解决方案如下 第一步下载WinAero Tweaker https://download.csdn.net/download/weixin_39934453/88996692 第二步双击安…

基于SpringCloud的菜谱美食交流系统Eureka

本技术是java平台的开源应用框架&#xff0c;其目的是简化Sping的初始搭建和开发过程。默认配置了很多框架的使用方式&#xff0c;自动加载Jar包&#xff0c;为了让用户尽可能快的跑起来spring应用程序。 本选题致力于开发一个菜谱交流系统&#xff0c;旨在帮助越来越多的人可以…

【Node.js从基础到高级运用】十五、单元测试与集成测试

引言 在Node.js开发过程中&#xff0c;测试是确保代码质量和功能正确性的关键步骤。单元测试和集成测试是最常见的测试类型。下面我们将使用Jest框架来进行测试。 单元测试 单元测试是指对软件中的最小可测试单元进行检查和验证。在Node.js中&#xff0c;这通常指的是函数或者…

【PINet车道线检测】代码复现过程

《Key Points Estimation and Point Instance Segmentation Approach for Lane Detection》 论文&#xff1a;https://arxiv.org/abs/2002.06604 代码&#xff1a;GitHub - koyeongmin/PINet 论文解读&#xff1a;http://t.csdnimg.cn/AOV91 这是篇关于自动驾驶中车道检测技…
最新文章