点击上方蓝色"慕阳源码",选择"设为星标"
回复"资源"获取独家整理的学习资料
导读
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 是一个强大、方便、高效、复杂、间接、全自动化的持久层框架
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动态sql1. 什么是动态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新手村
戳