MyBatis面试题及答案(21-25)

21、MyBatis中的批量插入和批量更新如何实现?

在MyBatis中,可以使用batch语句来实现批量插入和批量更新,以减少与数据库的交互次数,提高效率。具体实现方式如下:

1)批量插入

// 定义一个List,其中包含要插入的对象
List<User> userList = new ArrayList<>();
userList.add(user1);
userList.add(user2);
userList.add(user3);
// 使用批量插入语句插入数据
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
for (User user : userList) {
    userMapper.insertUser(user);
}
sqlSession.commit();
sqlSession.close();

2)批量更新

// 定义一个List,其中包含要更新的对象
List<User> userList = new ArrayList<>();
userList.add(user1);
userList.add(user2);
userList.add(user3);
// 使用批量更新语句更新数据
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
for (User user : userList) {
    userMapper.updateUser(user);
}
sqlSession.commit();
sqlSession.close();

需要注意的是,使用批量插入和批量更新时,需要在MyBatis的配置文件中配置batch的执行器类型,例如:

<configuration>
    <settings>
        <setting name="defaultExecutorType" value="BATCH"/>
    </settings>
    ...
</configuration>

22、MyBatis中的XML配置文件中的property标签和parameterType属性有什么区别?

MyBatis中的XML配置文件中的property标签和parameterType属性都是用于指定SQL语句中的参数类型,但它们的使用场景和含义有所不同:

property标签:用于指定Java对象中的某个属性作为参数。当Java对象作为参数传递给SQL语句时,MyBatis会自动将该Java对象中的属性值设置到SQL语句中的参数上。
parameterType属性:用于指定Java对象本身作为参数。当Java对象作为参数传递给SQL语句时,MyBatis会将该Java对象作为一个整体传递给SQL语句。
例如,有如下的Java对象:

public class User {
    private Long id;
    private String username;
    private String password;
    // getter和setter方法
}

使用property标签的示例:

<!-- 插入用户数据 -->
<insert id="insertUser" parameterType="User">
    insert into user (username, password) values (#{username}, #{password})
</insert>

使用parameterType属性的示例:

<!-- 查询用户数据 -->
<select id="selectUser" resultType="User" parameterType="Long">
    select * from user where id = #{id}
</select>

23、MyBatis中的resultType和resultMap有什么区别?

在MyBatis中,resultType和resultMap都是用来映射查询结果到Java对象的。区别如下:
resultType是指定返回结果的类型,可以是Java中的基本类型、JavaBean、Map等。
resultMap是指定映射关系的定义,包含了结果集列和JavaBean属性之间的映射关系,可以复用。使用resultMap可以让映射关系更灵活、易于维护。
一般来说,如果查询结果只有一列或者基本类型,可以使用resultType;如果查询结果比较复杂,包含多个列或关联查询,建议使用resultMap。

24、MyBatis中的动态SQL中的choose、when、otherwise标签的作用是什么?

MyBatis中的动态SQL中的choose、when、otherwise标签用于条件分支处理,类似于Java中的if-else语句。choose标签包含多个when标签和一个可选的otherwise标签,当when标签中的条件成立时,执行when标签中的SQL语句;如果所有when标签都不成立,执行otherwise标签中的SQL语句。

25、MyBatis中的枚举类型如何处理?

MyBatis中的枚举类型可以通过TypeHandler进行处理。TypeHandler是MyBatis中处理Java对象和数据库中数据类型转换的核心组件之一,可以自定义实现TypeHandler接口或继承BaseTypeHandler类来实现特定类型的转换。对于枚举类型,可以实现一个枚举类型的TypeHandler,将Java中的枚举类型转换为数据库中的相应数据类型,或将数据库中的数据类型转换为Java中的枚举类型。