「MyBatis」MyBatis面试宝典:全面解析常见问题和难点

面试题-》Mybatis常见面试题总结

1. 什么是mybatis?

它是一款半自动的ORM持久层框架,具有较高的SQL灵活性,支持高级映射(一对一,一对多),动态SQL,延迟加载和缓存等特性,但它的数据库无关性较低

  1. 什么是ORM?

对象关系映射(Object RelationMapping)。对象指的是Java对象,关系指的是数据库中的关系模型,对象关系映射,指的就是在Java对象和数据库的关系模型之间建立一种对应关系,Student类就对应student表,一个Student对象就对应student表中的一行数据

  1. 为什么mybatis是半自动的ORM框架?

用mybatis进行开发,需要手动编写SQL语句。而全自动的ORM框架,如hibernate,则不需要编写SQL语句。由于mybatis需要手写SQL语句,所以它有较高的灵活性,可以根据需要,自由地对SQL进行定制,也因为要手写SQL,当要切换数据库时,SQL语句可能就要重写,因为不同的数据库有不同的方言(Dialect),所以mybatis的数据库无关性低。

2.怎么理解持久层?

持久层就像是一个“数据仓库”,负责把程序中的数据安全地保存起来,以便需要时能够方便地取出来或者更新。它就像是一个桥梁,连接着程序和数据库之间的数据交流,确保数据的稳定存储和可靠访问。

3. 说一说Mybaits的优点和缺点

优点:

  1. 与JDBC相比,减少了50%的代码量,取消了手动开关连接
  2. 可以与数据库的表结构字段进行一一对应,可以灵活编写SQL语句在XML中
  3. 可以与各种数据库兼容
  4. 能够与spring很好的集成

缺点:

  1. 当业务查询繁琐的时候,需要编写复杂的sql语句
  2. SQL语句依赖于数据库,移植性差,不能随意更换数据库

4. #{}和${}的区别是什么?

${}是字符串替换,#{}是预处理;使用#{}可以有效的防止SQL注入,提高系统安全性。
Mybatis在处理${}时,就是把${}直接替换成变量的值。而Mybatis在处理#{}时,会对sql语句进行预处理,将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值

5. PreparedStatement类

PreparedStatement是Java中用于执行预编译SQL语句的接口。它继承自Statement接口,并提供了一种更高效和安全的方式来执行SQL查询和更新操作。

使用PreparedStatement的步骤如下:

  1. 创建PreparedStatement对象:通过Connection的prepareStatement方法创建PreparedStatement对象,需要传入预编译的SQL语句。
  2. 设置参数值:使用PreparedStatement的set方法设置SQL语句中的参数值。
  3. 执行SQL语句:通过executeQuery方法执行查询语句,或者通过executeUpdate方法执行更新语句。

下面是一个简单的示例,演示了如何使用PreparedStatement执行查询操作:

String sql = "SELECT * FROM users WHERE username = ?";
try (Connection conn = DriverManager.getConnection(url, username, password);
     PreparedStatement pstmt = conn.prepareStatement(sql)) {
    pstmt.setString(1, "john");
    try (ResultSet rs = pstmt.executeQuery()) {
        while (rs.next()) {
            // 处理查询结果
            String username = rs.getString("username");
            int age = rs.getInt("age");
            // ...
        }
    }
} catch (SQLException e) {
    e.printStackTrace();
}

在上述示例中,我们创建了一个PreparedStatement对象,并使用setString方法设置了参数值。然后通过executeQuery方法执行查询,并使用ResultSet遍历查询结果。

通过使用PreparedStatement,我们可以利用预编译的特性,提高查询性能并增加代码的安全性。此外,PreparedStatement还支持批量操作和获取自动生成的主键等功能,使得数据库操作更加灵活和高效。

6. mybatis的一级缓存和二级缓存

一级缓存

  1. 在一个SqlSession的生命周期内,执行2次相同的SQL查询,则第二次SQL查询会直接取缓存的数据,而不走数据库
  2. 默认开启

缓存失效原因

  • 在同一个SqlSession下执行增删改操作时(不必提交),会清除一级缓存
  • SqlSession提交或关闭时(关闭时会自动提交),会清除一级缓存
  • 对mapper.xml中的某个CRUD标签,设置属性flushCache=true,这样会导致该MappedStatement的一级缓存,二级缓存都失效(一个CRUD标签在mybatis中会被封装成一个MappedStatement)
  • 在全局配置文件中设置 ,这样会使一级缓存失效,二级缓存不受影响

二级缓存

  1. 多个SqlSession之间共享的缓存,可以跨SqlSession共享数据
  2. 二级缓存需要我们手动开启

开启二级缓存

  • 首先在全局配置文件 mybatis-configuration.xml 文件中加入如下代码:
<!--开启二级缓存  -->
<settings>    
     <setting name="cacheEnabled" value="true"/>
</settings>
  • springboot配置开启二级缓存
mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.example.demo.entity
  configuration:
    cache-enabled: true
  • 在XXXmapper.xml文件中使用缓存
	<!-- 开启二级缓存 -->
	<cache></cache>
	<!-- 开启二级缓存,配置缓存属性(二选一) -->
    <cache type="org.apache.ibatis.cache.impl.PerpetualCache">
        <property name="eviction" value="LRU" />
        <property name="flushInterval" value="6000000" />
        <property name="size" value="1024" />
        <property name="readOnly" value="false" />
    </cache>

7. Mybatis中 Dao接口和XML文件的SQL如何建立关联

推荐文章-》Mybatis中 Dao接口和XML文件的SQL如何建立关联

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术路上的探险家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值