145. MyBatis 支持哪些类型的 SQL 语句?
MyBatis 是一个优秀的持久层框架,它支持多种类型的 SQL 语句,包括但不限于以下几种:
- 查询语句:
- SELECT:用于从数据库表中检索数据。
- SELECTIVE:根据条件选择性地查询数据。
- 插入语句:
- INSERT:将新记录插入到数据库表中。
- 更新语句:
- UPDATE:更新数据库表中的记录。
- 删除语句:
- DELETE:从数据库表中删除记录。
除了基本的 CRUD(创建、读取、更新、删除)操作外,MyBatis 还支持以下类型的 SQL 语句:
- 动态 SQL:
MyBatis 使用 OGNL 表达式或${}
插入来支持动态 SQL。- IF:条件判断。
- CHOOSE, WHEN, OTHERWISE:类似于 Java 中的 switch 语句。
- WHERE:简化 SQL 条件的拼接。
- SET:用于动态更新语句。
- FOREACH:遍历集合,生成批量操作。
- 批量操作:
- 支持通过
<foreach>
标签进行批量插入、更新和删除。
- 支持通过
- 调用存储过程:
- MyBatis 支持调用数据库存储过程。
以下是一个 MyBatis 动态 SQL 的简单示例:
<mapper namespace="com.example.mapper.UserMapper"><!-- 查询示例 --><select id="selectUser" parameterType="int" resultType="User">SELECT * FROM users WHERE id = #{id}</select><!-- 动态插入示例 --><insert id="insertUser" parameterType="User">INSERT INTO users<trim prefix="(" suffix=")" suffixOverrides=","><if test="name != null">name,</if><if test="email != null">email,</if></trim><trim prefix="VALUES (" suffix=")" suffixOverrides=","><if test="name != null">#{name},</if><if test="email != null">#{email},</if></trim></insert>
</mapper>
以上示例展示了 MyBatis 对各种 SQL 语句的支持,包括静态 SQL 语句和动态 SQL 语句。MyBatis 还支持复杂的映射语句,从而使得 Java 代码与 SQL 语句之间的交互更加灵活和便捷。
146. 什么是 MyBatis 的一级缓存和二级缓存?
MyBatis 的一级缓存和二级缓存是MyBatis提供的两种不同级别的缓存机制,用于减少数据库查询次数,提高应用性能。
一级缓存:
一级缓存是默认开启的,它是基于SqlSession级别的缓存。在同一个SqlSession中,执行相同的SQL查询时,MyBatis会首先检查缓存中是否已经存在相应的查询结果。如果存在,则直接从缓存中取出结果,不再执行数据库查询。
-
特点:
- 同一个SqlSession内有效。
- 不需要配置,自动支持。
- 缓存的生命周期与SqlSession相同。
-
代码示例:
SqlSession sqlSession = sqlSessionFactory.openSession(); try {UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user1 = userMapper.getUserById(1); // 查询数据库User user2 = userMapper.getUserById(1); // 从一级缓存中获取,不会查询数据库 } finally {sqlSession.close(); }
二级缓存:
二级缓存是基于namespace级别的缓存,可以被多个SqlSession共享,通常是基于同一个Mapper接口或者同一个XML Mapper文件。这意味着在多个SqlSession中执行同一个Mapper中的查询操作时,可以从二级缓存中获取数据。
-
特点:
- 多个SqlSession之间共享。
- 需要在Mapper配置文件中显式地开启
<cache>
标签。 - 缓存的生命周期和应用相同,或者直到清理缓存为止。
- 可以通过 eviction、flushInterval、size 等属性进行配置。
-
代码示例(在Mapper XML文件中开启二级缓存):
<mapper namespace="com.example.mapper.UserMapper"><cache eviction="FIFO" flushInterval="60000" size="512" /><!-- Mapper 的 SQL 语句 --> </mapper>
二级缓存使用时需要注意的是,如果涉及到数据的更新操作,为了保证缓存的一致性,MyBatis会默认清除对应Mapper下的二级缓存。此外,也可以通过自定义缓存实现来进一步控制缓存的行为。
综上,一级缓存主要用于SqlSession内部,而二级缓存则适用于跨多个SqlSession的场景,两者都可以有效地减少数据库访问次数,提高应用的数据处理效率。
编程资料包领取:https://pan.quark.cn/s/601cbea644ff
编程、AI、副业交流:https://t.zsxq.com/19zcqaJ2b
领【150 道精选 Java 高频面试题】请 go 公众号:码路向前 。