前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java Mybatis基础知识总结

Java Mybatis基础知识总结

作者头像
赵哥窟
发布2021-05-19 14:29:57
1.6K0
发布2021-05-19 14:29:57
举报
文章被收录于专栏:日常技术分享日常技术分享

●谈一谈你对ORM的理解?

对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中。当然反过来也是可以的,例如将数据库表当中的记录查询出来,然后映射为Java程序中的Java对象。

● 在MyBatis中#{}和${}的区别?

"#{}是预编译处理,${}是字符串替换"。 Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值; Mybatis在处理时#{},就是把{}替换成变量的值。 使用#{}可以有效的防止SQL注入,提高系统安全性。

● 你对MyBatis的一级缓存和二级缓存有了解吗,说一下?

Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存,一级缓存只是相对于同一个SqlSession而言。所以在参数SQL完全一样的情况下,我们使用同一个SqlSession对象调用一个Mapper方法,往往只执行一次SQL,因为使用SqlSession第一次查询后,MyBatis会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession都会取出当前缓存的数据,而不会再次发送SQL到数据库。

MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能。SqlSessionFactory层面上的二级缓存默认是不开启的,二级缓存的开启需要进行配置,实现二级缓存的时候,MyBatis要求返回的POJO必须是可序列化的。 也就是要求实现Serializable接口,配置方法很简单,只需要在映射XML文件配置就可以开启缓存了。

由于我们在实际的开发中目前都会使用第三方的缓存技术,例如Redis,所以MyBatis这块的二级缓存没有太多的了解。

● MyBatis一对多你是怎么实现的?

有联合查询和嵌套查询。联合查询是几个表联合查询,只查询一次,通过在resultMap里面配 置collection节点配置一对多的类就可以完成; 嵌套查询是先查一个表,根据这个表里面的结果的外键id再去另外一个表里面查询数据,也是通过配置collection,但另外一个表的查询通过select节点配置。

● MyBatis的parameterType怎么理解的?

parameterType属性用来指定参数类型,parameterType属性是专门用来给sql语句占位符#{}传值的,底层原理使用了反射机制,#{}的大括号当中需要提供实体类的属性名,底层使用属性名拼接get方法来获取属性值,将属性值传递给sql语句。

● MyBatis的resultType是怎么理解的?

resultType用来指定结果集封装的数据类型,当一个select语句查询之后得到结果集,结果集的列名需要和java实体类的属性名一致,不一致的可以使用as关键字给列起别名,拿着列名拼接set方法,通过反射机制调用set方法给结果集对象的属性赋值。

● MyBatis中resultMap用过吗,它是干什么的?

在MyBatis当中,查询结果集被封装为Java对象,可以通过resultType,也可以通过resultMap,在resultMap当中描述了数据库表的列与Java对象的属性之间的对应关系。在映射关系中,还可以通过resultMap的typeHandler设置实现查询结果值的类型转换。另外,最重要的是通过resultMap的子标签比如、等,可以实现一对一、一对多等的映射。

● MyBatis底层实现原理?

MyBatis是一个持久层框架,实现了ORM思想,可以将查询的结果集自动转换成Java对象,也可以将Java对象转换成一条数据插入到数据库表当中。

那么,查询结果集是如何自动转换成Java对象的呢?实际上这里使用了反射机制,在配置文件中假设编写了一条select语句,查询之后,列名与属性名要一一对应(不对应的可以采用给列起别名),然后每个列名前添加“set”,通过反射机制获取set方法,然后再通过反射机制的method.invoke()来调用这个set方法,给Java对象的属性赋值。这样就完成了对象的封装。

另外,Java对象是如何转换成一条记录插入到数据库的呢?假设在配置文件中编写了一条insert语句,那么这条语句需要的值从哪里来呢,在mybatis的mapper配置中有parameterType属性,该属性是专门给sql语句占位符传值的,其实这里也是使用了反射机制,其中sql语句的占位符采用#{},其中大括号当中需要提供java对象的属性名,该属性名和get进行拼接得到get方法名,然后通过反射机制获取该get方法,再通过method.invoke()来调用这个get方法,这样就可以获取到对应的属性值,然后传入了。

其实MyBatis设计最牛的地方当然是采用JDK动态代理的方式生成DAO接口的实现类了。其中DAO接口中的每一个方法名对应sql语句的id。DAO接口中的方法不允许重载,因为id是不允许重复的。以上大概就是我了解的MyBatis实现原理。

● 谈谈MyBatis和Hibernate的区别?

Hibernate属于全自动ORM映射框架,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。

也正因为MyBatis的sql语句由程序员自己编写,所以sql更容易优化,这也是目前互联网公司使用MyBatis较多的重要原因。

● MyBatis中除了常见的select|insert|update|delete标签之外,还有哪些标签? 还有很多其他的标签,加上动态sql的9个标签,trim|where|set|foreach|if|choose|when|otherwise|bind等,其中为sql片段标签,通过标签引入sql片段,为不支持自增的主键生成策略标签。

● 在MyBatis当中,通常一个Mapper映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?

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

● MyBatis注解用过吗,都有哪些?

到目前为止,我们在项目中还没有使用过MyBatis的注解,因为MyBatis最主要是编写sql语句,sql语句涉及到后期优化,可能会频繁修改,所以我们一直都在使用配置文件的形式。

● Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理吗?

Mybatis动态sql可以让我们在Xml映射文件内以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能,Mybatis提供了9种动态sql标签trim|where|set|foreach|if|choose|when|otherwise|bind。其执行原理为,使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能。

● Mybatis是如何将sql执行结果封装为目标对象并返回的?

第一种是使用resultMap,逐一定义列名和对象属性名之间的映射关系。 第二种是使用resultType,使用sql列的别名功能,将列别名书写为对象属性名。

● MyBatis接口Mapper中的方法能够重载吗?

不能。MyBatis使用package+Mapper+method全限名作为key,去xml内寻找唯一sql来执行的。类似:key=x.y.UserMapper.getUserById,那么,重载方法时将导致矛盾。对于Mapper接口,Mybatis禁止方法重载(overload)。

● 在MyBatis当中,给sql语句传值,你知道哪几种方式?

通过POJO(Javabean)可以传值,但要求#{}的大括号当中提供POJO的属性名。如果没有合适的POJO,可以使用Map集合进行传值,但要求#{}的大括号当中提供Map集合的key。如果DAO接口的方法参数有多个,并且数量不多,而且每个都是简单类型,也可以通过#{arg0}、#{arg1}的方式传参。

●Mybatis是如何进行分页的?分页插件的原理是什么? Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。 分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档