MyBatis-知识点详解

本文将详细地介绍MyBatis框架,从其优缺点、适用场景到工作原理,全面解析MyBatis的懒加载、延迟加载机制,以及如何管理实体与数据库字段的映射差异。同时,探讨动态SQL、缓存策略、事务处理,并比较MyBatis与Hibernate的不同。以问答题的形式详细介绍各个知识点,为开发者提供一份简洁高效的MyBatis学习概览。

MyBatis-知识点详解

    • MyBatis
    • Mybaits 的优点:
    • MyBatis 框架的缺点:
    • MyBatis 框架适用场合:
    • MyBatis 的工作原理是什么?
    • MyBatis 如何处理懒加载?
    • MyBatis 的延迟加载是什么?
    • MyBatis 如何处理一对多关系?
    • 当实体类中的属性名和表中的字段名不一样 ,怎么办 ?
    • MyBatis 的动态 SQL 语句是什么?
    • 模糊查询 like 语句该怎么写?
    • MyBatis 的缓存机制是什么?
    • MyBatis 如何处理事务?
    • MyBatis 和 Hibernate 的区别是什么?
    • MyBatis 的逆向工程是什么?
    • MyBatis 的拦截器是什么?
    • MyBatis 的 batch 操作是什么?
    • #{}和${}的区别是什么?
    • xml 映射文件中,常见的标签
    • Dao 接口的工作原理是什么?
    • MyBatis 是如何进行分页的?分页插件的原理是什么?
    • Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
    • MyBatis 实现一对一有几种方式?具体怎么操作的?
    • MyBatis 实现一对多有几种方式,怎么操作的?
    • 使用 MyBatis 的 mapper 接口调用时有哪些要求?
    • JDBC 编程有哪些步骤?

MyBatis

  MyBatis 是一个开源的基于 Java 的持久化框架,它可以将 SQL 语句映射到 Java 对象中,实现了对数据访问的封装。MyBatis 使用 XML 文件或注解来配置 SQL 语句和映射关系,提供了与数据库交互的简单 API。

Mybaits 的优点:

1、基于 SQL 语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL 写在 XML 里,解除 sql 与程序代码的耦合,便于统一管理;提供 XML标签,支持编写动态 SQL 语句,并可重用。

2、与 JDBC 相比,减少了 50%以上的代码量,消除了 JDBC 大量冗余的代码,不需要手动开关连接;

3、很好的与各种数据库兼容(因为 MyBatis 使用 JDBC 来连接数据库,所以只要JDBC 支持的数据库 MyBatis 都支持)。

4、能够与 Spring 很好的集成;

5、提供映射标签,支持对象与数据库的 ORM 字段关系映射;提供对象关系映射标签,支持对象关系组件维护。

MyBatis 框架的缺点:

1、SQL 语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL 语句的功底有一定要求。

2、SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

MyBatis 框架适用场合:

1、MyBatis 专注于 SQL 本身,是一个足够灵活的 DAO 层解决方案。

2、对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis 将是不错的选择.

MyBatis 的工作原理是什么?

  MyBatis 的工作原理是:

  首先通过配置文件或注解来配置 SQL 语句和映射关系,然后在程序中使用 SqlSession 对象来执行 SQL 语句,最终得到结果。在执行 SQL 语句时,MyBatis 会将 SQL 语句和参数信息转化为 JDBC 所需的格式,并通过 JDBC API 来执行 SQL 语句,并将结果转换为 Java 对象。

MyBatis 如何处理懒加载?

  MyBatis 可以通过配置懒加载来提高性能。

  懒加载是指在需要使用时才加载数据,而不是在查询时全部加载。

  MyBatis 支持两种懒加载方式:基于延迟加载的懒加载和基于动态代理的懒加载。

  基于延迟加载的懒加载是指在查询时只查询基本数据,当需要访问关联对象时,再执行另外一次查询。

  基于动态代理的懒加载是指使用代理对象延迟加载关联对象。

MyBatis 的延迟加载是什么?

  MyBatis 的延迟加载是指在需要使用某个关联对象时再去加载该对象的数据,而不是在查询时就加载所有的关联对象数据。延迟加载可以有效地减少查询的性能开销,并降低内存的使用量。MyBatis 支持两种延迟加载方式,一种是基于代理的延迟加载,另一种是基于 XML 配置的延迟加载。

MyBatis 如何处理一对多关系?

  MyBatis 可以通过嵌套查询、嵌套结果和分步查询等方式来处理一对多关系。

  嵌套查询是指使用 SQL 语句嵌套查询,将关联对象作为子查询,可以通过多条 SQL 语句来实现。

  嵌套结果是指通过嵌套结果映射来将一对多关系映射到 Java 对象中。

  分步查询是指先查询出主对象,再查询关联对象,最后将结果合并到 Java 对象中。

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

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

<select id=”selectorder” parametertype=int” resultetype=”
me.gacl.domain.order>
select order_id id, order_no orderno ,order_price price form
orders where order_id=#{id};
</select>

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

<select id="getOrder" parameterType="int"
resultMap="orderresultmap">
select * from orders where order_id=#{id}
</select>
<resultMap type=”me.gacl.domain.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” />
</reslutMap>

MyBatis 的动态 SQL 语句是什么?

  动态 SQL 语句是指根据不同条件生成不同 SQL 语句的技术。MyBatis 提供了一些动态 SQL 标签来实现动态 SQL 语句,包括 if、choose、when、otherwise、foreach 等标签。

  if 标签可以根据条件来生成不同的 SQL 语句,choose、when、otherwise 标签可以根据不同条件来生成不同的 SQL 语句片段,foreach 标签可以用来循环生成 SQL 语句。

模糊查询 like 语句该怎么写?

第 1 种:在 Java 代码中添加 sql 通配符。

string wildcardname =%smi%;
list<name> names = mapper.selectlike(wildcardname)<select id=”selectlike”>
select * from foo where bar like #{value}
</select>

第 2 种:在 sql 语句中拼接通配符,会引起 sql 注入

string wildcardname = “smi”;
list<name> names = mapper.selectlike(wildcardname);
<select id=”selectlike”>
select * from foo where bar like "%"#{value}"%"
</select>

MyBatis 的缓存机制是什么?

  MyBatis 提供了一级缓存和二级缓存来提高查询性能。

  一级缓存是指在同一个 SqlSession 中,查询相同 SQL 语句得到的结果会被缓存,如果再次查询相同的 SQL 语句,则直接从缓存中获取数据。

  二级缓存是指在多个 SqlSession 中,查询相同 SQL 语句得到的结果会被缓存,如果再次查询相同的 SQL 语句,则直接从缓存中获取数据。

  MyBatis 还提供了基于命名空间的缓存,可以通过配置来启用或禁用缓存。

MyBatis 如何处理事务?

  MyBatis 可以使用 JDBC 或 Spring 来处理事务。

  如果使用 JDBC,可以通过 SqlSession 对象来控制事务。在事务处理中,如果执行的 SQL 语句中有一条语句执行失败,则整个事务会回滚。

  如果使用 Spring,可以使用 Spring 的事务管理机制来管理事务。

MyBatis 和 Hibernate 的区别是什么?

  MyBatis 和 Hibernate 都是 Java 中比较流行的 ORM 框架,它们的区别主要体现在以下几个方面:

1)MyBatis 更加灵活,可以使用 XML 或注解来配置 SQL 语句,而 Hibernate 更加智能,可以自动生成 SQL 语句。
2)MyBatis 更加轻量级,可以直接使用 JDBC API,而 Hibernate 需要使用庞大的 Hibernate API。
3)MyBatis 可以更加精细地控制 SQL 语句的执行,而 Hibernate 更加高级,可以处理更复杂的映射关系。

MyBatis 的逆向工程是什么?

  MyBatis 的逆向工程是指根据数据库中的表自动生成 Java 代码和映射文件的工具。逆向工程可以根据数据库中的表自动生成 POJO、Mapper 接口、映射文件等文件,从而避免手动编写代码的繁琐过程。MyBatis 逆向工程可以通过 MyBatis Generator 插件来实现。

MyBatis 的拦截器是什么?

  MyBatis 的拦截器是一种 AOP 技术,可以在 SQL 语句执行前、执行后或执行异常时进行拦截,并进行一些额外的处理,比如记录日志、缓存 SQL 语句等。MyBatis 的拦截器可以通过自定义拦截器实现,也可以使用 MyBatis 提供的一些拦截器,比如日志拦截器、缓存拦截器等。

MyBatis 的 batch 操作是什么?

  MyBatis 的 batch 操作是指将多条 SQL 语句合并为一条 SQL 语句一次性执行,从而提高 SQL 执行效率。MyBatis 提供了批量插入、批量更新、批量删除等多种 batch 操作方式,可以通过 SqlSession 的 batch() 方法来执行批量操作。batch 操作可以有效地减少 SQL 语句的执行次数,从而提高查询性能。

#{}和${}的区别是什么?

#{}:sql 占位符号,好处防止sql注入
${}:sql拼接符号
能使用 #{ } 的地方就用 #{ }
表名作为变量时,必须使用 ${ }。因为,表名是字符串,使用 sql 占位符替换字符串时会带上单引号 ‘’,这会导致 sql 语法错误。

xml 映射文件中,常见的标签

在 XML 映射文件中,常见的标签包括:

  1. <mapper>:表示一个映射器,用于将 SQL 语句映射到 Java 对象中的方法。
  2. <select><insert><update><delete>:表示 SQL 语句的类型,用于定义具体的 SQL 语句和参数类型。
  3. <resultMap>:表示结果映射,用于将数据库查询结果映射到 Java 对象中的属性。
  4. <id><result>:表示结果列的标识符,用于将查询结果中的列映射到 Java 对象中的属性。
  5. <if><where><foreach><choose><when><otherwise>:表示动态 SQL 语句的条件语句,用于动态拼接 SQL 语句,增加查询条件。
  6. <include>:表示引入其他的 XML 文件,用于模块化 SQL 语句的编写,提高代码的复用性。
  7. <cache>:表示映射器的缓存,用于提高 SQL 查询的性能。
  8. <parameterMap>:表示参数映射,用于将 Java 对象中的属性映射到 SQL 语句中的参数。
  9. <sql>:表示 SQL 片段,用于提取公共的 SQL 片段,增加 SQL 语句的复用性。

Dao 接口的工作原理是什么?

  通常一个 xml 映射文件,都会写一个 Dao 接口与之对应。Dao 接口就是 Mapper 接口。接口的全限名,就是映射文件中的 namespace 的值。Mybatis 的 Dao 接口可以有多个重载方法,但是多个接口对应的映射必须只有一个。

  Dao 接口的工作原理是 JDK 动态代理,MyBatis 运行时会使用 JDK 动态代理为 Dao 接口生成代理 proxy 对象,代理对象 proxy 会拦截接口方法,转而执行 MappedStatement 所代表的 sql,然后将 sql 执行结果返回。

MyBatis 是如何进行分页的?分页插件的原理是什么?

1、基于数据库的分页
MyBatis 支持使用 LIMIT 语句进行分页查询,只需要在 SQL 语句中使用 #{offset} 和 #{limit} 占位符即可:
2、基于插件的分页:PageHelper
可以通过配置该插件来实现分页查询。该插件会拦截需要分页的 SQL 语句,并根据分页参数动态生成分页 SQL 语句。分页插件还会在分页 SQL 语句之前执行一次查询,统计符合条件的总记录数,并将结果保存在分页对象中。

Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?

  第一种是使用标签,逐一定义数据库列名和对象属性名之间的映
射关系。

  第二种是使用 sql 列的别名功能,将列的别名书写为对象属性名。有了列名与属性名的映射关系后,Mybatis 通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

MyBatis 实现一对一有几种方式?具体怎么操作的?

  有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次, 通过在resultMap 里面配置 association 节点配置一对一的类就可以完成;

  嵌套查询是先查一个表,根据这个表里面的结果的 外键 id,去再另外一个表里面查询数据,也是通过 association 配置,但另外一个表的查询通过 select 属性配置。

MyBatis 实现一对多有几种方式,怎么操作的?

  有联合查询和嵌套查询。联合查询是几个表联合查询,只查询一次,通过在
resultMap 里面的 collection 节点配置一对多的类就可以完成;

  嵌套查询是先查一个表,根据这个表里面的 结果的外键 id,去再另外一个表里面查询数据,也是通过配置 collection,但另外一个表的查询通过 select 节点配置。

使用 MyBatis 的 mapper 接口调用时有哪些要求?

1、Mapper 接口方法名和 mapper.xml 中定义的每个 sql 的 id 相同;
2、Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 sql 的
parameterType 的类型相同;
3、Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sql 的
resultType 的类型相同;
4、Mapper.xml 文件中的 namespace 即是 mapper 接口的类路径。

JDBC 编程有哪些步骤?

1.装载相应的数据库的 JDBC 驱动并进行初始化:

Class.forName("com.mysql.jdbc.Driver");

2.建立 JDBC 和数据库之间的 Connection 连接:

Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?
characterEncoding=UTF-8", "root", "123456")

3.创建 Statement 或者 PreparedStatement 接口,执行 SQL 语句。
4.处理和显示结果。
5.释放资源。

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

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

相关文章

Qt 6子窗口全屏显示

一、全屏显示效果 二、全屏相关函数 1,全屏显示函数 QWidget::showFullScreen(); // 此方法只对顶级窗口有效&#xff0c;对子窗口无效 2&#xff0c;恢复显示函数 QWidget::showNormal(); // 此方法也只对顶级窗口有效&#xff0c;对子窗口无效 3&#xff0c;最小化显示函…

go语言并发实战——日志收集系统(五) 基于go-ini包读取日志收集服务的配置文件

实现日志收集服务的客户端 前言 从这篇文章开始我们就正式进入了日志收集系统的编写&#xff0c;后面几篇文章我们将学习到如何编写日志收集服务的客户端,话不多说,让我们进入今天的内容吧&#xff01; 需要实现的功能 我们要收集指定目录下的日志文件&#xff0c;将它们发…

12. MyBatis(二)

源码位置&#xff1a;MyBatis_demo 上篇文章我们学习了MyBatis的定义以及增删查改操作&#xff0c;并且学习了如何在xml文件中编写SQL时使用#{}的方式将参数和对象的属性映射到SQL语句中&#xff0c;上篇的内容已经足以应对大部分场景&#xff0c;本篇文章我们就要学习一下MyBa…

uniapp+vue3监听输入框内容watch

代码 <view class"searchBox"><view class"searchLeft"><wh-icon name"search" size"40"></wh-icon><input type"text" placeholder"请输入搜索内容" v-model"search" /&g…

基础算法---二分查找

文章目录 基本思想1.数的范围2.搜索旋转排序数组3.搜索插入位置4.x的平方根总结 基本思想 二分查找的必要条件并不是单调&#xff0c;而是当我给定一个边界条件&#xff0c;然后左边满足这个边界条件&#xff0c;右边不满足这个边界条件&#xff0c;然后可以查找这个临界点&am…

华火电燃灶:烹饪艺术与科技创新的完美融合

华火电燃灶&#xff0c;以纯净电力激发明火之美&#xff0c;无须燃气&#xff0c;尽释碳负。每一道佳肴背后&#xff0c;都是对安全与健康的无声誓言&#xff0c;为家庭温馨瞬间添上一抹灿烂。从宝贝初声啼哭到晚年宁静美好&#xff0c;华火见证家的每一次幸福团聚&#xff0c;…

DevOps流程的简单总结

DevOps流程图&#xff1a; DevOps流程包含&#xff1a;计划&#xff08;plan&#xff09;、编码(code)、编译(build)、测试(test)、发布(release)、部署(deploy)、运营(operate)、监控&#xff08;monitor&#xff09;&#xff0c;这是一个循环的过程。DevOps是依托容器、自动化…

流程控制:goto语句,模拟switch语句

示例&#xff1a; /*** brief how about goto-switch? show you here.* author wenxuanpei* email 15873152445163.com(query for any question here)*/ #define _CRT_SECURE_NO_WARNINGS//support c-library in Microsoft-Visual-Studio #include <stdio.h>static …

涉密人员离职,如何一键锁定他的电脑屏幕

在任何情况下&#xff0c;保护企业数据的安全性和机密性都是非常重要的。如果涉密人员离职&#xff0c;应该遵循相关的保密协议和规定&#xff0c;确保企业数据的完整性和安全性。同时&#xff0c;也应该对员工进行适当的培训和教育&#xff0c;提高他们的安全意识和技能水平。…

【c++】cpp数学库函数、随机数和时间库函数

&#xff08;1&#xff09;cpp数学库函数 #include <iostream>using namespace std;#include <cmath> //数学函数库的头文件#define pi 3.1415926 //定义一个常量π int main() {cout << "平方数:pow(3, 2) :" << pow(3, 2) << endl;…

开源AI Agent框架的选择

在选择开源AI Agent框架时,首先需要考虑的是框架的开发优先级、功能特性以及社区支持情况。SuperAGI是一个开发者优先的开源自主AI代理框架,它使开发人员能够快速可靠地构建、管理和运行有用的代理12。这表明SuperAGI可能是一个适合需要快速迭代和高度自定义能力的项目的良好…

selenium‘拟人包装‘设置

1、设置header,proxy 1.1关于user-agent 输入about:version 找到user-agent: import requests # 引用requests库 from selenium import webdriver#载入浏览器驱动#header&#xff0c;proxy设置 optionswebdriver.ChromeOptions()#实例化浏览器参数设置options.add_argument…

git基础教程(52).git/config的’remote’和’branch’部分的理解

文章目录 .git/config文件简介‘remote’部分‘branch’部分.git/config文件简介 在使用Git进行版本控制时,每个仓库都会有一个名为.git的隐藏文件夹,其中包含了Git的配置信息和版本记录等重要数据。其中,.git/config文件是每个仓库的配置文件,记录了与远程仓库的连接和本…

水电远程预付费系统:创新与便利的融合

1.系统概述 水电远程预付费系统是一种现代化的管理工具&#xff0c;它通过先进的信息技术实现了水电费用的预先支付和远程管理。这种系统不仅提高了服务效率&#xff0c;也为用户带来了极大的便利&#xff0c;减少了传统抄表和收费过程中的诸多不便。 2.功能特性 2.1实时计量…

pycharm创建的项目

pycharm生成django templates删出 settings.py

nvidia-smi CUDA Version:N/A

问题 nvidia-smi显示&#xff1a;CUDA Version:N/A nvidia-smi -a显示&#xff1a;CUDA Version: Not Found 解决方法 查看Nvidia驱动版本 nvidia-smi如下图&#xff0c;版本为530.41.03 搜索cuda库 apt search libcuda注&#xff1a;不同的源&#xff0c;同一个库的命…

【JavaSE】JDK17的一些特性

前言 从springboot3.0开始&#xff0c;已经不⽀持JDK8了 选⽤Java17&#xff0c;概括起来主要有下⾯⼏个主要原因 JDK17是LTS(⻓期⽀持版)&#xff0c;可以免费商⽤到2029年。⽽且将前⾯⼏个过渡版&#xff08;JDK9-JDK16&#xff09; 去其糟粕&#xff0c;取其精华的版本JDK17…

用友 NC showcontent SQL注入漏洞复现

0x01 产品简介 用友NC是由用友公司开发的一套面向大型企业和集团型企业的管理软件产品系列。这一系列产品基于全球最新的互联网技术、云计算技术和移动应用技术&#xff0c;旨在帮助企业创新管理模式、引领商业变革。 0x02 漏洞概述 用友NC /ebvp/infopub/showcontent 接口处…

AndroidStudio右下角显示内存使用情况

目录 一.具体效果 二.4.0以下版本 三.4.0以上版本 四.增加内存配置 一.具体效果 二.4.0以下版本 1.打开 Android Studio. 2.进入设置界面。点击 Android Studio 左上角的“File”&#xff0c;然后选择“Settings” 3.在设置界面中&#xff0c;选择“Appearance & Beha…

python中的传参(传副本)、传引用和全局变量与局部变量

文章目录 前言1、全局变量与局部变量2、python函数的传参2.1 实参与形参2.2 可变数据与不可变数据2.3 传值(假的传值)与传引用2.3.1 传值(本质上还是传引用---由于python不可变数据的特性就变成和C语言里面传值的效果一样了)示例一:对于不可变数据类型,如果你将一个变量作…