mybatis面试常问
mybatis对JDBC做了哪些封装?
JDBC的工作量大:需要先注册驱动和数据库信息、操作Connection、通过statement对象执行SQL,将结果返回给resultSet,然后从resultSet中读取数据并转换为pojo对象,最后需要关闭数据库相关资源。并且还需要自己对JDBC过程的异常进行捕捉和处理。
MyBatis使用SqlSessionFactoryBuilder来连接完成JDBC需要代码完成的数据库获取和连接,减少了代码的重复。MyBatis可以将SQL代码写入xml中,易于修改和维护。JDBC的resultSet需要用户自己去读取并生成对应的POJO,MyBatis的mapper会自动将执行后的结果映射到对应的Java对象中。
mybatis如何映射?
通过mapper.xml文件中的namespace(全限名)来关联和接口的关系.
Mybatis接口绑定有几种实现方式,分别是怎么实现的?
两种方式:
- 通过注解绑定,在接口的方法上添加@select,@update,等注解,里面包含了sql语句
- 通过xml文件里写sql绑定,这种方式要求指定xml文件里namespace的值为接口的全限定名.
Mybatis中和${}的区别?
使用 ${}在编译期传入的参数会直接拼接成字符串,而则会生成占位符"?",并且因为${}会直接拼接成字符串,会造成sql注入,而传入的参数会生成占位符"?" ,可以有效的防止了sql注入.
myBatis 实现一对一有几种方式?具体怎么操作的?

myBatis 实现一对多有几种方式?怎么操作的?
ofType属性与javaType属性对应,它用于指定实体对象中集合类属性所包含的元素类型。

这两种方式各有各的优缺点,嵌套查询的查询语句写起来简单,但是执行的sql语句多,性能要低一点,嵌套结果的查询语句写起来难一点,而且sql语句只执行一条,性能相对较高;刚开始用可能会遇到很多细节问题,但是慢慢熟悉了,感觉就会好很多,用起来也得心应手了
myBatis 里面的动态Sql是怎么设定的?用什么语法?
动态sql通过if节点来实现,使用OGNL语法判断。
讲下 myBatis 的缓存?
mybatis分一级缓存和二级缓存;一级缓存默认开启,在对象中有个hashmap用于存储缓存数据,不同的sqlsessioin之间缓存数据互不影响。
二级缓存时mapper映射级别的缓存,多个SqlSession去操作同一个mapper映射的sql语句,多个SqlSession可以公用二级缓存,二级缓存是跨SqlSession的. (二级缓存需要手动开启),一级缓存和二级缓存都是用作在短时间内重复查询而做的优化。
mybatis的执行流程
第一步:通过Resources加载配置好的mybatis.xml配置文件。
第二步:new了一个SqlSessionFactoryBuilder对象,通过他的build()方法中的XMLconfigBuilder对象的parse()方法解析mybatis配置文件返回的configuration对象,这个对象包含全局配置信息和mapper.xml映射文件的各种信息。返回一个包含configuration的DefaultSqlSessionFactory。
第三步:通过DefaultSqlSessionFactory创建DefaultSqlSession返回,包含Configurarion和Executor。
第四步:jdk动态代理生成mapper接口的代理对象。
第五步: 执行查询流程

总结:在加载好配置文件后,首先在SqlSessionFactoryBuilder中的XMLconfigBuilder对象根据配置文件初始化一个Configuration对象。这个对象中包含了各种信息。产生一个带有Configuration的DefaultSqlSessionFactory。在DefaultSqlSessionFactory中产生一个带有(根据配置文件创建出来的)Executor和Configuration的DefaultSqlSession。然后生成包含DefaultSqlSession(Executor)的mapper代理对象。最后执行查询流程。
- 调用DefaultSqlSession的增删改查(Executor);
- 会创建一个StatementHandler对象。(同时也会创建出ParameterHandler和ResultSetHandler)
- 调用StatementHandler预编译参数以及设置参数值;使用ParameterHandler来给sql设置参数
- 调用StatementHandler的增删改查方法;
- ResultSetHandler封装结果
持久层框架为什么选择mybatis?
比较贴近原生的sql。简单易用,支持动态sql,方便做优化。

浙公网安备 33010602011771号