1.什么是mybatis?
Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程。程序员直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高。
2.ORM是什么
ORM(Object Relational Mapping),对象关系映射,是一种为了解决关系型数据库数据与简单Java对象(POJO)的映射关系的技术。
ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系型数据库中。
3.Mybaits与Hibernate的优点和缺点
Mybatis优点:
1.sql灵活
2.数据量大时效率高
缺点:
1.依赖于数据库,导致数据库移植性差,不能随意更换数据库
2.SQL语句的编写工作量较大
Hibernate优点:
1.不依赖与数据库
2.无需写sql语句,提高了工作效率
缺点:1.自动生成的sql语句不够灵活
2.数据量大时不够灵活
4.MyBatis 与 Hibernate 有哪些不同
Mybatis 是一个半 ORM(对象关系映射)框架,Hibernate属于全自动ORM映射工具
Mybatis 直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一但需求变化要求迅速输出成果。但是灵活的前提是 mybatis 无法做到数据库无关性,如果需要实现支持多种数据库的软件, 则需要自定义多套 sql 映射文件,工作量大。
Hibernate 对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用 hibernate 开发可以节省很多代码,提高效率。
5.mybatis对JDBC有哪些优化
(1) 使用数据库连接池对连接进行管理(protecties文件)
(2) SQL语句统一存放到配置文件(mapper文件)
(3) SQL语句变量和传入参数的映射以及动态SQL(${username}、、、)
(4) 动态SQL语句的处理(if、、、test、、、)
(5) 对数据库操作结果的映射和结果缓存
(6) SQL语句的重复(mapper文件)
6.#{}和${}的区别?
#{}是占位符,预编译处理;KaTeX parse error: Expected 'EOF', got '#' at position 22: …,字符串替换,没有预编译处理 #̲{} 可以有效的防止SQL注入…{} 不能防止SQL注入
变量替换后,#{} 对应的变量自动加上单引号 ‘’;变量替换后,${} 对应的变量不会加上单引号 ‘’
7.讲述Mapper动态代理的实现原理
Mybatis使用JDK的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke()方法。
8.mybatis配置文件中别名的作用
当数据库的字段与类中的属性名不一致时,通过别名改成一致
9.如何实现主键回填
1.需要在insert标签上加上 useGeneratedKeys=“true” keyProperty=“主键”
2.
<selectKey keyProperty="id" resultType="String" order="AFTER">
select LAST_INSERT_ID()
</selectKey>
10.Mybatis动态sql有什么用?执行原理?有哪些动态sql?
Mybatis动态sql可以在Xml映射文件内,以标签的形式编写动态sql,执行原理是根据表达式的值 完成逻辑判断 并动态拼接sql的功能。
Mybatis提供了9种动态sql标签:trim | where | set | foreach | if | choose | when | otherwise | bind。
11.当实体类中的属性名和表中的字段名不一样,怎么办?
1.在查询的时候起别名,使之与属性名一致 as 或者 空格接别名
2.resultMap
//id代表映射到sql语句的唯一标识 type代表映射类型支持别名
<resultMap id="brandResultMap" type="brand">
//resultMap中有两个标签 id代表主键 result代表属性
//result标签中column 代表数据库中列名 property代表实体属性名
<result column="brand_name" property="brandName"></result>
<result column="company_name" property="companyName"></result>
</resultMap>
12,模糊查询like语句该怎么写?
<select id="queryPersonList" resultMap="BaseResultMap">
SELECT
personName, personPassword, address
FROM person_info
<where>
1=1
<if test="personName != null and personName !=''">
AND personName LIKE
CONCAT('%', #{personName}, '%')
</if>
</where>
</select>
13,Mybatis如何实现分页
public PageInfo<Contact> showAllPage(int currentPage, int pageSize) {
PageHelper.startPage(currentPage,pageSize);
List<Contact> contacts = null;
try {
contacts = this.mapper().showAll(); //查询所有信息select * from 表
} catch (Exception e) {
e.printStackTrace();
}
PageInfo<Contact> contactPageInfo = new PageInfo<>(contacts);
return contactPageInfo;
}
14.延迟加载
在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false
它的原理是,使用 CGLIB 创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用 a.getB().getName(),拦截器 invoke()方法发现 a.getB()是null 值,那么就会单独发送事先保存好的查询关联 B 对象的 sql,把 B 查询上来,然后调用 a.setB(b),于是 a 的对象 b 属性就有值了,接着完成 a.getB().getName()方法的调用。这就是延迟加载的基本原理。
15.MyBatis编程步骤
1、 创建SqlSessionFactory
2、 通过SqlSessionFactory创建SqlSession
3、 通过sqlsession执行数据库操作
4、 调用sessionmit()提交事务
5、 调用session.close()关闭会话
更多推荐
关于mybatis面试题汇总
发布评论