这里写目录标题
- 1. 什么是mybatis?
- 2.怎么理解持久层?
- 3. 说一说Mybaits的优点和缺点
- 4. #{}和${}的区别是什么?
- 5. PreparedStatement类
- 6. mybatis的一级缓存和二级缓存
- 7. Mybatis中 Dao接口和XML文件的SQL如何建立关联
面试题-》
:Mybatis常见面试题总结
1. 什么是mybatis?
它是一款半自动的ORM持久层框架,具有较高的SQL灵活性,支持高级映射(一对一,一对多),动态SQL,延迟加载和缓存等特性,但它的数据库无关性较低
- 什么是ORM?
对象关系映射(Object RelationMapping)。对象指的是Java对象,关系指的是数据库中的关系模型,对象关系映射,指的就是在
Java对象和数据库的关系模型之间建立一种对应关系
,Student类就对应student表,一个Student对象就对应student表中的一行数据
- 为什么mybatis是半自动的ORM框架?
用mybatis进行开发,需要手动编写SQL语句。而全自动的ORM框架,如hibernate,则不需要编写SQL语句。由于mybatis需要手写SQL语句,所以它有较高的灵活性,可以根据需要,自由地对SQL进行定制,也因为要手写SQL,当要切换数据库时,SQL语句可能就要重写,因为不同的数据库有不同的方言(Dialect),所以mybatis的数据库无关性低。
2.怎么理解持久层?
持久层就像是一个“数据仓库”,负责把程序中的数据安全地保存
起来,以便需要时能够方便地取出来或者更新。它就像是一个桥梁,连接
着程序和数据库之间的数据交流,确保数据的稳定存储和可靠访问。
3. 说一说Mybaits的优点和缺点
优点:
- 与JDBC相比,减少了50%的代码量,取消了手动开关连接
- 可以与数据库的表结构字段进行一一对应,可以灵活编写SQL语句在XML中
- 可以与各种数据库兼容
- 能够与spring很好的集成
缺点:
- 当业务查询繁琐的时候,需要编写复杂的sql语句
- SQL语句依赖于数据库,移植性差,不能随意更换数据库
4. #{}和${}的区别是什么?
${}
是字符串替换,#{}
是预处理;使用#{}
可以有效的防止SQL注入,提高系统安全性。
Mybatis在处理${}
时,就是把${}
直接替换成变量的值。而Mybatis在处理#{}
时,会对sql语句进行预处理,将sql中的#{}
替换为?
号,调用PreparedStatement
的set方法来赋值
5. PreparedStatement类
PreparedStatement是Java中用于执行预编译SQL语句的接口
。它继承自Statement接口,并提供了一种更高效和安全的方式来执行SQL查询和更新操作。
使用PreparedStatement的步骤如下:
创建PreparedStatement对象
:通过Connection的prepareStatement方法创建PreparedStatement对象,需要传入预编译的SQL语句。设置参数值
:使用PreparedStatement的set方法设置SQL语句中的参数值。执行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的一级缓存和二级缓存
一级缓存
:
- 在一个SqlSession的生命周期内,执行2次相同的SQL查询,则第二次SQL查询会直接取缓存的数据,而不走数据库
- 默认开启
缓存失效原因
:
- 在同一个SqlSession下执行增删改操作时(不必提交),会清除一级缓存
- SqlSession提交或关闭时(关闭时会自动提交),会清除一级缓存
- 对mapper.xml中的某个CRUD标签,设置属性flushCache=true,这样会导致该MappedStatement的一级缓存,二级缓存都失效(一个CRUD标签在mybatis中会被封装成一个MappedStatement)
- 在全局配置文件中设置 ,这样会使一级缓存失效,二级缓存不受影响
二级缓存
:
- 多个SqlSession之间共享的缓存,可以跨SqlSession共享数据
- 二级缓存需要我们手动开启
开启二级缓存
:
- 首先在全局配置文件 mybatis-configuration.xml 文件中加入如下代码:
<!--开启二级缓存 -->
<settings> <setting name="cacheEnabled" value="true"/>
</settings>
- springboot配置开启二级缓存
mybatis:mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.example.demo.entityconfiguration: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如何建立关联