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:使用另一个查询封装的结果!