ELEVEN------MyBatis

142 阅读7分钟

1、#{ }和${ }的区别是什么?
在Mybatis中,有两种占位符:

#{}是预编译处理,解析传递进来的参数数据。  
MyBatis在处理#{ }时,会将SQL中的#{ }替换为?号,使用PreparedStatement的set方法来赋值


${}是字符串替换,Mybatis在处理 ${}时,就是把${}替换成变量的值; 
//MyBatis排序时使用order by 动态参数时需要注意,用$而不是#;
比如分页查询用到${}:order by sid limit ${(page-1)*rows},${rows}

使用#{}可以有效的防止SQL注入,提高系统安全性

(预编译是提前对SQL语句进行编译,而其后注入的参数将不会再进行SQL编译。我们知道,
  SQL注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作。
  而预编译机制则可以很好的防止SQL注入)
  

2、如何理解Mybatis?(Mybatis是什么)

• Mybatis是一个半自动化的ORM框架。

• Mybatis内部封装了jdbc,开发者只需要关注Sql语句本身,而不需要花费精力去处理加载驱动、
  创建连接、创建statement等繁杂的过程。   

• Mybatis需要手写Sql语句,对jdbc的封装程度不如Hibernate,但因此也灵活得多。  [ˈhaɪbəneɪt]

3、在mapper中如何传递多个参数?
第一种:使用占位符按顺序传参,#{}里面的数字代表你传入参数的顺序。

第二种:使用@Param注解传参,#{}里面的名称对应的是注解@Param括号里面修饰的名称。

第三种:使用Map集合传参,#{}里面的名称对应的是Map里面的key名称。

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

• Mybatis的动态Sql可以让我们在xml映射文件内,以标签的形式编写动态Sql,完成逻辑判断和动态拼接Sql的功能。

• Mybatis 提供了 9 种动态Sql标签:
<if/>、<choose/>、<when/>、<otherwise/>、<trim/>、<when/>、<set/>、<foreach/>、<bind/>

• 其执行原理简单的说:就是使用OGNL从Sql参数对象中计算表达式的值,根据表达式的值动态拼接Sql。(OGNL,是应用于Java中的一个开源的表达式语言)

6、Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?

如果配置了namespace那么当然是可以重复的,因为我们的Statement实际上就是namespace+id 如果没有配置namespace的话,那么相同的id就会导致覆盖了

7、为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?

Mybatis在查询关联对象或关联集合对象时,需要手动编写Sql来完成,所以,称之为半自动ORM映射工具

而Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,
可以根据对象关系模型直接获取,所以它是全自动的  

8、简述一下Mybatis 的编程步骤

A.创建 SqlSessionFactory  

B.通过 SqlSessionFactory 创建 SqlSession  

C.通过 sqlsession 执行数据库操作

D.调用 session.commit()提交事务  

E.调用 session.close()关闭会话

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

A. Mapper 接口方法名和 mapper.xml 中定义的每个 sql 的 id 相同

B. Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 sql 的 parameterType 的类型相同

C. Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sql 的 resultType 的类型相同

D. Mapper.xml 文件中的 namespace 即是 mapper 接口的类路径

10、说一下 Mybatis 的一级缓存和二级缓存?

**缓存:**合理使用缓存是优化中最常见的方法之一,将从数据库中查询出来的数据放入缓存中,下次使用时不必从数据库查询,而是直接从缓存中读取,避免频繁操作数据库,减轻数据库的压力,同时提高系统性能。

• 一级缓存是SqlSession级别的缓存:
Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存。一级缓存在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构用于存储缓存数据。不同的sqlSession之间的缓存数据区域是互相不影响的。也就是它只能作用在同一个sqlSession中,不同的sqlSession中的缓存是互相不能读取的。

• 二级缓存是mapper级别的缓存:
MyBatis的二级缓存是mapper级别的缓存,它可以提高对数据库查询的效率。多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。

11、MyBatis中接口绑定有几种实现方式,是怎么实现的?

12、Mybatis是如何进行分页的?
Mybatis 的分页方式:

• 使用Map来进行包装数据实现分页功能

• 使用RowBounds来实现分页

13、Mybatis 逻辑分页和物理分页的区别是什么?

• 逻辑分页(内存分页)

MyBatis使用RowBounds实现的分页是逻辑分页,也就是先把数据记录全部查询出来,
然在再根据offset和limit截断记录返回。

• 物理分页

直接通过SQL进行在数据库中直接分页,得到的数据就是我们想要分页之后的数据。

区别:

物理分页每次都访问数据库,逻辑分页只访问一次数据库,物理分页对数据库造成的负担大;

逻辑分页主要用于数据量不大、数据稳定的场合,在数据量很大的情况下容易内存溢出
物理分页主要用于数据量较大、更新频繁的场合

14、Mybatis 是否支持延迟加载?延迟加载的原理是什么?

延迟加载也称为懒加载,是指在进行表的关联查询时,利用延迟加载,先加载主信息。需要关联信息时再去按需加载关联信息。这样会大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。

Mybatis仅支持association关联对象和collection关联集合对象的延迟加载
association指的就是一对一,collection指的就是一对多查询。

在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false

延迟加载的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法。

15、Mybatis都有哪些Executor执行器?

Mybatis有3种基本的Executor执行器, SimpleExecutor、ReuseExecutor、BatchExecutor

16、MyBatis与Hibernate的区别?

• 相同点:

--Hibernate与MyBatis都可以是通过SessionFactoryBuider由XML配置文件生成SessionFactory,
  然后由SessionFactory 生成Session,最后由Session来开启执行事务和SQL语句
--Hibernate和MyBatis都支持JDBC和JTA(Java Transaction API)事务处理

• 不同点:

Mybatis和Hibernate不同,Mybatis不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,
对sql修改和优化非常容易实现,Mybatis适合开发需求变更频繁的系统,比如:互联网项目

Hibernate入门门槛高,Hibernate不用写sql语句,是一个ORM框架。hibernate适合需求固定,对象数据模型稳定,
中小型项目,比如:企业OA系统(Office Automation System,OA系统概括性来讲就是人力资源管理系统)

17、说一下resultMap和resultType

在使用mybatis进行数据库连接操作时对于SQL语句返回结果的处理通常有两种方式,一种就是resultType另一种就是resultMap

18、 一对一关联查询使用什么标签?一对多关联查询使用什么标签?

MyBatis中使用collection标签来解决一对多的关联查询,collection标签可用的属性如下: property:指的是集合属性的值. ofType:指的是集合中元素的类型. column:所对应的外键字段名称. select:使用另一个查询封装的结果.

MyBatis中使用association标签来解决一对一的关联查询,association标签可用的属性如下: property:对象属性的名称. javaType:对象属性的类型. column:所对应的外键字段名称. select:使用另一个查询封装的结果!