本文写了一些有关Mybatis的面试题,有兴趣的可以看看,若有错误欢迎指责
1. JDBC编程有哪些不足之处,Mybatis是如何解决这些问题的?
① JDBC数据库的链接创建和释放频繁会造成系统资源浪费从而影响性能。
解决: Mybatis可在SQLMapConfig.xml中配置数据库连接池,使用连接池管理数据库链接,就不再需要频繁的创建和释放,用完后可以继续在连接池。
② JDBC的Sql语句写在代码中不容易维护, 而在实际应用中sql变化可能较大,sql变动需要改变java代码。
解决: Mybatis将sql语句配置在XXXmapper.xml文件中与java代码分离,sql需要更改的时候只需更改xml文件。
③ JDBC因为sql语句中的where条件不一定导致传参较为麻烦,而且占位符和参数也需要一一对应。
解决: Mybatis可以将java对象自动映射到sql语句中,也可将参数映射到sql语句中。
④ JDBC对结果集解析麻烦,sql变化会导致解析代码变化,且解析时需要遍历。
解决: Mybatis中可将结果集自动映射到java对象,可以配置好resultMap进行映射
2. Mybatis编程的步骤大概是怎么样的?
① 创建SqlSessionFactory
② 通过SqlSessionFactory创建SqlSession
③ 通过SqlSession执行数据库的 select insert update 操作
④ 调用session.commit()提交事务
⑤ 调用session.close()关闭会话
3. 说说Mybatis的优点。
Mybatis可以通过xml或注解方式灵活配置要运行的sql语句,并将java对象映射到sql语句中形成最终执行的sql语句,最后将执行结果映射到java对象中。本身就很小且简单。没有任何第三方依赖,易学易使用;mybatis不会对应用程序或者数据库的现有设计强加任何影响。
4. 使用Mybatis的mapper接口调用时有哪些要求?
① mapper.xml文件中的namespace要是对应的mapper接口类的全路径名
② mapper接口方法名要和mapper.xml中sql的id相同
③ mapper接口方法的输入参数类型要和mapper.xml中的parameterType类型相同
④ mapper接口方法中的输出参数要类型和mapper.xml中的resultType类型相同
5. SqlMapConfig.xml(mybatis-config.xml)中配置哪些内容?
SqlMapConfig.xml中的配置内容和顺序如下:
- properties(属性)
- settings(配置)
- typeAiases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境集合属性对象)
- environment(环境子属性对象)
- DataSource(数据源)
- mappers(映射器)
6. 简单的说下Mybatis的一级缓存和二级缓存。
Mybatis首先去缓存中查询结果集,如果没有再去查询数据库,如果有就从缓存中取出返回结果集就不走数据库。Mybatis内部储存缓存使用一个HashMap,key为hashCode+sqlId+Sql语句,value为从数据库查询出来映射生成的Java对象。二级缓存即查询缓存,它的作用域是一个mapper的namespace,即在同一个namespace中查询的sql可以从缓存中获取数据,二级缓存可以跨sqlsession的。可在映射文件中配置cache
7. mapper编写有哪几种方式?
① 使用MapperFactoryBean
- 在sqlMapConfig.xml中配置mapper.xml的位置
- 定义mapper接口
② 使用mapper扫描器
- mapper.xml文件编写
mapper.xml中的namespace为mapper接口的全路径名
mapper.xml接口中的方法名和mapper.xml中定义的statement的id保持一致 - 定义mapper接口
- 配置mapper扫描器
8. 什么是Mybatis的接口绑定,有什么好处,有哪些方式,怎么实现?
接口绑定就是帮mapper接口里的方法和sql语句绑定起来,比起原来的sqlsession提供的方法可以有更加灵活的选择和设置。
接口绑定有两种实现方式:
- 注解绑定
在mapper接口的方法上加上@select@update@delete@insert里面包含sql语句等注解来绑定;一般在sql语句比较简单的时候使用 - xml绑定
通过xml里面写sql绑定namespace要是mapper接口的全路径名,sql语句所在statement的id要和mapper接口里的方法名相同;一般在sql语句比较复杂的时候使用
9. Mybatis的核心处理类是什么?
sqlsession
10. Mybatis里面的动态sql是怎么设定的?用什么语法?
Mybatis里面的动态sql一般是通过if节点,OGNL语法实现的。但要写的完整须配合where,trim节点,where节点是判断包含节点有内容就插入where否则不插入,trim节点是用来判断如果动态语句是以and或or开始,name会自动把这个and或者or去掉
11. Mybatis中的#{}和${}的区别
#{}:是以预编译的形式,将参数设置到sql语句中;PreparedStatement;防止sql注入
$ {}:取出的值直接拼装在sql语句中;会有安全问题;
原生jdbc不支持占位符的地方我们就可以使用${}进行取值,比如列名、分表、排序。。。