复习总结
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
8、如何获取自动生成的(主)键值?
1. useGeneratedKeys
2. selectKey
9、简单的说一下MyBatis的一级缓存和二级缓存?
一级缓存是默认使用的,二级缓存需要手动开启。
禁止使用缓存useCache="false"
select语句默认是false
增删改语句默认是true
1. 一级缓存:就是sqlsession,在sqlsession中有一个是数据区域,是map结构,这个区域就是一级缓存区域。一级缓存中的key就是sql语句、条件、statement等信息组成一个唯一值。一级缓存中的value,就是查询出的结果对象----------缓存的数据只在SqlSession内有效。
2. 二级缓存:就是同一个namespace下的mapper,二级缓存中,也有一个map----------所以对SqlSession是共享的。
10、MyBatis的动态sql
MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。
10.1. if
10.2. choose (when, otherwise)
10.3. trim (where, set)
10.4. foreach
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、 一对一、一对多的关联查询 ?
14、模糊查询怎么写
15、Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
1. 先建立属性名和表的字段之间的映射关系:别名或者resultMap
2. 通过反射创建对象,使用反射给对象的属性逐一赋值并返回
16、动态sql的工作原理
使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能
17、为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。
18、接口绑定有几种实现方式,分别是怎么实现的?
接口绑定有两种实现方式,一种是通过注解绑定,就是在接口的方法上面加上 @Select@Update等注解里面包含Sql语句来绑定,
另外一种就是通过xml里面写SQL来绑定, 在这种情况下,要指定xml映射文件里面的namespace必须为接口的全路径名.
19、什么情况下用注解绑定,什么情况下用xml绑定?
当Sql语句比较简单时候,用注解绑定,
当SQL语句比较复杂时候,用xml绑定,一般用xml绑定的比较多