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 实现一对多有几种方式?怎么操作的?

元素中,包含了一个子元素,MyBatis就是通过该元素来处理一对多关联关系的
子元素的属性大部分与元素相同,但其还包含一个特殊属性--ofType
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,方便做优化。

posted @ 2020-08-11 21:47  大嘤熊  阅读(129)  评论(0)    收藏  举报