mybatis批量夺标添加_慕阳这几年面试时常被问到的MyBatis面试题

点击上方蓝色"慕阳源码",选择"设为星标"

回复"资源"获取独家整理的学习资料


导读

    MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录,所以在面试中经常被问及。

1概念

1. 什么MVC(一般再问MyBatis方面时会从这里切入)

  • M: Model 模型,实体类和业务和dao

  • V: view 视图. JSP

  • C:Controller 控制器,servlet

2. 什么是MyBatis

    Mybatis 开源免费框架.原名叫iBatis,它的作用是数据访问层框架,底层是对JDBC 的封装,有一个最大的优点是,不需要编写实现类,只需要写需要执行的sql

3. Hibernate 和 MyBatis 的区别(必会,笔试经常出现)

  • MyBatis 是一个小巧、方便、高效、简单、直接、半自动化的持久层框架

  • Hibernate 是一个强大、方便、高效、复杂、间接、全自动化的持久层框架

2配置文件中的标签

1. 标签的作用,讲一讲例子

    在 mybatis 全局配置文件中通过标签控制 mybatis 相关功能的全局开关,以下以开启log4j为例

1<settings>
2   <setting name="logImpl" value="LOG4J"/>
3settings>

2. 标签的作用

    给某个类起别名,这样在使用resultType时,就不用写全路径了,例如

1<typeAliases>
2
3       <typeAlias type="com.my.Test" alias="test"/>
4
5typeAliases>

3. 标签的作用 

    是将定义好的接口与Mapper包下的 xxx.xml 文件绑定起来

    例如

1<mappers>
2
3    <package name="com.my.mapper"/>
4
5mappers>

4.  标签的作用

标签写在mapper.xml 中,由程序员控制SQL 查询结果与实体类的映射关系.

例如

1<resultMap type="my" id="map">
2      
3   <id column="id" property="id1" />
4
5   <result column="name" property="name1"/>
6
7resultMap>

   然后在sql标签中使用,上面的 id 值引用

1<select id="selAll" resultMap="map"> 
2
3      select * from my
4
5select>
注意

要是问你怎么用这个标签进行链表查询,直接说,你在工作时,一般使用别名+Map的形式进行多表查询,放心他们都是这样用的~

3标签中的属性

1. parameterType 属性 , 在什么情况下可以省略

    一般在多参数的情况下可以省略,这个属性是用来控制形参的参数类型的

2. namespace 属性使用来干什么的

    使用来讲接口的包名+接口名要与标签中的namespace相同,保证映射成功,然后在接口中的方法名应该和sql标签的id属性相同

注意

想了一想这地方好像真没有啥能问的,哈哈~

4动态sql

1. 什么是动态sql,MyBatis使用什么表达式进行书写

    根据不同的条件,执行不同的sql命令,称为动态sql,使用OGNL表达式,特点是直接写 key 或对象的属性.不需要添加任何特字符号

2. 标签有什么特点?

  • 当编写 where 标签时,内容中第一个是 and 去掉第一个and

  • 如果有内容会生成 where 关键字,如果没有内容不生成where 

  • 比直接使用少写where 1=1

    例如

 1<select id="selByMy" resultType="my"> 
2         select * from my
3  <where>
4
5     <if test="test!=null and test!=''"> and test=#{test}
6     if>
7
8     <if test="test!=null and test!=''"> and test=#{test}
9     if>
10
11  where>
12select>

3. 你用过if-else吗?在动态sql中

    此处有坑,因为动态sql中没有if-else,是使用,只要有一个成立,其它都不执行

4. 标签有什么特点?

    用在修改SQL 中set 从句,作用是去掉最后一个逗号,如果里面有内容生成set 关键字,没有就不生成

5. 你使 用过标签吗?

    这个是控制sql中增加和删除内容的标签,他有4个属性

  • prefix 在前面添加内容

  • prefixOverrides 去掉前面内容

  • suffix 在后面添加内容

  • suffixOverrieds 去掉后面内容

6. 怎么样做批量新增

    使用标签,在sql中使用 in 查询,他有几个属性分别是

  • collectino=”” 要遍历的集合

  • item 迭代变量, #{迭代变量名}获取内容

  • open  循环后左侧添加的内容

  • close  循环后右侧添加的内容

  • separator 每次循环时,元素之间的分隔符

    例如

 1<select id="selIn" parameterType="list" resultType="my">
2
3    select * from log where id in
4
5   <foreach collection="list" item="abc" open="(" close=")" separator=",">
6
7    #{abc}
8
9   foreach>
10
11select>

7.  说一下和

    当某些sql片段需要复用是,使用标签

    例如

1<sql id="mysql"> 
2    id,my
3sql>

    然后在需要使用的地方使用标签进行引用

    例如

1<select id="">
2
3     select <include refid="mysql">include>
4
5     from my
6
7select>
5缓存

1. 什么是缓存

  • 应用程序和数据库交互的过程是一个相对比较耗时的过程

  • 缓存存在的意义:让应用程序减少对数据库的访问,提升效率

2. 讲一下mybatis的缓存

    MyBatis 中默认SqlSession 缓存开启

  • 同一个 SqlSession 对象调用同一个时,只有第一次访问数据库,第一次之后把查询结果缓存到SqlSession 缓存区(内存)中    

  • 缓存的是statement 对象.(简单记忆必须是用一个),一个对应一个statement对象

  • 有效范围必须是同一个SqlSession 对象

3. 接上一题,看你回答怎么好,他一般会问你,那说说这个缓存的流程吧

    步骤一: 先去缓存区中找是否存在statement

    步骤二:返回结果

    步骤三:如果没有缓存statement 对象,去数据库获取数据

    步骤四:数据库返回查询结果

    步骤五:把查询结果放到对应的缓存区中

4. 什么是二级缓存,一般在什么时候使用二级缓存

    SqlSessionFactory 缓存一般被称为二级缓存,一般在当数据频繁被使用,很少被修改时,使用二级缓存

5. 怎么使用二级缓存

    在 mapper.xml 文件中添加

1<cache readOnly="true">cache>
注意

这几道题是循序渐进的,在面试的时候

6必考点

1. (必考面试题)#{}和${} 的区别

  • #{} 获取参数的内容支持 索引获取,param1 获取指定位置参 数, 并且SQL 使用?占位符,可以有效的防止sql注入的危险

  • ${}字符串拼接不使用?,默认找${内容}内容的 get/set 方法,如果写数字,就是一个数字

2. (必考面试题)讲一下tmybatis的工作原理,背也得背下来

  • 在MyBatis 运行开始时需要先通过 Resources 加载全局配置文件.下面需要实例化SqlSessionFactoryBuilder 构建器.帮助SqlSessionFactory 接口实现类DefaultSqlSessionFactory.

  • 在实例化 DefaultSqlSessionFactory 之前需要先创建 XmlConfigBuilder 解析全局配置文件流,并把解析结果存放在 Configuration 中.之后把Configuratin 传递给 DefaultSqlSessionFactory.到此 SqlSessionFactory 工厂创建成功.

  • 由SqlSessionFactory 工厂创建SqlSession.

  • 每次创建 SqlSession 时,都需要由 TransactionFactory 创建 Transaction 对象, 同时还需要创建 SqlSession 的执行器 Excutor, 最后实例化DefaultSqlSession,传递给SqlSession 接口.

  • 根据项目需求使用SqlSession 接口中的API 完成具体的事务操作.

  • 如果事务执行失败,需要进行rollback 回滚事务.

  •  如果事务执行成功提交给数据库.关闭SqlSession

▼往期精彩回顾▼Java 20000字面试题,吐血推荐Spring Boot 面试题(原创)Spring Cloud 入门级面试题,适合您 扫一扫,关注我

        申请加入Java新手村        

        715bb272402a4ca3489204d02e06b60e.png

294bea15979ed855290961b2ca926ed1.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值