面试官经常喜欢问的Mybatis经典面试

北京中科医院几级 https://yyk.39.net/bj/zhuanke/89ac7.html

今天给大家分享一些面试官喜欢提问的Mybatis面试题,好了,废话不多说,直接上干货吧!

一、请说说在Mybatis中#和$有什么区别?

#相当于对数据加上双引号,$相当于直接显示数据

1.#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:orderby#user_id#,如果传入的值是,那么解析成sql时的值为orderby,如果传入的值是id,则解析成的sql为orderbyid.

2.$将传入的数据直接显示生成在sql中。如:orderby$user_id$,如果传入的值是,那么解析成sql时的值为orderbyuser_id,如果传入的值是id,则解析成的sql为orderbyid.

3.#方式能够很大程度防止sql注入。

4.$方式无法防止Sql注入。

5.$方式一般用于传入数据库对象,例如传入表名.

6.一般能用#的就别用$.

二、说说在使用JDBC编程时,它有哪些不足之处,MyBatis是如何解决这些问题的?

1.数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题。

解决:在SqlMapConfig.xml中配置数据连接池,使用连接池管理数据库连接。

2.Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。

解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。

3.向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。

解决:Mybatis自动将java对象映射至sql语句。

4.对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。

解决:Mybatis自动将sql执行结果映射至java对象。

三、请你说一下使用MyBatis的mapper接口调用时有哪些要求?

1.Mapper接口方法名和mapper.xml中定义的每个sql的id相同

2.Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同

3.Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

4.Mapper.xml文件中的namespace即是mapper接口的类路径。

四、你知道Mybatis中一级缓存与二级缓存吗?

1.一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Sessionflush或close之后,该Session中的所有Cache就将清空。

2.二级缓存与一级缓存其机制相同,默认也是采用PerpetualCache,HashMap存储,不同在于其存储作用域为Mapper(Namespace),并且可自定义存储源,如Ehcache。

作用域为namespance是指对该namespance对应的配置文件中所有的select操作结果都缓存,这样不同线程之间就可以共用二级缓存。

启动二级缓存:在mapper配置文件中:cache/。

二级缓存可以设置返回的缓存对象策略:cachereadOnly=true。当readOnly=true时,表示二级缓存返回给所有调用者同一个缓存对象实例,调用者可以update获取的缓存实例,

但是这样可能会造成其他调用者出现数据不一致的情况(因为所有调用者调用的是同一个实例)。

当readOnly=false时,返回给调用者的是二级缓存总缓存对象的拷贝,即不同调用者获取的是缓存对象不同的实例,这样调用者对各自的缓存对象的修改不会影响到其他的调用者,即是安全的,所以默认是readOnly=false;

3.对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行了C/U/D操作后,默认该作用域下所有select中的缓存将被clear。

五、MyBatis在insert插入操作时返回主键ID

1、数据库为MySql时:

insertid=insertparameterType=


转载请注明:http://www.aierlanlan.com/rzgz/4472.html