快速入门MyBatis

复习总结

day03-----------------MyBatis

1、MyBatis简介

本事apache的一个开源项目,他是一个优秀的持久层框架。它对jdbc操作数据库的过程进行了封装,使开发者只关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果检索等jdbc复杂的操作。

优点:
1. 简单易学,容易上手
2. 与jdbc相比,消除了大量冗余代码,不需要手动开关连接
3. 能够与spring集成
4. 支持动态sql

缺点:
1. sql语句编写工作量大
2. 依赖于数据库,导致数据库移植性差

2、jdbc问题总结

1. 数据库创建连接、释放繁琐造成资源浪费
2. sql语句在代码中硬编码,不易维护--------MyBatis将sql配置在了XXXmapper.xml中
3. 使用preparedstatement向占位符传参数存在硬编码,不易维护
4. 对结果集进行解析存在硬编码----------MyBatis自动将结果映射到java对象

3、MyBatis的编程步骤是什么?

1. 创建SqlSessionFactory
2. 通过SqlSessionFactory创建SqlSession
3. 通过SqlSession操作数据库
4. 调用session.commit()提交事务
5. 调用Session.close()关闭会话

4、MyBatis和Hibernate的区别

ORM:对象关系映射

1. 都是持久层框架,底层都是封装的jdbc,区别是Mybatis是一个不完全的ORM框架,需要程序员自己编写Sql语句。MyBatis可以通过XML或者注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最终将sql执行的结果在映射成java对象。但是MyBatis无法做到数据无关性,适合对关系数据模型要求不高的软件开发。
2. Hibernate是一个完全的ORM框架,不需要程序员自己编写SQL语句。

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

1. mapper.xml的namespace必须是mapper接口的类路径
2. 接口方法的名称与映射文件中sql的id一致
3. 接口方法的参数类型与映射文件的parameterType一致
4. 接口方法的返回值类型与映射文件的resultType一致

6、#{}和${}的区别是什么?

1. #{}解析传递进来的参数数据
2. ${}对传递进来的参数原样拼接在SQL中
3. #{}是预编译处理,${}是字符串替换
4. 使用#{}可以有效防止sql注入

7、当实体类中的属性名和表中的字段名不一样 ,怎么办 ?

1. 使用别名,将别名设置成与属性名一致
2. 使用resultMap

快速入门MyBatis

8、如何获取自动生成的(主)键值?

1. useGeneratedKeys

快速入门MyBatis

2. selectKey

快速入门MyBatis

9、简单的说一下MyBatis的一级缓存和二级缓存?

一级缓存是默认使用的,二级缓存需要手动开启。

禁止使用缓存useCache="false"

select语句默认是false

增删改语句默认是true

1. 一级缓存:就是sqlsession,在sqlsession中有一个是数据区域,是map结构,这个区域就是一级缓存区域。一级缓存中的key就是sql语句、条件、statement等信息组成一个唯一值。一级缓存中的value,就是查询出的结果对象----------缓存的数据只在SqlSession内有效。

快速入门MyBatis
快速入门MyBatis
2. 二级缓存:就是同一个namespace下的mapper,二级缓存中,也有一个map----------所以对SqlSession是共享的。

快速入门MyBatis
快速入门MyBatis

10、MyBatis的动态sql

MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。

10.1. if

快速入门MyBatis

10.2. choose (when, otherwise)

快速入门MyBatis

10.3. trim (where, set)

快速入门MyBatis
快速入门MyBatis
快速入门MyBatis

10.4. foreach

快速入门MyBatis

11、通常一个XML映射文件,都会有一个mapper接口与之对应,谈一谈这个mapper接口的工作原理是什么?mapper接口里的方法可以重载吗?

1. 接口的全限定名就是映射文件的namespace值,接口的方法名就是映射文件中sql的id,接口全限定名+方法名可以唯一定位一个mappedStatement。
2. mapper接口里的方法不能重载,因为是全限定名+方法名的保存和寻找策略。
3. 工作原理:动态代理,为mapper接口生成代理proxy对象,代理对象执行接口方法,转而执行sql,然后将结果返回。

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

1. 不同的XML配置文件,如果配置了namespace,那么id可以重复
2. 如果没有配置namespace,那么id不能重复

13、 一对一、一对多的关联查询 ?

快速入门MyBatis

14、模糊查询怎么写

快速入门MyBatis

15、Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?

1. 先建立属性名和表的字段之间的映射关系:别名或者resultMap
2. 通过反射创建对象,使用反射给对象的属性逐一赋值并返回

16、动态sql的工作原理

使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能

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

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

18、接口绑定有几种实现方式,分别是怎么实现的?

接口绑定有两种实现方式,一种是通过注解绑定,就是在接口的方法上面加上 @[email protected]等注解里面包含Sql语句来绑定, 
另外一种就是通过xml里面写SQL来绑定, 在这种情况下,要指定xml映射文件里面的namespace必须为接口的全路径名.

19、什么情况下用注解绑定,什么情况下用xml绑定?

    当Sql语句比较简单时候,用注解绑定, 
    当SQL语句比较复杂时候,用xml绑定,一般用xml绑定的比较多