springmvc基础面试题,Mybatis常考面试题汇总(附答案

  • 先查询序列得到主键,将主键设置到user对象中,将user对象插入数据库。

 <!-- oracle

	在执行insert之前执行select 序列.nextval() from dual取出序列最大值,将值设置到user对象 的id属性

	 -->

	<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">

		<selectKey keyProperty="id" order="BEFORE" resultType="int">

			select 序列.nextval() from dual

		</selectKey>

		

		INSERT INTO USER(id,username,birthday,sex,address) VALUES( 序列.nextval(),#{username},#{birthday},#{sex},#{address})

	</insert> 

4、在mapper中如何传递多个参数?


在mapper中如何传递多个参数?

第一种:使用占位符的思想

  • 在映射文件中使用#{0},#{1}代表传递进来的第几个参数

  • **使用@param注解:来命名参数 **

  • #{0},#{1}方式


//对应的xml,#{0}代表接收的是dao层中的第一个参数,#{1}代表dao层中第二参数,更多参数一致往后加即可。



<select id="selectUser"resultMap="BaseResultMap">  

    select *  fromuser_user_t   whereuser_name = #{0} anduser_area=#{1}  

</select> 

  • @param注解方式

 public interface usermapper { 

         user selectuser(@param(“username”) string username, 

         @param(“hashedpassword”) string hashedpassword); 

        }

     select id, username, hashedpassword 

     from some_table 

     where username = #{username} 

     and hashedpassword = #{hashedpassword} 

</select>



**第二种:使用Map集合作为参数来装载**



try{

        //映射文件的命名空间.SQL片段的ID,就可以调用对应的映射文件中的SQL





        /**

         * 由于我们的参数超过了两个,而方法中只有一个Object参数收集

         * 因此我们使用Map集合来装载我们的参数

         */

        Map<String, Object> map = new HashMap();

        map.put("start", start);

        map.put("end", end);

        return sqlSession.selectList("StudentID.pagination", map);

    }catch(Exception e){

        e.printStackTrace();

        sqlSession.rollback();

        throw e;

    }finally{

        MybatisUtil.closeSqlSession();

    }

 <!--分页查询-->

	<select id="pagination" parameterType="map" resultMap="studentMap">



		/*根据key自动找到对应Map集合的value*/

		select * from students limit #{start},#{end};



	</select>

```



5、Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不?

-----------------------------------------------



> Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不?



*   Mybatis动态sql可以让我们在Xml映射文件内,**以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能**。

*   Mybatis提供了9种动态sql标签:trim|where|set|foreach|if|choose|when|otherwise|bind。

*   其执行原理为,使用OGNL从sql参数对象中计算表达式的值,**根据表达式的值动态拼接sql,以此来完成动态sql的功能**。



6、Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?

---------------------------------------



> Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?



**如果配置了namespace那么当然是可以重复的,因为我们的Statement实际上就是namespace+id**



如果没有配置namespace的话,那么相同的id就会导致覆盖了。



7、为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?

-------------------------------------



> 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?



*   Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。

*   而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。



8、通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?

-----------------------------------------------------------------------



> 通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?



*   Dao接口,就是人们常说的Mapper接口,接口的全限名,就是映射文件中的namespace的值,接口的方法名,就是映射文件中MappedStatement的id值,接口方法内的参数,就是传递给sql的参数。

*   Mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可唯一定位一个MappedStatement



举例:



```

com.mybatis3.mappers.StudentDao.findStudentById,



可以唯一找到namespace为com.mybatis3.mappers.StudentDao下面id = findStudentById的MappedStatement。在Mybatis中,每一个<select>、<insert>、<update>、<delete>标签,都会被解析为一个MappedStatement对象。

```



Dao接口里的方法,**是不能重载的,因为是全限名+方法名的保存和寻找策略**。



**Dao接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,代理对象proxy会拦截接口方法,转而执行MappedStatement所代表的sql,然后将sql执行结果返回。**



详情可参考:



*   [www.cnblogs.com/soundcode/p…](https://gitee.com/vip204888/java-p7)



9、Mybatis比IBatis比较大的几个改进是什么

---------------------------



> Mybatis比IBatis比较大的几个改进是什么



*   a.**有接口绑定,包括注解绑定sql和xml绑定Sql** ,

*   b.动态sql由原来的节点配置变成OGNL表达式,

*   c. 在一对一,一对多的时候引进了association,在一对多的时候引入了collection节点,不过都是在resultMap里面配置



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

------------------------



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



接口绑定有两种实现方式:



*   一种是通过注解绑定,就是在接口的方法上面加上@Select@Update等注解里面包含Sql语句来绑定

*   另外一种就是通过xml里面写SQL来绑定,在这种情况下,要指定xml映射文件里面的namespace必须为接口的全路径名.



11、Mybatis是如何进行分页的?分页插件的原理是什么?

------------------------------



> Mybatis是如何进行分页的?分页插件的原理是什么?



Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。



**分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。**



举例:`select * from student,拦截sql后重写为:select t.* from (select * from student)t limit 0,10`



分页插件使用参考资料:



*   [www.cnblogs.com/kangoroo/p/…](https://gitee.com/vip204888/java-p7)

*   [blog.csdn.net/yuchao2015/…](https://gitee.com/vip204888/java-p7)

*   [www.cnblogs.com/ljdblog/p/6…](https://gitee.com/vip204888/java-p7)



12、简述Mybatis的插件运行原理,以及如何编写一个插件

------------------------------




# 完结

Redis**基于内存**,常用作于**缓存**的一种技术,并且Redis存储的方式是以key-value的形式。Redis是如今互联网技术架构中,使用最广泛的缓存,在工作中常常会使用到。Redis也是中高级后端工程师技术面试中,面试官最喜欢问的问题之一,因此作为Java开发者,Redis是我们必须要掌握的。

Redis 是 NoSQL 数据库领域的佼佼者,如果你需要了解 Redis 是如何实现高并发、海量数据存储的,那么这份腾讯专家手敲《Redis源码日志笔记》将会是你的最佳选择。

![](https://img-blog.csdnimg.cn/img_convert/7f5d473b47e5320408a824750aea3953.png)

何编写一个插件

------------------------------




# 完结

Redis**基于内存**,常用作于**缓存**的一种技术,并且Redis存储的方式是以key-value的形式。Redis是如今互联网技术架构中,使用最广泛的缓存,在工作中常常会使用到。Redis也是中高级后端工程师技术面试中,面试官最喜欢问的问题之一,因此作为Java开发者,Redis是我们必须要掌握的。

Redis 是 NoSQL 数据库领域的佼佼者,如果你需要了解 Redis 是如何实现高并发、海量数据存储的,那么这份腾讯专家手敲《Redis源码日志笔记》将会是你的最佳选择。

[外链图片转存中...(img-AP39o8je-1628226139119)]

**感兴趣的朋友可以通过[点赞+戳这里的方式免费获取](https://gitee.com/vip204888/java-p7)腾讯专家手写Redis源码日志笔记pdf版本!**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值