1. 什么是Mybatis?
(1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql,可以严格控制sql执行性能,灵活度高。
(2)MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
(3)通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)。
2. Mybaits的优点:
答案:
1.把Sql语句从Java中独立出来。
2.封装了底层的JDBC,API的调用,并且能够将结果集自动转换成JavaBean对象,简化了Java数据库编程的重复工作。
3.自己编写Sql语句,更加的灵活。
4.入参无需用对象封装(或者map封装),使用@Param注解
另一种答案:
(1)基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。
(2)与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;
(3)很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)。
(4)能够与Spring很好的集成;
(5)提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。
3. MyBatis框架的缺点:
(1)SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。
(2)SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
4. MyBatis框架适用场合:
(1)MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案。
(2)对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis将是不错的选择。
5. ibatis/mybatis框架的优缺点?
优点: 易于上手和掌握
sql写在xml里,便于统一管理和优化
解除sql与程序代码的耦合
提供对象关系映射标签,支持对象关系组建维护
提供xml标签,支持编写动态sql
缺点: 可读性低,调试非常困难,非常受限,无法像jdbc那样在代码里根据逻辑实现复杂动态sql拼接
6. ibatis核心类的作用;MyBatis核心类的作用?
ibatis:
SqlMapClientBuilder: 加载配置文件,返回一个会话
SqlMapClient: 具体的会话
SqlSession: 对数据的增删查改
SqlMapSession: 进行数据库操作
SqlSessionManager: 创建SqlSesstion的对象
SqlMapTransactionManager: 定义事务管理功能
Mybatis:
SqlSessionFactory 每个MyBatis应用的核心
7. mybatis/ibatis跟hibernate的比较;
Hibernate是全自动化的,只要配置映射文件,可以为我们动态的生成sql
ibatis是半自动化的,需要我们手动的编写sql,ibatis简单易学
Hibernate比较复杂,ibatis可以细粒度的优化,而Hibernate是根据映射文件进行优化
8. ibatis的工作流程或运行原理?
答案:
Mybatis工作原理:
1.通过SqlSessionFactoryBuilder从mybatis-config.xml配置文件中构建出SqlSessionFactory。
2.SqlSessionFactory开启一个SqlSession,通过SqlSession实例获得Mapper对象并且运行Mapper映射的Sql语句。
3.完成数据库的CRUD操作和事务提交,关闭SqlSession。
另一种答案:
1.在sqlMapConfig的配置文件中进行数据库连接的配置。
2.在sqlMapConfig的xml配置文件中引用sqlMap的xml配置文件。
3.在sqlMap的xml配置文件中进行SQL文件的配置。(文件名称随意,一般是javaBean的类名加xml。)
4.通过SqlMapClient生成具体的操作,用来操作sqlMap配置文件中SQL文件的IBATIS对象。
5.SqlMapClient对象提供函数,函数的参数对应替换sqlMap配置文件的id,parameter等属性,完成SQL文件的执行
9. #{}和${}的区别是什么?
答案:
${}:简单字符串替换,把${}直接替换成变量的值,不做任何转换,这种是取值以后再去编译SQL语句。
#{}:预编译处理,sql中的#{}替换成?,补全预编译语句,有效的防止Sql语句注入,这种取值是编译好SQL语句再取值。
总结:一般用#{}来进行列的代替
另一种答案:
#{}是预编译处理,${}是字符串替换。
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
Mybatis在处理${}时,就是把${}替换成变量的值。
使用#{}可以有效的防止SQL注入,提高系统安全性。
10. Mybatis是如何进行分页的?分页插件的原理是什么?
答案:
RowBounds对象分页
在Sql内直接书写,带有物理分页
另一种答案:
Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。
分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。
11. Ibatis中#与$的区别?
(1)#号它会将传进来的数据都当成一个一个字符串,会给数据加一对双引号,而$号它会将传进来的数据直接显示生成到sql中
(2)#号能够防止sql的注入,而$号无法防止sql的注入
(3)$方式一把用于传入数据库对象,比如表名
12. ibatis与mybatis比较 # $ %干什么的
1 iBATIS3.0以后到goole公司了,更名为mybatis
2 mybatis增加了接口绑定
3 传值方式由##---#{} $:解析数据库的关键字 %:模糊查询
4 mybatis核心类SqlSessionfactory SqlSeession ibatis sqlMapclient
5 使用ognl表达式,体现在动态sql上
6 配置的改变,如别名的配置,mybatis移动到了总配置文件中
13. 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。
14. Mybatis的一级、二级缓存:
1)一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。
2)二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置<cache/> ;
3)对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。
15. mybatis,hibernate如何开发一对多的案例 过程以及如何配置
o : 一方放多方的集合,多方放一方的实体
r : 多方放一方的id
m :
mybatis: 查询数据
1 使用嵌套查询或者嵌套结果
嵌套查询: 先查询自己的数据,另外发送一条sql查询关联数据,在collection标签上使用select属性指定id,如select='xxx',
嵌套结果: 一条sql查询自己以及关联数据,结果由mybatis自行封装,在collection标签上使用resultMap
2 插入数据 使用动态sql
hibernate :在set标签上使用级联与反转
1 级联:主对象做什么,其关联对象也做同样的操作
2 反转 将关联字段的维护权交给多方,减少update语句