Java面试大全(2020年版)101-110

101.myBatis的缓存

MyBatis 的缓存分为一级缓存和二级缓存, 一级缓存放在 session 里面,默认就有,二级缓存放在它的命名空间里,默认是打开的,二级缓存属性类需要实现 Serializable 序列化接口(可用来保存对象的状态),可在它的映射文 件中配置Mybatis中有一级缓存和二级缓存,默认情况下一级缓存是开启的,而且是不能关闭的。
一级缓存是指SqlSession级别的缓存,当在同一个SqlSession中进行相同的SQL语句查询时,第二次以后的查询不会从数据库查询,而是直接从缓存中获取,一级缓存最多缓存1024条SQL。二级缓存是指可以跨SqlSession的缓存。Mybatis中进行SQL查询是通过org.apache.ibatis.executor.Executor接口进行的,总体来讲,它一共有两类实现,一类是BaseExecutor,一类是CachingExecutor。前者是非启用二级缓存时使用的,而后者是采用的装饰器模式,在启用了二级缓存时使用,当二级缓存没有命中时,底层还是通过BaseExecutor来实现的。
一级缓存
一级缓存是默认启用的,在BaseExecutor的query()方法中实现,底层默认使用的是PerpetualCache实现,PerpetualCache采用HashMap存储数据。一级缓存会在进行增、删、改操作时进行清除。
二级缓存
二级缓存是默认启用的,如想取消,则可以通过Mybatis配置文件中的元素下的子元素来指定cacheEnabled为false。我们要想使用二级缓存,是需要在对应的Mapper.xml文件中定义其中的查询语句需要使用哪个cache来缓存数据的。这有两种方式可以定义,一种是通过cache元素定义,一种是通过cache-ref元素来定义。但是需要注意的是对于同一个Mapper来讲,它只能使用一个Cache,当同时使用了和时使用定义的优先级更高。Mapper使用的Cache是与我们的Mapper对应的namespace绑定的,一个namespace最多只会有一个Cache与其绑定

102.myBatis实现一对一和一对多分别有几种方式,又都是怎么操作的呢

  • 一对一有联合查询和嵌套查询 联合查询是几个表联合查询,只查询一次,通过在resultMap里面配置collection节点配置一对 多的类就可以完成;嵌套查询是先查一个表,根据这个表里面的结果的外键id,去再另外一个表里面查询数据,也是 通过配置collection,但另外一个表的查询通过 select 节点配置
  • 一对多有联合查询和嵌套查询 联合查询是几个表联合查询,只查询一次,通过在resultMap里面配置collection节点配置一对 多的类就可以完成;嵌套查询是先查一个表,根据这个表里面的结果的外键id,去再另外一个表里面查询数据,也是 通过配置collection,但另外一个表的查询通过 select 节点配置;

103.myBatis里面的动态Sql是怎么设定的?用什么语法?

MyBatis 里面的动态 Sql 一般是通过 if 节点来实现,通过 OGNL 语法来实现,但是如果要写的 完整,必须配合where,trim 节点,where 节点是判断包含节点有内容就插入 where,
否则不插 入,trim 节点是用来判断如果动态语句是以 and 或 or 开始,那么会自动把这个 and 或者 or 取 掉;

104.myBatis(IBatis)的好处是什么

ibatis 把 sql 语句从 Java 源程序中独立出来,放在单独的 XML 文件中编写,给程序的维护带 来了很大便利。ibatis 封装了底层 JDBC API 的调用细节,并能自动将结果集转换成 Java Bean 对象,大大简 化了 Java 数据库编程的重复工作。因为 Ibatis 需要程序员自己去编写 sql 语句,程序员可以结合数据库自身的特点灵活控制 sql 语句,因此能够实现比 hibernate 等全自动 orm 框架更高的查询效率,能够完成复杂查询。

105.接口绑定有几种实现方式,分别是怎么实现的?

  • 一种是通过注解绑定,就是在接口的方法上面加上@Select@Update 等注解里面包含 Sql 语句来绑定。
  • 另外一种就是通过 xml 里面写 SQL 来绑定,在这种情况下,要指定 xml 映射文件里面的 namespace 必须为接口的全路径名;

106.什么情况下用注解绑定,什么情况下用xml绑定

当Sql语句比较简单时候,用注解绑定, 当SQL语句比较复杂时候,用 xml 绑定,一般用 xml 绑定的比较多;

107.Mapper动态代理开发

只写接口,实现类由mybatis生成
四个原则:Mapper接口开发需要遵循以下规范

  • Mapper.xml文件中的namespace与mapper接口的类路径相同。
  • Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
  • Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相
  • Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultTpe的类型相同

108.有关mybatis接口方法中传入参数问题

mybatis参数传递主要分为以下的五种情况

  • 单个参数:可以接受基本类型,对象类型,集合类型的值。这种情况MyBatis可直接使用这个参数,不需要经过任何处理。
  • 多个参数:任意多个参数,都会被MyBatis重新包装成一个Map传入。Map的key是param1,param2,0,1…,值就是参数的值。
  • 命名参数(推荐使用):为参数使用@Param起一个名字,MyBatis就会将这些参数封装进map中,key就是我们自己指定的名字
  • POJO:当这些参数属于我们业务POJO时,我们直接传递POJO
  • Map:我们也可以封装多个参数为map,直接传递
  • 总结:
    • 当参数小于5时候通常使用@Param形式
    • 参数大于5时候使用JavaBean形式

109.Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?

第一种是使用标签,逐一定义数据库列名和对象属性名之间的映射关系。第二种是使用sql列的别名功能,将列的别名书写为对象属性名。有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

110.如何获取自动生成的(主)键值?

insert 方法总是返回一个int值 ,这个值代表的是插入的行数。如果采用自增长策略,自动生成的键值在 insert 方法执行完后可以被设置到传入的参数对象中。

原创文章 52 获赞 3 访问量 2440

猜你喜欢

转载自blog.csdn.net/m0_47572402/article/details/106127629
今日推荐