关于mybatis面试题汇总

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、 调用session.commit()提交事务
5、 调用session.close()关闭会话

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值