Java面试题之Mybayis

作者: 周小鑫001 | 来源:发表于2018-07-15 18:19 被阅读39次

    一.Mybatis中的#和$区别

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

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

            2。$将传入的数据直接显示生成在sql中,如:order by $user_id$ 如果我们传入的值是111,那么解析成sql时的值为order by  user_id 如果传入的值是id 则解析成order by  id 

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

    4.$方式无法防止sql注入

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

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

       二。Mybatis的编程步骤是什么样的?

                1.创建SqlSessinFactory

                2.通过SqlSessionFactory创建SqlSession

                3.通过sqlsession执行数据库操作

                4。调用sessin.commit提交事务,

                5.调用sessio.close关闭会话

    三。JDBC编程有哪些不足,MyBatis是如何解决这些问题

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

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

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

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

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

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

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

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

    四。使用Mybatis的mapper接口调用时有哪些要求

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

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

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

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

    五。Mybitis中的一级缓存与二级缓存

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

        2.二级缓存与一级缓存其机制相同,默认是采用PerPetualCache,HashMap存储,不同在于其存储作用域为Mapper,并且可自定义存储源

     如Ehcache,作用域为namespace是指failnamespace对应的配置文件中所有的select操作结果集缓存,这样不同线程之间就可以共用二级缓存,启动二级缓存在mapper配置文件中:<cache />

        二级缓存可以设置返回的缓存对象策略<cache readOnly="true"> 当readOnly=”true“时,表示二级缓存返回给所有调用者同一个缓存对象实例,调用者可以update获取缓存实例,但是这样可能会造成其他调用者出现数据不一致的情况, 当readOnly="false"时,返回给调用者的是二级缓存总缓存的拷贝对象,即不同调用者获取的时缓存对象不同的实例,这样调用者对各自的缓存对象的修改不会影响到其他的调用者,即是安全的,所以默认是readOnly="false";

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

    六。MyBatis在insert插入操作时返回主键,ID

        数据库为MySql时:

                    <insert id="insert" parameterType="com.test.User" keyProperty="userId"  useGenerateKeys=“true”>

                KeyProperty表示返回的id要保存到对象的属性中,“useGeneratedKeys”表示主键id为自增长模式,Mysql中做以上配置就OK了,

            数据库为Orcle时

                    

        

    相关文章

      网友评论

      本文标题:Java面试题之Mybayis

      本文链接:https://www.haomeiwen.com/subject/cbippftx.html