了MyBatis的多个核心功能实现方式

简介: 本文介绍了MyBatis的多个核心功能实现方式,包括:如何获取生成的主键、实体类属性与表字段名不一致时的处理方法、多表查询的实现方式(使用`association`和`collection`标签)、延迟加载的支持情况、批量插入的实现方式及主键返回问题。内容实用,适合MyBatis开发者参考。

Mybatis 如何获取生成的主键

我知道的有二种方式

  1. 在insert标签上, 使用useGeneratedKeys="true" 和 keyProperty="userId"
  2. 在insert表内部, 使用 selectKey标签 , 里面使用select last_insert_id()查询生成的ID返回

当实体类中的属性名和表中的字段名不一样 ,怎么办

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

第2种: 通过 ResultMap来映射字段名和实体类属性名

Mybatis如何实现多表查询

Mybatis是新多表查询的方式也有二种 :

第一种是 : 编写多表关联查询的SQL语句 , 使用ResultMap建立结果集映射 , 在ResultMap中建立多表结果集映射的标签有association和collection

<resultMap id="Account_User_Map" type="com.heima.entity.Account">
    <id property="id" column="id"></id>
    <result property="uid" column="uid"></result>
    <result property="money" column="money"></result>
    <association property="user">
        <id property="id" column="uid"></id>
        <result property="username" column="username"></result>
        <result property="birthday" column="birthday"></result>
        <result property="sex" column="sex"></result>
        <result property="address" column="address"></result>
    </association>
</resultMap>
<!--public Account findByIdWithUser(Integer id);-->
<select id="findByIdWithUser" resultMap="Account_User_Map">
    select  a.*,  username, birthday, sex, address  from account a , user u where a.UID = u.id and a.ID = #{id} ;
</select>

第二种是 : 将多表查询分解为多个单表查询, 使用ResultMap表的子标签association和collection标签的select属性指定另外一条SQL的定义去执行, 然后执行结果会被自动封装

<resultMap id="Account_User_Map" type="com.heima.entity.Account" autoMapping="true">
    <id property="id" column="id"></id>
    <association property="user" select="com.heima.dao.UserDao.findById" column="uid" fetchType="lazy"></association>
</resultMap>
<!--public Account findByIdWithUser(Integer id);-->
<select id="findByIdWithUser" resultMap="Account_User_Map">
    select * from account where  id = #{id}
</select>


Mybatis是否支持延迟加载?

Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是 一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载 lazyLoadingEnabled=true|false。

如何使用Mybatis实现批量插入 ?

使用foreach标签 , 它可以在SQL语句中进行迭代一个集合。foreach标签的属性主 要有item,index,collection,open,separator,close。

  • collection : 代表要遍历的集合 ,
  • item 表示集合中每一个元素进行迭代时的别名,随便起的变量名;
  • index 指定一个名字,用于表示在迭代过程中,每次迭代到的位置,不常用;
  • open 表示该语句以什么开始
  • separator 表示在每次进行迭代之间以什么符号作为分隔符
  • close 表示以什么结束

Mybatis 批量插入是否能够返回主键

可以, 返回的主键在传入集合的每个对象属性中封装的

相关文章
|
计算机视觉 Python
Opencv学习笔记(一):如何将得到的图片保存在指定目录以及如何将文件夹里所有图片以数组形式输出
这篇博客介绍了如何使用OpenCV库在Python中将图片保存到指定目录,以及如何将文件夹中的所有图片读取并以数组形式输出。
1233 0
Opencv学习笔记(一):如何将得到的图片保存在指定目录以及如何将文件夹里所有图片以数组形式输出
|
存储 数据可视化 关系型数据库
Apache Doris-部署
建议使用使用 Docker 开发镜像编译
1701 0
Apache Doris-部署
|
存储 JSON 数据格式
docker load 后镜像名称为空的问题解决
Docker在容器化应用程序时提供了强大的镜像管理功能,但也可能在某些操作中遇到如镜像名称为空的问题。通过理解问题的成因并采取适当的解决方案,如正确保存和加载镜像、手动修复标签等,可以有效避免和解决这一问题。通过本文提供的指导,您可以确保在使用Docker进行镜像操作时更为顺利,并提高容器管理的效率。
1287 82
|
开发框架 安全 应用服务中间件
【文件上传绕过】——解析漏洞_IIS7.0 | IIS7.5 | Nginx的解析漏洞
【文件上传绕过】——解析漏洞_IIS7.0 | IIS7.5 | Nginx的解析漏洞
1454 9
|
SQL 算法 数据库
sql数据库表内容误删怎么恢复
当SQL数据库表的内容误删时,可以尝试以下方法来恢复数据: 首先,最佳的解决方案是使用数据库备份来恢复数据。这是一种重要的防备措施,可在数据意外删除时快速恢复。 1. **使用备份恢复**
|
消息中间件 存储 网络协议
Docker多主机搭建RabbitMQ集群
本文通过docker swarm建立多主机的Rabbitmq集群,自带配置文件,无需再次配置,直接启动即可 3台主机,分别为: test01:192.168.1.10,角色:manager test02:192.168.1.20,角色:worker test03:192.168.1.30,角色:worker 配置好各自的hostname
1073 0
|
存储 安全 数据安全/隐私保护
网络信息安全基本属性
常见的网络信息安全基本属性主要有机密性、完整性、可用性、不可抵赖性和可控性等,其中机密性(Confidentiality)、完整性(Integrity)、可用性(Availability)被称为网络信息系统核心的CIA安全属性,此外还有其他的安全属性包括:真实性、时效性、合规性、隐私性等。
1714 0
|
前端开发 Java 应用服务中间件
选择 Spring Boot 进行微服务开发的 7 大理由
选择 Spring Boot 进行微服务开发的 7 大理由
400 1
|
测试技术 计算机视觉
【YOLOv8性能对比试验】YOLOv8n/s/m/l/x不同模型尺寸大小的实验结果对比及结论参考
【YOLOv8性能对比试验】YOLOv8n/s/m/l/x不同模型尺寸大小的实验结果对比及结论参考
|
数据可视化 Serverless 定位技术
R语言ggmap空间可视化机动车碰撞–街道地图热力图
R语言ggmap空间可视化机动车碰撞–街道地图热力图