Java经典面试题汇总:Mybatis

目录
  • 1. MyBatis 中 #{}和 ${}的区别是什么?
  • 2. MyBatis 有几种分页方式?
  • 3. MyBatis 逻辑分页和物理分页的区别是什么?
  • 4. MyBatis 是否支持延迟加载?延迟加载的原理是什么?
  • 5. 说一下 MyBatis 的一级缓存和二级缓存?
  • 6. MyBatis 有哪些执行器(Executor)?
  • 7. MyBatis 分页插件的实现原理是什么?
  • 8. MyBatis如何返回主键?
  • 9. Xml映射文件中,除了常见的select|insert|update|delete标签之外,还有哪些标签?
  • 10. MyBatis 和 Hibernate 的区别有哪些?
  • 总结

1. MyBatis 中 #{}和 ${}的区别是什么?

#{}是预编译处理,${}是字符替换。 在使用 #{}时,MyBatis 会将 SQL 中的 #{}替换成“?”, 配合 PreparedStatement 的 set 方法赋值,这样可以有效的防止 SQL 注入,保证程序的运行安全。

2. MyBatis 有几种分页方式?

逻辑分页: 使用 MyBatis 自带的 RowBounds 进行分页,它是一次性查询很多数据,然后在数据中再进行检索。

物理分页: 自己手写 SQL 分页或使用分页插件 PageHelper,去数据库查询指定条数的分页数据的形式。

3. MyBatis 逻辑分页和物理分页的区别是什么?

逻辑分页是一次性查询很多数据,然后再在结果中检索分页的数据。这样做弊端是需要消耗大量的内存、有内存溢出的风险、对数据库压力较大。

物理分页是从数据库查询指定条数的数据,弥补了一次性全部查出的所有数据的种种缺点,比如需要大量的内存,对数据库查询压力较大等问题。

4. MyBatis 是否支持延迟加载?延迟加载的原理是什么?

MyBatis 支持延迟加载,设置 lazyLoadingEnabled=true 即可。 延迟加载的原理的是调用的时候触发加载,而不是在初始化的时候就加载信息。 比如调用 a. getB(). getName(),这个时候发现 a. getB() 的值为 null,此时会单独触发事先保存好的关联 B 对象的 SQL, 先查询出来 B,然后再调用 a. setB(b),而这时候再调用 a. getB(). getName() 就有值了,这就是延迟加载的基本原理

5. 说一下 MyBatis 的一级缓存和二级缓存?

一级缓存:基于 PerpetualCache 的 HashMap 本地缓存,它的声明周期是和 SQLSession 一致的,有多个 SQLSession 或者分布式的环境中数据库操作,可能会出现脏数据。当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认一级缓存是开启的。

二级缓存:也是基于 PerpetualCache 的 HashMap 本地缓存,不同在于其存储作用域为 Mapper 级别的,如果多个SQLSession之间需要共享缓存,则需要使用到二级缓存,并且二级缓存可自定义存储源,如 Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现 Serializable 序列化接口(可用来保存对象的状态)。 开启二级缓存数据查询流程:二级缓存 -> 一级缓存 -> 数据库。 缓存更新机制:当某一个作用域(一级缓存 Session/二级缓存 Mapper)进行了C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。

6. MyBatis 有哪些执行器(Executor)?

MyBatis 有三种基本的Executor执行器:

  • SimpleExecutor:每执行一次 update 或 select 就开启一个 Statement 对象,用完立刻关闭 Statement 对象;
  • ReuseExecutor:执行 update 或 select,以 SQL 作为 key 查找 Statement 对象,存在就使用,不存在就创建,用完后不关闭 Statement 对象,而是放置于 Map 内供下一次使用。简言之,就是重复使用 Statement 对象;
  • BatchExecutor:执行 update(没有 select,jdbc 批处理不支持 select),将所有 SQL 都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个 Statement 对象,每个 Statement 对象都是 addBatch()完毕后,等待逐一执行 executeBatch()批处理,与 jdbc 批处理相同

7. MyBatis 分页插件的实现原理是什么?

分页插件的基本原理是使用 MyBatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的 SQL,然后重写 SQL,根据 dialect 方言,添加对应的物理分页语句和物理分页参数。

8. MyBatis如何返回主键?

核心在于 useGeneratedKeys和keyProperty属性

<mapper namespace="org.chench.test.mybatis.mapper">
    <!-- 插入数据:返回记录主键id值 -->
    <insert id="insertOneTest" parameterType="org.chench.test.mybatis.model.Test" useGeneratedKeys="true" keyProperty="id" >
        insert into test(name,descr,url,create_time,update_time)
        values(#{name},#{descr},#{url},now(),now())
    </insert>
</mapper>

9. Xml映射文件中,除了常见的select|insert|update|delete标签之外,还有哪些标签?

还有很多其他的标签例如 sql|cach等...,加上动态sql的9个标签,trim|where|set|foreach|if|choose|when|otherwise|bind等,其中为sql片段标签,通过标签引入sql片段,为不支持自增的主键生成策略标签。

10. MyBatis 和 Hibernate 的区别有哪些?

  • 灵活性:MyBatis 更加灵活,自己可以写 SQL 语句,使用起来比较方便。
  • 可移植性:MyBatis 有很多自己写的 SQL,因为每个数据库的 SQL 可以不相同,所以可移植性比较差。
  • 学习和使用门槛:MyBatis 入门比较简单,使用门槛也更低。
  • 二级缓存:hibernate 拥有更好的二级缓存,它的二级缓存可以自行更换为第三方的二级缓存。

总结

本篇文章就到这里了,希望能给你带来帮助,也希望你能给多多关注我们的更多内容!

(0)

相关推荐

  • Java面试题冲刺第九天--MyBatis

    目录 面试题1:你怎么理解ORM框架,常见的ORM框架都有哪些? 正经回答: 追问1:大家都在用Mybatis,Mybatis都有哪些优势? 面试题2:相比较Hibernate与Mybatis,你有哪些看法? 正经回答: 面试题3:Mybatis中的#{}和${}有哪些区别 正经回答: 深入追问: 追问1:什么是sql注入? 追问2:mybatis是如何做到防止sql注入的? 总结 面试题1:你怎么理解ORM框架,常见的ORM框架都有哪些? 正经回答: 对象关系映射(Object Relatio

  • Java面试题冲刺第九天--MyBatis2

    目录 面试题1:说说你对Mybatis的理解? 追问1:说一下MyBatis的工作原理和流程吧. 追问2:列举几个MyBatis的核心组件,说说分别干啥用? 面试题2:(问几个实际使用的问题)Mybatis动态sql是做什么的?都有哪些动态sql? 追问1:Xml映射文件中,除了常见的select|insert|updae|delete标签之外,你还常用哪些标签? 追问2:Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式? 追问3:MyBatis中接口绑定你都用过哪几

  • Java持久层框架Mybatis入门详细教程

    mybatis介绍 mybatis它是轻量级持久层框架,由ibatis演化而来.它自动连接数据库,将数据库的结果集封装到对象中POJO. POJO: 一个简单的Java类,这个类没有实现/继承任何特殊的java接口或者类,不遵循任何主要java模型,约定或者框架的java对象.在理想情况下,POJO不应该有注解. JavaBean: JavaBean是可序列化的,实现了serializable接口 具有一个无参构造器 有按照命名规范的set和gett,is(可以用于访问布尔类型的属性)方法 My

  • JAVA MyBatis入门学习过程记录

    目录 一.Mybatis 1.mybatis-config.xml 2.Mapper.xml 3.db.properties 4.MybatisUtils工具类 5.多对一AND多对一: 6.使用注解开发 7.自定义缓存:ehcache 8.mybatis 其他工具 二.MAVEN资源导出错误解决 三.常用依赖导入 四.LOG4J 1.log4j.properties 配置文件 2.log4j 在mybatis-config.xml的配置 3.使用场景 好用的插件: 1.lombok 总结 一.

  • 一篇文章告诉你JAVA Mybatis框架的核心原理到底有多重要

    目录 持久层的那些事 什么是 JDBC JDBC 原理 什么是 Mybatis Mybatis 与 JDBC 的关系 SqlSession SqlSessionFactory SqlSessionFactoryBuilder Configuration MappedStatement Executor ParameterHandler StatementHandler ResultSetHandler Interceptor Mybatis 关键词说明 Mybatis 架构设计 基础支持层 反射

  • Java经典面试题汇总:Mybatis

    目录 1. MyBatis 中 #{}和 ${}的区别是什么? 2. MyBatis 有几种分页方式? 3. MyBatis 逻辑分页和物理分页的区别是什么? 4. MyBatis 是否支持延迟加载?延迟加载的原理是什么? 5. 说一下 MyBatis 的一级缓存和二级缓存? 6. MyBatis 有哪些执行器(Executor)? 7. MyBatis 分页插件的实现原理是什么? 8. MyBatis如何返回主键? 9. Xml映射文件中,除了常见的select|insert|update|d

  • Java经典面试题汇总:Spring

    目录 1. 什么是Spring? 有哪些优点? 2. 什么是 AOP? 3. 什么是 IOC? 4. 什么是 DI? 5. Spring 有哪些核心模块? 6. Spring 常用的注入方式有哪些? 7. Spring 中的 Bean 是线程安全的吗? 8. Spring中Bean的作用域有哪些? 9. @Qualifier 注解 10. @Resource与@Autowired注解的区别? 11. Spring底层两种动态代理实现原理及区别? 12. Spring 事务实现方式有哪些? 13.

  • Java经典面试题汇总--多线程

    目录 1. 并行和并发有什么区别? 2. 线程和进程的区别? 3. 守护线程是什么? 4. 实现多线程的方式有哪些? 5. 说一下 runnable 和 callable 有什么区别? 6. sleep() 和 wait() 有什么区别? 7. 线程有哪些状态? 8. notify()和 notifyAll()有什么区别? 9. 线程的 run() 和 start() 有什么区别? 10. 创建线程池有哪几种方式? 11. 线程池中 submit() 和 execute() 方法有什么区别? 1

  • Java经典面试题汇总:Spring Boot

    目录 1. 什么是 Spring Boot? 2. 为什么要用 Spring Boot? 3. Spring Boot 核心配置文件是什么? 4. Spring Boot 提供了哪些常用的 Starter Project Options? 5. 如何快速构建一个Spring Boot项目? 6. Spring Boot默认的内置Web服务器是什么? 7. Spring Boot常用注解及其作用? 8. 如何使用配置文件通过 Spring Boot 配置特定环境的配置? 总结 1. 什么是 Spr

  • Java经典面试题汇总:Spring MVC

    目录 1. 什么是Spring MVC ? 2. Spring MVC 有哪些组件? 3. 说一下 Spring MVC 运行流程? 4. Spring MVC的优点: 5. @RequestMapping 的作用是什么? 6. 如果在拦截请求中,我想拦截get方式提交的方法,怎么配置? 7. SpringMVC常用的注解有哪些? 8. SpingMvc中的控制器的注解一般用那个,有没有别的注解可以替代? 9. Spring MVC和Struts2的区别有哪些? 10. 怎么样在方法里面得到Re

  • Java经典面试题汇总:异常

    目录 1. Java的异常机制 2. Java如何自定义异常? 3. throw 和 throws 的区别? 4. Java 中被检查的异常和不受检查的异常有什么区别? 5. final.finally.finalize 有什么区别? 6. try-catch-finally 中哪个部分可以省略? 7. try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗? 8. Java 中什么时候使用断言? 9. 运行时异常与一般异常有何异同? 10.

  • Java经典面试题汇总:JVM

    目录 1. 说一下 JVM 的主要组成部分?及其作用? 2. 说一下 JVM 运行时数据区? 3. 说一下堆栈的区别? 4. 解释内存中的栈(stack).堆(heap)和静态区(static area)的用法 5. 类的生命周期 6. Java对象创建过程 7. 怎么判断对象是否可以被回收? 8. 什么是类加载器? 9. 什么是双亲委派模型? 10. 说一下类装载的执行过程? 11. Java 中都有哪些引用类型? 12. JVM 有哪些垃圾回收算法? 13. JVM 有哪些垃圾回收器? 14

  • Java经典面试题汇总:Java Web

    目录 1. JSP 和 servlet 有什么区别? 2. 什么是Tomcat? 3. Tomcat容器是如何创建Servlet类实例?用到了什么原理? 4. 拦截器和过滤器的区别? 5.说一下 JSP 的 4 种作用域? 6. JSP 有哪些内置对象?作用分别是什么? 7. Servlet的生命周期 8. session 和 cookie 有什么区别? 9. 说一下 session 的工作原理? 10. 如果客户端禁止 cookie 能实现 session 还能用吗? 11. JSP工作原理?

  • Java经典面试题汇总:网络编程

    目录 1. HTTP 响应码 301 和 302 代表的是什么?有什么区别? 2. 简单说一下http协议? 3. HTTP与HTTPS的区别? 4. HTTP协议下客户端请求报文是什么? 5. HTTP协议服务器响应报文有哪些? 6. HTTP协议中的请求方法有哪些? 7. 常见的HTTP状态码有哪些? 8. forward 和 redirect 的区别? 9. 简述 tcp 和 udp的区别? 10. TCP 为什么要三次握手,两次不行吗?为什么? 11. 说一下 TCP 粘包是怎么产生的?

  • Java经典面试题最全汇总208道(四)

    目录 前言 126.Spring 框架中的单例 Beans 是线程安全的么? 127.请解释 Spring Bean 的自动装配? 129.什么是 Spring Batch? 130.spring mvc 和 struts 的区别是什么? 131.请举例解释@Required 注解? 132.Spring常用注解 133.项目中是如何实现权限验证的,权限验证需要几张表 134.谈谈controller,接口调用的路径问题 135.如何防止表单重复提交 136.Spring中都应用了哪些设计模式

随机推荐