Mabitys总结

一、ORM

ORM(Object/Relation Mapping),中文名称:对象/关系 映射。是一种解决数据库发展和面向对象编程语言发展不匹配问题而出现的技术。

使用JDBC技术时,手动实现ORM映射:

使用ORM时,自动关系映射:

(1)ORM的具体实现可以认为是一个整体。

(2)SQL执行结果后,如果执行的是增删改,不需要去编写拆卸对象的代码,而是由ORM把对象中属性值取出放入到SQL中。

(3)SQL执行结果后,如果执行的是查询,会由ORM将数据库中查询到的结果,转换为对象。

(4)ORM技术相当于一个转换器,是面向对象语言和数据库之间的纽带。

(5)ORM框架封装了对象/关系的自动映射。

MyBatis:目前使用最多的ORM框架。

二、Mybatis中的SQL语句中的参数

1.MyBatis中最常用的占位符为 #{}。

        1.SQL语句中使用#{}获取Test类中传递过来的参数值。

        2. 当参数对象类型时,可以使用#{对象中属性名}获取对象属性值。

2.${} 的使用

${}在被MyBatis进行解析时,不会解析为占位符,而是直接解析成对应的值。也就是说使用${}时有点类似字符串拼接,会有SQL注入问题。 但是使用${}可以动态设置列名或表名。

3.#{}和${}的区别(经典面试题)

#{}被解析为?,用在设置列的值或条件值时,也可以使用在分页等需要设置具体值的情况。

${}表示字符串拼接,用在动态设置表名和动态设置列名的情况下。

三、MyBatis中DQL操作

yBatis的DQL操作在映射文件都是通过<select>标签实现的。

SqlSession根据根据查询结果类型不同,提供了五种查询方法:

方法名解释说明
selectOne()查询一行数据时,返回值为Object。如果没有查询到,返回为nill,但是不能查询到多行。
selectMap()查询多行数据时,把其中某列结果当做key,每行结果为Value。
selectList()当查询多行数据时,返回值为List。如果没有查询到返回长度为零的List对象。
selectCursor()使用游标查询时使用,在大量数据时可以代替分页。
select()万能方法,需要自己定义结果处理器

四、SQL查询结果填充的几种方式(面试题)

1. 介绍

MyBatis会根据句映射关系把查询到的结果填充到指定结果集类型中。支持方式:

  • auto mapping:自动映射。当列名或列的别名与实体类属性名相同时不需要做额外配置。

  • resultMap:手动定义映射关系。

  • camel case:驼峰命名规则。

2. 驼峰转换

MyBatis提供了驼峰转换的能力。通过全局配置文件开启驼峰转换功能后,就可以让xxx_yyy自动映射到xxxYyy上。例如:列名叫做peo_id,可以自动映射到peoId的属性上。转换时去掉列中的下划线,把下划线后面单词首字母变大写。

五、接口绑定方案

MyBatis提供了一种接口绑定方案,通过SqlSession的getMapper方法产生接口的动态代理对象。然后通过对象调用接口中提供的功能。

1.接口绑定方案中映射文件的要求

在接口绑定方案中,对于映射文件有几点强制要求:

  1. 映射文件和接口需要在同一个包中

  2. 映射文件名称要和接口名称相同

  3. namespace取值必须是接口的全限定路径

  4. id属性值必须和方法名对应

  5. resultType必须和方法返回值类型对应。如果方法返回值是集合类型,resultType中写泛型的类型

2.接口绑定方案下参数传递

接口中方法SqlSession的方法
int insertPeople(People peo);session.insert("insertPeople",peo);
int deleteById(int id);session.delete("deleteById",id);
int updatePeople(People peo);session.update("updatePeople",peo);
People selectById(int id);session.selectOne("selectById",id);
List<People> selectAll();session.selectList("selectAll");
List<People> selectByUnameAndAddr(String name,String address);session.selectList("selectByUnameAndAddr",Map类型参数)

当方法带有多个参数将使用session.selectList("",Map类型参数)或session.selectOne("",Map类型参数)作为底层调用。

Mybatis会自动创建Map的key:

  1. 如果接口中方法没有使用注解定义名称,MyBatis使用内置名称作为key。

    规则:arg0、arg1、argM(M为从0开始的数字,和方法参数顺序对应)或param1、param2、paramN(N为从1开始的数字,和方法参数顺序对应)。

  2. 也可以在接口方法参数中通过@Param("key名称")的形式进行定义key。一定使用了注解argN的这种形式就不能使用了,但是paramN的方式还是可以使用。

六、动态SQL

1. if标签

通过if处理用户多变的查询条件。类似于:

if(){}
if(){}

<if>标签的test属性值为OGNL(对象导航图语言)表达式,通过对象属性名可以快速获取到对象属性值。

2. choose

  • choose标签相当于Java中的if...else if....else。
  • 在choose标签里面可以有多个when标签和一个otherwise(可以省略)标签。
  • 只要里面有一个when成立了后面的when和otherwise就不执行了。

3. trim标签


trim标签包含四个属性:

  • prefix:子内容不是空字符串(""),就在子内容前面添加特定字符串。
  • prefixOverrides:子内容是以某个内容开头,去掉这个内容。
  • suffix:子内容不是空字符串(""),就在子内容后面添加特定字符串。
  • suffixOverrides:子内容以某个内容结尾,就去掉这个内容。
     

trim只会对里面的子内容进行操作。如果子内容为空则不进行任何操作。后添加的内容会有空格。

特例:

如果内部字符串为要去掉的字符串,去掉后认为内容不为空,prefix依然添加。

4. where标签

where标签属于trim标签的简化版,被where标签包含的内容具备:

  • 如果里面内容不为空串,在里面内容最前面添加where。

  • 如果里面内容是以and开头,去掉最前面的and。

5. set标签

set标签是专门用在修改SQL中的,属于trim的简化版,带有下面功能:

  • 如果子内容不为空串,在最前面添加set。

  • 去掉最后一个逗号。

6. foreach标签

foreach标签表示循环,主要用在in查询或批量新增的情况。

foreach标签的属性解释说明:

  • collection:要遍历的数组或集合对象。(如果参数没有使用@Param注解:arg0或array或list。. 如果使用@Param注解,使用注解的名称或param1。 )
  • open:遍历结束在前面添加的字符串。
  • close:遍历结束在后面添加的字符串。
  • item:迭代变量。在foreach标签里面#{迭代变量}获取到循环过程中迭代变量的值。
  • separator:分隔符。在每次循环中间添加的分割字符串。
  • index:迭代的索引。从0开始的数字。
  • nullable:是否允许数组或集合对象为null。如果设置为true,表示集合或数组允许为null。如果设置为false表示不允许数组或集合对象为null,一旦为null会出现异常。

7. bind标签(拼接使用)

bind标签表示对传递进来的参数重新赋值。最多的使用场景为模糊查询。通过bind可以不用在Java代码中对属性添加%。

8. sql和include标签

MyBatis的sql标签用于定义SQL片段,include标签用于引用sql标签定义的片段。

七、MyBatis中常用注解

八、多表查询(面试题)

1. 介绍

  • 在学习MyBatis多表查询时其实就是在学习<association>标签和<collection>标签。

                  1.如果一个实体类关联另一个实体类的一个对象使用<association>

                  2.如果一个实体类关联一个实体类的List集合对象,需要使用<collection>

  • 这两个标签根据编写的SQL,分为N+1查询和联合查询两种方式。

2. 联合查询方式

<mapper namespace="com.bjsxt.mapper.EmpMapper"><!-- 每行数据最终返回的是Emp对象 --><resultMap id="empMap" type="Emp"><id column="e_id" property="id"/><result column="e_name" property="name"/><!-- 单个对象类型属性,使用association进行填充 --><!-- property:对象名   javaType:对象类型,支持别名--><association property="dept" javaType="Dept"><!-- 对属性对象里面的属性配置映射关系 --><id column="d_id" property="id"/><result column="d_name" property="name"/></association></resultMap><!-- 使用resultMap配置结果集映射 --><select id="seletAll" resultMap="empMap">select d_id,d_name,e_id,e_name,e_d_id from dept d,emp e where d.d_id=e.e_d_id</select>
</mapper>

3. N+1查询方式

N+1查询方式命名由来:当查询Emp表中N条数据时,需要编写1条查询全部的SQL和N条根据外键列值作为另一张表主键查询条件的N条SQL语句。

<resultMap id="deptMap2" type="Dept"><id column="d_id" property="id"></id><result column="d_name" property="name"></result>
</resultMap>
<select id="selectById" resultMap="deptMap2">select * from dept where d_id=#{id}
</select><resultMap id="empMap2" type="Emp"><id column="e_id" property="id"/><result column="e_name" property="name"/><!-- 此处依然使用association填充单个对象属性值.property和javaTye依然需要写 --><!-- select 调用另一个查询的路径,同一个映射文件中,前面namespace可以省略--><!-- column: 当前SQL查询结果哪个列值当做参数传递过去。如果是多个参数{"key":column,"key2":column2}--><association property="dept" javaType="Dept" select="com.bjsxt.mapper.DeptMapper.selectById" column="e_d_id"></association>
</resultMap><select id="selectAllN1" resultMap="empMap2">select e_id,e_name,e_d_id from emp
</select>

九、延迟加载(面试题)

延迟加载只能出现在多表联合查询的N+1方式中。表示当执行当前方法时,是否立即执行关联方法的SQL。

配置延迟加载:

         全局配置。整个项目所有N+1位置都生效。

           局部配置。只配置某个N+1位置。

两种方式需要选择其中一种,如果两种方式都使用了,局部配置方式生效。

1.全局配置方式

<settings><setting name="lazyLoadingEnabled" value="true"/>
</settings>

2.局部配置方式

局部配置方式需要在collection或association标签中配置fetchType属性。fetchType可取值:lazy(延迟加载)和earge(立即加载)。

当配置了fetchType属性后,全局settings的配置被覆盖,对于当前标签以fetchType属性值为准。

十、缓存(面试题)

1. 缓存介绍

MyBatis的缓存将相同查询条件的SQL语句执行一遍后所得到的结果存在内存或者某种缓存介质当中,当下次遇到一模一样的查询SQL时候不在执行SQL与数据库交互,而是直接从缓存中获取结果。

MyBatis分为一级缓存和二级缓存,同时也可配置关于缓存设置。

  1. 一级存储是SqlSession上的缓存。

  2. 二级缓存是在SqlSessionFactory(namespace)上的缓存。

  3. 默认情况下,MyBatis开启一级缓存,没有开启二级缓存。当数据量大的时候可以借助一些第三方缓存框架或Redis缓存来协助保存Mybatis的二级缓存数据。

2. 一级缓存

一级缓存想要生效,必须同时满足3个条件:

        1. 同一个SqlSession对象。

        2. 同一个select标签。本质为底层同一个JDBC的Statemen对象。

        3. 完全相同的SQL,包含SQL的参数值也必须相同。

        4. insert、delete、update操作会清空一级缓存数据。

        5. close(),commit也会清空缓存。

2.1 一级缓存流程图

命中缓存:从Map中查询是否存在指定key。如果存在表示命中缓存,如果不存在这个key,需要访问数据库。

更新到缓存:把查询结果put到map中。

3. 二级缓存

3.1 二级缓存介绍

 二级缓存是以namespace为标记的缓存,可能要借助磁盘,磁盘上的缓存,可以由一个SqlSessionFactory创建的SqlSession之间共享缓存数据,默认并不开启。

二级缓存生效条件:

  1. 同一个SqlSessionFactory对象。

  2. 同一个方法(<select>)。

  3. SQL完全相同

重要提示:

二级缓存默认不开启,需要手动开启。只有当SqlSession执行commit或close时才会存储到二级缓存中。

3.2 配置二级缓存生效 

1.全局开关:在mybatis.xml文件中的<settings>标签配置开启二级缓存。

<settings><setting name="cacheEnabled" value="true"/>
</settings>

2.分开关:在要开启二级缓存的mapper文件中开启缓存。使用<cache/>配置时,注解的查询无法缓存。

  1. <mapper namespace="com.bjsxt.mapper.EmpMapper"><cache/>
    </mapper>

3.二级缓存未必完全使用内存,有可能占用硬盘存储,缓存中存储的JavaBean对象必须实现序列化接口

public class Dept implements  Serializable {  }

4.重要总结

  1. 查询数据顺序 二级-->一级--->数据库--->把数据保存到一级 --->把数据保存到二级(临时),当sqlsession关闭或者提交的时候,把数据刷新到二级缓存(非临时)中。

  2. 执行了DML操作、close()、commit() ,会清空一级缓存,所以数据变更不可能到达二级缓存中。

十一、四大核心接口介绍及执行流程(面试题)

1. 四大核心接口介绍

  1. Executor执行器,执行器负责整个SQL执行过程的总体控制。默认SimpleExecutor执行器。

  2. StatementHandler语句处理器,语句处理器负责和JDBC层具体交互,包括prepare语句,执行语句,以及调用ParameterHandler.parameterize()。默认是PreparedStatementHandler。

  3. ParameterHandler参数处理器,参数处理器,负责PreparedStatement入参的具体设置。默认使用DefaultParameterHandler。

  4. ResultSetHandler结果集处理器,结果处理器负责将JDBC查询结果映射到java对象。默认使用DefaultResultSetHandler。

2. 执行顺序

(1)使用执行器Executor控制整个执行流程

(2)实例化StatementHandler,进行SQL预处理

(3)使用ParameterHandler设置参数

(4)使用StatementHandler执行SQL

(5)使用ResultSetHandler处理结果集

3.Executor执行器类型(面试题)

  1. BaseExecutor:主要是使用了模板设计模式,共性被封装在 BaseExecutor 中,容易变化的内容被分离到了子类中 。

    1. SimpleExecutor:默认的执行器类型。每次执行query和update(DML)都会重新创建Statement对象。

    2. ReuseExecutor:执行器会重用预处理语句。不会每一次调用都去创建一个新的 Statement 对象,而是会重复利用以前创建好的(如果SQL相同的话)。

    3. BatchExecutor:用在update(DML)操作中。所有SQL一次性提交。适用于批量操作。

  2. CachingExecutor:处理缓存的执行器。无论使用上面三种执行器中的哪个。都是会执行CachingExecutor。

十二、MyBatis执行原理详解(较常见面试题)

  1. 首先加载全局配置文件为输入流,交给XPathParser解析器解析为Document文档对象,然后使用DOM解析Document文档对象,把解析结果存放在Configuration配置类中。
  2. 通过DefaultSqlSessionFactory实例化工厂,实例SqlSession的对象。创建了SqlSession接口的实现类DefaultSqlSession对象,在创建过程中,会同时创建Transaction事务对象、Executor执行器对象。如果当前项目有Interceptor拦截器,创建执行器时会执行拦截器。
  3. 通过JDK提供的Proxy创建接口的动态代理对象。
  4. 可以通过接口的代理对象调用方法。在调用方法时MyBatis会根据方法的类型判断调用SqlSession的哪个方法。例如:selectList、selectOne、update、insert等。
  5. 确定好具体调用SqlSession的哪个方法后,会按照执行器类型执行MyBatis四大核心接口,执行时也会触发拦截器Interceptor。最终会返回SQL的执行结果。
  6. 执行完方法后需要提交事务,提交时清空缓存、清除存储的Statement对象。
  7. 最后关闭SqlSession对象,释放资源。

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

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

相关文章

<C++> list模拟实现

目录 前言 一、list的使用 1. list的构造函数 2. list iterator的使用 3. list capacity 4. list modifiers 5. list的算法 1. unique​ 2. sort 3. merge 4. remove 5. splice 二、list模拟实现 1. 设置节点类 && list类 2. push_back 3. 迭代器 重载 * 重载前置 …

小型洗衣机好用吗?最好用的迷你洗衣机

很多人会觉得小型洗衣机是智商税&#xff0c;没有必要专门买一个小型洗衣机来洗内衣&#xff0c;洗个内衣只需要两分钟的事情&#xff0c;需要花个几百块钱去入手一个洗衣机吗&#xff1f;然而清洗贴身衣物的并不是一件简单的事情&#xff0c;如果只是简单的搓洗&#xff0c;内…

基于安卓android微信小程序的物流仓储系统

项目介绍 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个开发过程首先对物流仓储系统进行需求分析&#xff0c;得出物流仓储系统主要功能。接着对物流仓储系统进行总体设计和详细…

安科瑞故障电弧探测器在建筑电气的设计与应用

安科瑞 崔丽洁 【摘要】&#xff1a;电气设备是建筑中不可缺少的一部分&#xff0c;具有较为重要的作用和意义&#xff0c;在应用过程中不仅能够提升建筑本身实用性能&#xff0c;而且可为消费者提供更加优良的生活环境。但设备一旦在运行过程中出现故障&#xff0c;不仅会影响…

JDBC(二)

第4章 操作BLOB类型字段 4.1 MySQL BLOB类型 MySQL中&#xff0c;BLOB是一个二进制大型对象&#xff0c;是一个可以存储大量数据的容器&#xff0c;它能容纳不同大小的数据。 插入BLOB类型的数据必须使用PreparedStatement&#xff0c;因为BLOB类型的数据无法使用字符串拼接写…

Webpack 中 loader 的作用是什么?常用 loader 有哪些?

说说webpack中常见的Loader&#xff1f;解决了什么问题&#xff1f;- 题目详情 - 前端面试题宝典 1、loader 是什么 loader是 webpack 最重要的部分之一。 通过使用不同的 loader&#xff0c;我们能够调用外部的脚本或者工具&#xff0c;实现对不同格式文件的处理。 loader…

Libra R-CNN: Towards Balanced Learning for Object Detection(2019.4)

文章目录 AbstractIntroduction引入问题1&#xff09; Sample level imbalance2) Feature level imbalance3) Objective level imbalance进行解决贡献 Related Work&#xff08;他人的work&#xff0c;捎带与我们的对比&#xff09;Model architectures for object detection&a…

23个优秀开源免费BI仪表盘

BI也称为商业智能&#xff0c;是收集、分析和展示数据以支持决策者做出明智的业务决策的过程。BI帮助组织将其原始的生产数据转化为有意义的见解或者知识&#xff0c;以推动其业务战略。BI能够为组织改善决策、提高效率和提升资源利用率。 BI仪表盘是BI系统的重要组成部分&…

【安卓13】谷歌原生桌面launcher3源码修改,修改桌面布局(首屏应用、小部件、导航栏、大屏设备任务栏)

前言 近期接到一个关于谷歌EDLA认证的需求&#xff0c;我负责的是谷歌原生桌面布局的修改&#xff0c;通过研究源码&#xff0c;将涉及到了一些修改思路发出来&#xff0c;大家可以参考一下有没有对你有用的信息。主要修改内容有&#xff1a; 1、搜索栏、底部导航栏未居中 2、…

【华为数通HCIP | 网络工程师】821-BGP 组播高频题与解析(1)

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

史上第一款AOSP开发的IDE (支持Java/Kotlin/C++/Jni/Native/Shell/Python)

ASFP Study 史上第一款AOSP开发的IDE &#xff08;支持Java/Kotlin/C/Jni/Native/Shell/Python&#xff09; 类似于Android Studio&#xff0c;可用于开发Android系统源码。 Android studio for platform&#xff0c;简称asfp(爱上富婆)。 背景&下载&使用 背景 由…

基于斑马算法的无人机航迹规划-附代码

基于斑马算法的无人机航迹规划 文章目录 基于斑马算法的无人机航迹规划1.斑马搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用斑马算法来优化无人机航迹规划。 1.斑马搜索算法 …

docker 构建并运行 python项目

此处不重述docker安装及基本命令&#xff0c;可参考另一篇文章centos7 安装 docker_centos7 docker network rm-CSDN博客文章浏览阅读111次。1、 1.1 docker 官网 Empowering App Development for Developers | DockerLearn how Docker helps developers bring their ideas to …

【文献分享】NASA JPL团队CoSTAR一大力作:直接激光雷达里程计:利用密集点云快速定位

论文题目&#xff1a;Direct LiDAR Odometry: Fast Localization With Dense Point Clouds 中文题目&#xff1a;直接激光雷达里程计:利用密集点云快速定位 作者&#xff1a;Kenny Chen, Brett T.Lopez, Ali-akbar Agha-mohammadi 论文链接&#xff1a;https://arxiv.org/pd…

C语言求解:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位(约瑟夫问题)

完整代码&#xff1a; /* 有n个人围成一圈&#xff0c;顺序排号。从第一个人开始报数&#xff08;从1到3报数&#xff09;&#xff0c;凡报到3的人 退出圈子&#xff0c;问最后留下的是原来第几号的那位*/ #include<stdio.h>//约瑟夫问题 //递推关系f(n)(f(n-1)2)\mod n…

为什么说软文推广中了解用户是关键?

数字化时代下软文成为众多企业推广品牌的方式之一&#xff0c;所谓软文&#xff0c;就是指以向用户提供信息&#xff0c;并将产品隐含在信息中的柔性手段。 想要使软文效果明显&#xff0c;就必须深入了解用户&#xff0c;把握其需求、兴趣和行为特点&#xff0c;这也是今天媒…

【开源三方库】Easyui:基于OpenAtom OpenHarmony ArkUI深度定制的组件框架

万冬阳 公司&#xff1a;中国科学院软件所 小组&#xff1a;知识体系工作组 简介 Easyui是一套基于ArkTS语言开发的轻量、可靠的移动端组件库&#xff0c;它是对OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09; ArkUI进行深度定制的组件框架。Easyui可扩…

KaiwuDB x 奇瑞超级工厂 | 汽车行业能源管理平台成功实践

随着碳达峰、碳中和战略的逐步深化&#xff0c;我国正经历着广泛而深刻的经济社会系统性变革。其中&#xff0c;工业制造是推进能源绿色低碳发展的重要战场&#xff0c;通过数字化转型助推工业制造能源管理向绿色低碳发展&#xff0c;是“双碳”目标下工业制造业转型升级面临的…

一招解密网络流量瓶颈!

前言 我们曾介绍过观测云提供全面的基础设施监测方案&#xff08;参见《全方位监控基础设施&#xff0c;坚实守护您的业务稳定&#xff01;》&#xff09;&#xff0c;能够高效全面地帮助您实时观测所有的基础设施对象及云产品等&#xff0c;赋能您的业务稳定发展。今天我们将…

前端训练营:1v1私教,帮你拿到满意的offer

Hello&#xff0c;大家好&#xff0c;我是 Sunday。 熟悉我的小伙伴都知道&#xff0c;我最近这几年一直在做前端教育相关的工作。因为这类工作的原因&#xff0c;让我深刻的感受到这几年整个互联网行业的变化。 大量的公司裁员&#xff0c;导致找工作的人急速增加&#xff0…