🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。
🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。
🎉欢迎 👍点赞✍评论⭐收藏
Mybatis知识专栏学习
Mybatis知识云集 | 访问地址 | 备注 |
---|---|---|
Mybatis知识点(1) | https://blog.csdn.net/m0_50308467/article/details/134122119 | Mybatis专栏 |
Mybatis知识点(2) | https://blog.csdn.net/m0_50308467/article/details/134450807 | Mybatis专栏 |
Mybatis知识点(3) | https://blog.csdn.net/m0_50308467/article/details/134450920 | Mybatis专栏 |
文章目录
- 01、Mybatis 分页查询如何实现?
- 02、Mybatis 能执行一对多,一对一的联系查询吗,有哪些实现方法?
- 03、为什么需要预编译?
- 04、MyBatis 是什么?
- 05、讲下 MyBatis 的缓存?
- 06、为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?
- 07、如何获取自动生成的(主)键值?
- 08、什么情况下用注解绑定,什么情况下用 xml 绑定?
- 09、Mybais 常用注解 ?
- 10、MyBatis 的框架架构设计是怎么样的?
- 11、简述Mybatis的插件运行原理,以及如何编写一个插件?
- 12、Mybatis 是如何执行批量插入的?
- 13、接口绑定有几种实现方式,分别是怎么实现的?
- 14、Mybatis 模糊查询 like 语句该怎么写?
- 15、Mybatis 与 Spring 如何整合?
- 16、resultType 和 resultMap 的区别?
- 17、Mybatis 的一级缓存和二级缓存?
- 18、Mybatis 的映射文件,讲解一下?
- 19、Mybatis 比 IBatis 比较大的几个改进是什么?
- 20、什么是 DBMS?
- 21、什么是 MyBatis 的接口绑定?有哪些实现方式?
- 22、Mybatis 的表关联的映射?
- 23、SQLMapConfig.xml 中配置有哪些内容?
- 24、简述 Mybatis 的 Xml 映射文件和 Mybatis 内部数据结构之间的映射关系?
- 25、如何获取生成的主键?
- 26、Mybatis 执行批量插入,能返回数据库主键列表吗?
- 27、简述 Mybatis 的 Xml 映射文件和 Mybatis 内部数据结构之间的映射关系?
- 28、MyBatis 框架的优缺点各是什么?
01、Mybatis 分页查询如何实现?
在 MyBatis 中实现分页查询可以通过使用插件或者手动编写 SQL 语句来实现。
1. 使用插件(以 PageHelper 为例)
:
a. 首先,你需要在你的项目中引入 PageHelper 依赖。你可以在 Maven 中添加以下依赖:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>最新版本号</version>
</dependency>
b. 然后,在 MyBatis 配置文件中配置 PageHelper 插件。在 <configuration>
标签下添加如下内容:
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="dialect" value="数据库方言"/>
</plugin>
</plugins>
其中, 数据库方言
需要根据你所使用的数据库进行配置,比如 MySQL、Oracle 等。
c. 在你的查询方法上使用 PageHelper.startPage 方法指定页码和每页的大小,然后执行查询语句。例如:
int pageNum = 1; // 当前页码
int pageSize = 10; // 每页大小
PageHelper.startPage(pageNum, pageSize);
List<User> userList = userDao.getUserList(); // 执行查询语句
PageInfo<User> pageInfo = new PageInfo<>(userList); // 获取分页信息
这样就可以实现分页查询了。PageHelper 会自动在查询语句中添加 LIMIT 子句,限制查询结果的数量。
2. 手动编写 SQL 语句
:
a. 在你的 SQL 语句中使用 LIMIT 关键字来指定查询的起始位置和数量。起始位置可以通过计算页码和每页大小得出。例如:
SELECT * FROM user LIMIT 起始位置, 每页大小;
其中, 起始位置
可以通过公式 (pageNum - 1) * pageSize
计算得出。
b. 在 Java 代码中,你可以通过传递页码和每页大小的参数来执行 SQL 语句。例如:
int pageNum = 1; // 当前页码
int pageSize = 10; // 每页大小
int offset = (pageNum - 1) * pageSize; // 起始位置
List<User> userList = userDao.getUserListByPage(offset, pageSize); // 执行查询语句
在你的 UserDao 接口中定义一个名为 getUserListByPage
的方法,用于执行分页查询的 SQL 语句。
这些是在 MyBatis 中实现分页查询的两种常见方法。具体的实现方式取决于你的项目需求和个人偏好。希望对你有所帮助!如有任何问题,请随时提问。
02、Mybatis 能执行一对多,一对一的联系查询吗,有哪些实现方法?
MyBatis 可以执行一对多、一对一的关联查询。在 MyBatis 中,可以通过以下方式来实现:
1. 使用嵌套查询
:在主查询中使用子查询来查询关联数据。例如,查询一个用户及其所有订单的信息,可以使用以下 SQL 语句:
SELECT * FROM user WHERE id = #{userId};
SELECT * FROM order WHERE user_id = #{userId};
在 MyBatis 中,可以使用 association
和 collection
标签来实现嵌套查询。例如:
<select id="getUserWithOrders" resultMap="userWithOrders">
SELECT * FROM user WHERE id = #{userId};
<collection property="orders" ofType="order">
SELECT * FROM order WHERE user_id = #{userId};
</collection>
</select>
<resultMap id="userWithOrders" type="user">
<id property="id" column="id"/>
<result property="name" column="name"/>
<collection property="orders" ofType="order">
<id property="id" column="id"/>
<result property="orderNo" column="order_no"/>
</collection>
</resultMap>
2. 使用关联查询
:在主查询中通过关联条件查询关联数据。例如,查询一个用户及其所在的部门信息,可以使用以下 SQL 语句:
SELECT * FROM user u JOIN department d ON u.department_id = d.id WHERE u.id = #{userId};
在 MyBatis 中,可以使用 association
和 collection
标签来实现关联查询。例如:
<select id="getUserWithDepartment" resultMap="userWithDepartment">
SELECT * FROM user u JOIN department d ON u.department_id = d.id WHERE u.id = #{userId};
</select>
<resultMap id="userWithDepartment" type="user">
<id property="id" column="id"/>
<result property="name" column="name"/>
<association property="department" javaType="department">
<id property="id" column="id"/>
<result property="name" column="name"/>
</association>
</resultMap>
这些是在 MyBatis 中实现一对多、一对一关联查询的两种常见方法。具体的实现方式取决于你的项目需求和个人偏好。希望对你有所帮助!如有任何问题,请随时提问。
03、为什么需要预编译?
预编译(Prepared Statement)是一种数据库查询优化技术,它可以提高数据库查询的性能和安全性。下面是一些需要预编译的原因:
1. 提高性能
:预编译可以将 SQL 查询语句预先编译成一个可执行的查询计划,然后将参数传递给该查询计划进行执行。这样可以减少每次查询时编译 SQL 语句的开销,提高查询的执行效率。
2. 防止 SQL 注入攻击
:预编译可以对输入的参数进行参数化处理,将参数值与查询语句逻辑分离。这样可以防止恶意用户通过输入特殊字符来修改查询逻辑,从而保护数据库的安全性。
3. 重复利用查询计划
:预编译可以将查询计划缓存起来,可以重复使用相同的查询计划执行多次查询。这样可以减少数据库的资源消耗,并提高查询的响应速度。
4. 提供代码的可读性和可维护性
:预编译可以将 SQL 查询语句与 Java 代码分离,使代码更加清晰和易于维护。同时,预编译也提供了更多的查询参数设置选项,例如设置参数的数据类型、设置参数的空值等。
总之,预编译是一种优化数据库查询的技术,它可以提高查询性能、保护数据库安全,并提供更好的可读性和可维护性。在使用数据库时,推荐使用预编译语句来执行查询操作。
04、MyBatis 是什么?
MyBatis(前身为iBatis)是一个开源的持久层框架,用于简化数据库访问的开发工作。它提供了一种将数据库操作与 Java 对象映射起来的方式,使得开发人员可以通过编写简单的 XML 或注解来配置 SQL 语句,实现数据库的增删改查操作。
MyBatis 的核心思想是将 SQL 语句与 Java 代码解耦,通过配置文件或注解的方式来描述数据库操作,使得代码更加清晰、易于维护。它支持动态 SQL,可以根据不同的条件生成不同的 SQL 语句,从而提供更大的灵活性。
MyBatis 的主要特点包括:
1. 简化数据库操作
:MyBatis 提供了简洁的 API,使得开发人员可以通过编写简单的 SQL 语句来进行数据库操作,无需手动处理 JDBC 的繁琐操作。
2. 强大的映射功能
:MyBatis 支持将查询结果映射到 Java 对象,可以通过配置文件或注解来定义对象与数据库表之间的映射关系,使得数据的读取和写入更加方便。
3. 动态 SQL
:MyBatis 具有强大的动态 SQL 功能,可以根据不同的条件生成不同的 SQL 语句,从而实现灵活的查询和更新操作。
4. 缓存支持
:MyBatis 支持一级缓存和二级缓存,可以提高查询性能,减少数据库访问次数。
5. 插件扩展
:MyBatis 允许开发人员编写自定义的插件来扩展框架的功能,例如实现自定义的拦截器、日志记录等。
总之,MyBatis 是一个简单、灵活且功能强大的持久层框架,它在数据库访问方面提供了很多便利的功能,被广泛应用于 Java 项目中。无论是小型应用还是大型企业级应用,MyBatis 都可以帮助开发人员更高效地进行数据库操作。
05、讲下 MyBatis 的缓存?
MyBatis 提供了两级缓存来提高查询性能:一级缓存(本地缓存)和二级缓存(全局缓存)。
1. 一级缓存(本地缓存)
:
-
一级缓存是 MyBatis 默认开启的缓存级别,它位于 SqlSession 的作用域内,即同一个 SqlSession 对象中的多次查询可以共享缓存。
-
当执行查询语句时,查询的结果会被缓存在一级缓存中,下次相同的查询语句会直接从缓存中获取结果,而不需要再次访问数据库。
-
一级缓存的生命周期与 SqlSession 的生命周期相同,当 SqlSession 关闭或进行更新操作(插入、更新、删除)时,一级缓存会被清空。
2. 二级缓存(全局缓存)
:
-
二级缓存是跨 SqlSession 的缓存,它可以被多个 SqlSession 共享。
-
二级缓存需要手动配置,可以配置在映射文件中或通过注解方式进行配置。
-
当执行查询语句时,查询的结果会被缓存在二级缓存中,下次相同的查询语句可以从二级缓存中获取结果,而不需要再次访问数据库。
-
二级缓存的生命周期与整个应用程序的生命周期相同,当应用程序关闭时,二级缓存会被销毁。
-
二级缓存默认使用的是 PerpetualCache,可以根据需求切换为其他的缓存实现,如 Ehcache、Redis 等。
需要注意的是,缓存是针对查询操作的,对于更新操作(插入、更新、删除),缓存会被清空,以保证数据的一致性。
在使用缓存时,需要根据具体的业务需求进行配置和使用,合理使用缓存可以有效地提高查询性能。但同时也需要注意缓存的有效性和数据一致性,避免出现脏数据或缓存过期的情况。
06、为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?
MyBatis 被称为半自动 ORM(对象关系映射)映射工具,是因为它在数据库访问和对象映射之间提供了一定程度的手动控制。
与全自动的 ORM 工具(如 Hibernate)相比,MyBatis 的区别主要体现在以下几个方面:
1. SQL 控制
:在 MyBatis 中,开发人员需要手动编写 SQL 语句,通过 XML 配置文件或注解来描述数据库操作。
这意味着开发人员可以直接控制 SQL 的编写和优化,更加灵活地处理复杂的查询和性能优化。而全自动的 ORM 工具会自动生成 SQL 语句,开发人员无法直接控制和优化生成的 SQL。
2. 对象关系映射
:MyBatis 提供了强大的对象关系映射功能,可以将查询结果映射到 Java 对象,通过配置文件或注解来定义对象与数据库表之间的映射关系。
但与全自动的 ORM 工具相比,MyBatis 的对象关系映射相对较为简单,需要开发人员手动配置映射关系。
举例来说,假设有一个 User 表和一个 User 对象:
在 MyBatis 中,你需要手动编写 SQL 语句,并在配置文件中定义 User 表与 User 对象的映射关系。例如:
<!-- 配置文件中定义 User 表与 User 对象的映射关系 -->
<resultMap id="userMap" type="User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
</resultMap>
<!-- 查询语句 -->
<select id="getUserById" resultMap="userMap">
SELECT * FROM user WHERE id = #{id}
</select>
而在全自动的 ORM 工具中,你只需要定义 User 对象,并使用工具自动生成 SQL 语句和对象映射关系。例如:
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Integer age;
// getters and setters
}
全自动的 ORM 工具会根据注解自动生成 SQL 语句和对象映射关系。
总之,MyBatis 是半自动的 ORM 映射工具,它提供了更灵活的 SQL 控制和对象关系映射配置,开发人员可以更加精细地控制和优化数据库访问。与全自动的 ORM 工具相比,MyBatis 需要开发人员手动编写 SQL 语句和配置对象映射关系,但也提供了更大的灵活性和控制权。
07、如何获取自动生成的(主)键值?
在 MyBatis 中,获取自动生成的主键值可以通过以下方式:
1. 在插入语句中使用
useGeneratedKeys
和 keyProperty
属性:
a. 首先,在插入语句中添加 useGeneratedKeys="true"
属性,表示使用数据库自动生成的主键。
b. 然后,在插入语句中添加 keyProperty
属性,指定一个 Java 对象的属性来接收生成的主键值。
举例来说,假设有一个 User 表,其中 id 字段是自动生成的主键:
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user(name, age) VALUES(#{name}, #{age})
</insert>
在执行插入操作后,MyBatis 会将生成的主键值自动设置到指定的 keyProperty
属性中。
2. 使用
<selectKey>
元素:
a. 在插入语句之前,使用 <selectKey>
元素来查询生成的主键值。
b. 在 <selectKey>
元素中,指定查询生成主键的 SQL 语句,并使用 resultType
属性指定主键值的类型。
c. 在插入语句中,使用 ${}
语法引用 <selectKey>
元素中查询到的主键值。
举例来说,假设有一个 User 表,其中 id 字段是自动生成的主键:
<insert id="insertUser">
<selectKey keyProperty="id" resultType="java.lang.Long" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO user(name, age) VALUES(#{name}, #{age})
</insert>
在执行插入操作后, #{id}
会被替换为生成的主键值。
这些是获取自动生成的主键值的两种常见方式。具体的实现方式取决于你的数据库和项目需求。希望对你有所帮助!如有任何问题,请随时提问。
08、什么情况下用注解绑定,什么情况下用 xml 绑定?
在 MyBatis 中,可以使用注解或 XML 来进行绑定(映射)操作。选择使用哪种方式取决于个人和项目的偏好,以及具体的使用场景。
使用注解绑定的情况:
- 简单的 SQL 语句:当 SQL 语句比较简单且较少时,使用注解可以更加方便和直观地编写和维护代码。
- 简单的对象映射:当对象与数据库表之间的映射关系比较简单时,使用注解可以更加方便地进行对象属性与数据库字段的映射。
举例来说,假设有一个 User 表和一个 User 对象,需要进行简单的查询操作:
使用注解绑定的方式可以这样实现:
@Mapper
public interface UserMapper {
@Select("SELECT * FROM user WHERE id = #{id}")
User getUserById(Long id);
}
使用 XML 绑定的情况:
- 复杂的 SQL 语句:当 SQL 语句比较复杂且包含动态 SQL、复杂的查询逻辑或大量的参数时,使用 XML 可以更好地组织和管理 SQL 语句。
- 复杂的对象映射:当对象与数据库表之间的映射关系比较复杂时,使用 XML 可以更灵活地配置对象的映射关系,包括继承、关联关系等。
举例来说,假设有一个 User 表和一个 User 对象,需要进行复杂的查询操作:
使用 XML 绑定的方式可以这样实现:
在映射文件中定义 SQL 语句和对象映射关系:
<!-- userMapper.xml -->
<mapper namespace="com.example.UserMapper">
<select id="getUserById" resultType="com.example.User">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
在接口中引用映射文件:
public interface UserMapper {
User getUserById(Long id);
}
总之,使用注解绑定适合简单的 SQL 语句和对象映射,而使用 XML 绑定适合复杂的 SQL 语句和对象映射。选择哪种方式取决于具体的需求和个人偏好。
09、Mybais 常用注解 ?
MyBatis 提供了多种常用的注解来简化数据库操作的配置和映射。以下是一些常用的 MyBatis 注解以及举例说明:
1. @Mapper
:用于标识接口为 MyBatis 的 Mapper 接口,可通过扫描或 XML 配置文件与对应的映射文件关联。
@Mapper
public interface UserMapper {
// Mapper 接口方法
}
2. @Select
:用于配置查询语句,指定 SQL 语句或调用映射文件中的 SQL 语句进行查询操作。
@Select("SELECT * FROM user WHERE id = #{id}")
User getUserById(Long id);
3. @Insert
:用于配置插入语句,指定 SQL 语句或调用映射文件中的 SQL 语句进行插入操作。
@Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")
void insertUser(User user);
4. @Update
:用于配置更新语句,指定 SQL 语句或调用映射文件中的 SQL 语句进行更新操作。
@Update("UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}")
void updateUser(User user);
5. @Delete
:用于配置删除语句,指定 SQL 语句或调用映射文件中的 SQL 语句进行删除操作。
@Delete("DELETE FROM user WHERE id = #{id}")
void deleteUser(Long id);
6. @Results
:用于配置结果集映射,指定数据库字段与 Java 对象属性之间的映射关系。
@Results({
@Result(property = "id", column = "id"),
@Result(property = "name", column = "name"),
@Result(property = "age", column = "age")
})
@Select("SELECT * FROM user")
List<User> getAllUsers();
7. @Result
:用于配置单个字段的映射关系,指定数据库字段与 Java 对象属性之间的映射关系。
@Results({
@Result(property = "id", column = "id"),
@Result(property = "name", column = "name"),
@Result(property = "age", column = "age")
})
@Select("SELECT id, name, age FROM user")
List<User> getAllUsers();
8. @Param
:用于指定参数名称,使得在 SQL 语句中可以引用参数名而不是位置。
@Select("SELECT * FROM user WHERE name = #{name} AND age = #{age}")
User getUserByNameAndAge(@Param("name") String name, @Param("age") int age);
这些注解可以用于在接口方法上进行配置,简化了 XML 配置的过程,使得代码更加简洁和易于维护。
10、MyBatis 的框架架构设计是怎么样的?
MyBatis 的框架架构设计是基于经典的数据访问层模式,采用了以下几个核心组件:
1. SqlSessionFactoryBuilder
:用于创建 SqlSessionFactory,它负责解析配置文件和构建 SqlSessionFactory 对象。
2. SqlSessionFactory
:是 MyBatis 的核心接口,用于创建 SqlSession 对象。它是线程安全的,通常在应用程序启动时创建一次,并在整个应用程序生命周期中重复使用。
3. SqlSession
:是与数据库交互的主要接口,它提供了执行 SQL 语句、获取映射器和提交事务等操作。SqlSession 是非线程安全的,每个线程需要独立创建和关闭。
4. Mapper 接口
:Mapper 接口是定义数据库操作的接口,使用注解或 XML 进行配置。Mapper 接口中的方法与 SQL 语句相对应,通过 SqlSession 的 getMapper 方法获取 Mapper 接口的实现。
5. 映射器(Mapper)
:映射器是 Mapper 接口的实现类,它将数据库操作与 SQL 语句绑定在一起,提供了执行 SQL 语句的方法。
6. 映射文件(Mapper XML)
:映射文件是用于配置 SQL 语句和对象映射关系的 XML 文件。它定义了数据库操作的 SQL 语句、参数映射、结果集映射等。
7. 插件(Plugins)
:插件可以扩展 MyBatis 的功能,例如实现自定义的拦截器、日志记录等。
总体来说,MyBatis 的框架架构设计是基于 SqlSessionFactory、SqlSession 和 Mapper 接口的组合,通过配置文件或注解来描述 SQL 语句和对象映射关系,从而实现数据库操作的简化和灵活性。
11、简述Mybatis的插件运行原理,以及如何编写一个插件?
MyBatis 的插件机制允许开发人员在 SQL 执行过程中拦截和修改 SQL 语句,从而实现对 MyBatis 核心功能的扩展和定制。插件运行原理如下:
1. 插件是通过动态代理机制实现的
。在 MyBatis 中,每个 SQL 语句的执行都是通过 Executor
接口的实现类来完成的。插件可以通过动态代理的方式,拦截 Executor
的方法调用,从而在 SQL 执行前后进行一些自定义的操作。
2. 插件需要实现
Interceptor 接口,并实现其中的
intercept 方法和
plugin` 方法。
-
intercept
方法用于自定义拦截逻辑,可以在 SQL 执行前后进行一些操作,如修改 SQL 语句、记录日志等。 -
plugin
方法用于返回一个被拦截的对象的代理对象。MyBatis 在创建Executor
对象时,会将该对象传递给plugin
方法进行代理生成。
3. 插件需要在 MyBatis 配置文件中进行配置,指定要拦截的对象和要应用的插件。
编写一个插件的步骤如下:
-
创建一个实现
Interceptor
接口的插件类,实现其中的intercept
方法和plugin
方法。 -
在
intercept
方法中编写自定义的拦截逻辑。 -
在
plugin
方法中返回被拦截对象的代理对象。 -
在 MyBatis 配置文件中进行插件的配置,指定要拦截的对象和要应用的插件。
以下是一个简单的示例,演示如何编写一个插件来记录 SQL 执行时间:
public class SqlTimingPlugin implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
long startTime = System.currentTimeMillis();
Object result = invocation.proceed();
long endTime = System.currentTimeMillis();
long timing = endTime - startTime;
System.out.println("SQL execution time: " + timing + "ms");
return result;
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
}
在 MyBatis 配置文件中进行插件的配置:
<plugins>
<plugin interceptor="com.example.SqlTimingPlugin" />
</plugins>
通过以上步骤,就可以编写一个简单的插件来记录 SQL 执行时间。
12、Mybatis 是如何执行批量插入的?
MyBatis 提供了批量插入的功能,可以一次性插入多条数据,以提高数据库操作的效率。下面是 MyBatis 执行批量插入的一般步骤:
1. 创建一个包含待插入数据的 List 集合。
2. 在映射文件或使用注解的方式中
,编写插入语句,使用 <foreach>
标签或 @Param
注解来引用 List 集合中的数据。
3. 在 Java 代码中,调用插入方法并传入 List 集合,执行批量插入操作。
以下是一个示例,演示如何使用 MyBatis 执行批量插入操作:
在映射文件中定义插入语句:
<!-- userMapper.xml -->
<insert id="batchInsertUser" parameterType="java.util.List">
INSERT INTO user(name, age) VALUES
<foreach collection="list" item="user" separator=",">
(#{user.name}, #{user.age})
</foreach>
</insert>
在 Mapper 接口中定义插入方法:
public interface UserMapper {
void batchInsertUser(List<User> userList);
}
在 Java 代码中调用插入方法,传入待插入的 List 集合:
List<User> userList = new ArrayList<>();
userList.add(new User("Alice", 25));
userList.add(new User("Bob", 30));
userList.add(new User("Charlie", 28));
userMapper.batchInsertUser(userList);
通过以上步骤,就可以使用 MyBatis 执行批量插入操作。MyBatis 会将 List 集合中的数据拼接成一条 SQL 语句,一次性插入到数据库中,从而提高插入的效率。
13、接口绑定有几种实现方式,分别是怎么实现的?
接口绑定在 MyBatis 中有两种实现方式:XML 配置和注解。
1. XML 配置方式
:
-
创建一个接口,定义数据库操作的方法。
-
在映射文件中,使用
<mapper>
标签指定命名空间,并使用<select>
、<insert>
、<update>
、<delete>
等标签来配置具体的 SQL 语句和映射关系。 -
在 MyBatis 配置文件中,通过
<mappers>
标签或<mapper>
标签的 resource 属性或 class 属性来引入映射文件。 -
在 Java 代码中,通过
SqlSession
的getMapper
方法获取接口的实现对象,从而调用接口中定义的数据库操作方法。
示例代码如下:
在映射文件中定义 SQL 语句和映射关系:
<!-- userMapper.xml -->
<mapper namespace="com.example.UserMapper">
<select id="getUserById" resultType="com.example.User">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
在接口中引用映射文件:
public interface UserMapper {
User getUserById(Long id);
}
在 Java 代码中调用接口方法:
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.getUserById(1L);
2. 注解方式
:
-
创建一个接口,定义数据库操作的方法,并使用
@Select
、@Insert
、@Update
、@Delete
等注解来配置具体的 SQL 语句。 -
在 MyBatis 配置文件中开启注解扫描或使用
<mapper>
标签的 class 属性来引入接口。 -
在 Java 代码中,通过
SqlSession
的getMapper
方法获取接口的实现对象,从而调用接口中定义的数据库操作方法。
示例代码如下:
在接口中使用注解配置 SQL 语句:
public interface UserMapper {
@Select("SELECT * FROM user WHERE id = #{id}")
User getUserById(Long id);
}
在 Java 代码中调用接口方法:
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.getUserById(1L);
以上是接口绑定的两种实现方式。根据个人和项目的需求,可以选择适合的方式来进行接口绑定。
14、Mybatis 模糊查询 like 语句该怎么写?
在 MyBatis 中,可以使用 LIKE 语句进行模糊查询。LIKE 语句用于在 SQL 查询中匹配指定模式的字符串。
在 MyBatis 中,可以通过在 SQL 语句中使用 %
和 _
通配符来实现模糊查询:
%
代表任意字符出现任意次数(包括零次)。_
代表任意单个字符。
以下是一个示例,演示如何在 MyBatis 中使用 LIKE 语句进行模糊查询:
在映射文件中定义模糊查询的 SQL 语句:
<!-- userMapper.xml -->
<select id="getUserByName" resultType="com.example.User">
SELECT * FROM user WHERE name LIKE #{name}
</select>
在接口中引用映射文件:
public interface UserMapper {
List<User> getUserByName(String name);
}
在 Java 代码中调用接口方法:
List<User> userList = userMapper.getUserByName("%John%");
在上述示例中, %John%
表示查询名字中包含 “John” 的用户, %
通配符表示可以匹配任意字符出现任意次数。
需要注意的是,在使用 LIKE 语句进行模糊查询时,要注意 SQL 注入的风险,应该避免直接拼接用户输入的字符串,而是使用参数绑定方式,如 #{name}
。
15、Mybatis 与 Spring 如何整合?
MyBatis 与 Spring 可以通过多种方式进行整合,以便更好地在 Spring 环境中使用 MyBatis。以下是一些常见的整合方式:
1. 使用 Spring 的 XML 配置文件进行整合
:
-
在 Spring 的 XML 配置文件中,配置数据源(DataSource)和事务管理器(TransactionManager)。
-
配置 MyBatis 的 SqlSessionFactoryBean,指定数据源和 MyBatis 的配置文件路径。
-
配置 MapperScannerConfigurer,用于自动扫描 Mapper 接口并进行注入。
-
配置事务管理器和事务注解,以支持事务管理。
-
示例代码如下:
<!-- Spring 配置文件 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!-- 数据源配置 -->
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis-config.xml" />
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper" />
</bean>
2. 使用 Java 配置类进行整合
:
-
创建一个配置类,使用
@Configuration
注解标识,并使用@MapperScan
注解指定 Mapper 接口的扫描路径。 -
在配置类中创建数据源(DataSource)和事务管理器(TransactionManager)的 Bean。
-
创建 MyBatis 的 SqlSessionFactoryBean,并注入数据源和 MyBatis 的配置文件路径。
-
示例代码如下:
@Configuration
@MapperScan("com.example.mapper")
public class MyBatisConfig {
@Bean
public DataSource dataSource() {
// 数据源配置
}
@Bean
public PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
@Bean
public SqlSessionFactoryBean sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
sessionFactory.setConfigLocation(new ClassPathResource("mybatis-config.xml"));
return sessionFactory;
}
}
这些是 MyBatis 与 Spring 整合的两种常见方式。根据个人和项目的需求,可以选择适合的方式进行整合。
16、resultType 和 resultMap 的区别?
resultType 和 resultMap 都是用于指定查询结果的映射方式,但它们有一些区别。
1. resultType
:
-
resultType 是指定查询结果的类型,可以是一个简单的数据类型(如 String、Integer 等)或一个自定义的 Java 对象类型。
-
当查询结果只有一个字段时,可以使用 resultType 来指定查询结果的类型。
-
MyBatis 会根据查询结果的列名和 resultType 的类型进行自动映射。
-
示例代码如下:
<select id="getUserName" resultType="java.lang.String">
SELECT name FROM user WHERE id = #{id}
</select>
2. resultMap
:
-
resultMap 是一种更灵活和复杂的结果映射方式,用于将查询结果映射到一个自定义的 Java 对象中。
-
resultMap 可以定义对象的属性与查询结果的列之间的映射关系,包括列名、属性名、类型转换等。
-
resultMap 可以处理查询结果中的复杂映射关系,如一对一、一对多关系的映射。
-
示例代码如下:
<resultMap id="userMap" type="User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
</resultMap>
<select id="getUserById" resultMap="userMap">
SELECT * FROM user WHERE id = #{id}
</select>
在上述示例中,resultType 用于指定查询结果的类型为 String,而 resultMap 用于定义 User 对象与查询结果的映射关系。
总结来说,resultType 适用于简单的查询结果映射,而 resultMap 适用于复杂的查询结果映射,可以更灵活地配置对象与查询结果的映射关系。
17、Mybatis 的一级缓存和二级缓存?
MyBatis 的缓存机制包括一级缓存(本地缓存)和二级缓存(全局缓存)。
1. 一级缓存(本地缓存)
:
-
一级缓存是 MyBatis 默认开启的缓存级别,它位于 SqlSession 的作用域内,即同一个 SqlSession 对象中的多次查询可以共享缓存。
-
当执行查询语句时,查询的结果会被缓存在一级缓存中,下次相同的查询语句会直接从缓存中获取结果,而不需要再次访问数据库。
-
一级缓存的生命周期与 SqlSession 的生命周期相同,当 SqlSession 关闭或进行更新操作(插入、更新、删除)时,一级缓存会被清空。
2. 二级缓存(全局缓存)
:
-
二级缓存是跨 SqlSession 的缓存,它可以被多个 SqlSession 共享。
-
二级缓存需要手动配置,可以配置在映射文件中或通过注解方式进行配置。
-
当执行查询语句时,查询的结果会被缓存在二级缓存中,下次相同的查询语句可以从二级缓存中获取结果,而不需要再次访问数据库。
-
二级缓存的生命周期与整个应用程序的生命周期相同,当应用程序关闭时,二级缓存会被销毁。
-
二级缓存默认使用的是 PerpetualCache,可以根据需求切换为其他的缓存实现,如 Ehcache、Redis 等。
需要注意的是,缓存是针对查询操作的,对于更新操作(插入、更新、删除),缓存会被清空,以保证数据的一致性。
在使用缓存时,需要根据具体的业务需求进行配置和使用,合理使用缓存可以有效地提高查询性能。但同时也需要注意缓存的有效性和数据一致性,避免出现脏数据或缓存过期的情况。
18、Mybatis 的映射文件,讲解一下?
MyBatis 的映射文件(Mapping File)是用来配置 SQL 语句和对象映射关系的 XML 文件。映射文件定义了数据库操作的 SQL 语句、参数映射、结果集映射等。
映射文件通常包含以下几个重要的部分:
-
<mapper>
标签:用于定义映射文件的根元素,包含了命名空间(namespace)属性,用于与对应的 Mapper 接口关联。 -
<select>
、<insert>
、<update>
、<delete>
等标签:用于配置具体的 SQL 语句和数据库操作。 -
<parameterMap>
或<parameterType>
标签:用于配置参数的映射关系,指定传入 SQL 语句的参数类型和名称。 -
<resultMap>
标签:用于配置结果集的映射关系,指定数据库字段与 Java 对象属性之间的映射关系。 -
<id>
、<result>
等标签:用于定义单个字段的映射关系,指定数据库字段与 Java 对象属性之间的映射关系。
以下是一个简单的示例,展示了一个映射文件的结构和配置:
<!-- userMapper.xml -->
<mapper namespace="com.example.UserMapper">
<select id="getUserById" resultType="com.example.User">
SELECT * FROM user WHERE id = #{id}
</select>
<insert id="insertUser" parameterType="com.example.User">
INSERT INTO user(name, age) VALUES(#{name}, #{age})
</insert>
<update id="updateUser" parameterType="com.example.User">
UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}
</update>
<delete id="deleteUser" parameterType="java.lang.Long">
DELETE FROM user WHERE id = #{id}
</delete>
<resultMap id="userMap" type="com.example.User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
</resultMap>
</mapper>
在上述示例中,映射文件中定义了查询、插入、更新、删除的 SQL 语句,以及一个结果集映射关系。这些配置可以与对应的 Mapper 接口关联,实现数据库操作的映射。
19、Mybatis 比 IBatis 比较大的几个改进是什么?
MyBatis 是从 iBATIS 演化而来的,相较于 iBATIS,MyBatis 在以下几个方面进行了较大的改进:
1. 注解支持
:MyBatis 引入了注解支持,可以使用注解来配置 SQL 语句和对象映射关系,简化了 XML 配置的过程,使代码更加简洁和易于维护。
2. 动态 SQL
:MyBatis 提供了强大的动态 SQL 功能,可以根据不同的条件动态生成 SQL 语句,避免了手动拼接 SQL 字符串的繁琐和安全隐患。
3. 缓存机制改进
:MyBatis 对缓存机制进行了优化和改进,引入了二级缓存和本地缓存,提高了数据库访问的性能。
4. 参数映射改进
:MyBatis 对参数映射进行了改进,支持参数的命名和位置两种方式,提高了参数的灵活性和易用性。
5. 插件机制
:MyBatis 引入了插件机制,可以通过插件扩展和定制 MyBatis 的核心功能,如拦截 SQL 语句、增加自定义逻辑等。
6. Spring 整合更加方便
:MyBatis 对与 Spring 的整合更加友好,提供了更多的整合方式和配置选项,方便在 Spring 环境中使用。
总的来说,MyBatis 在语法简洁性、动态 SQL、缓存机制、参数映射和插件机制等方面进行了较大的改进,使得使用更加方便和灵活。
20、什么是 DBMS?
DBMS(数据库管理系统)是指一种用于管理和组织数据库的软件系统。它提供了对数据库进行创建、查询、更新和删除等操作的功能,同时还负责数据的安全性、完整性和一致性的维护。
举例来说,以下是一些常见的 DBMS:
1. MySQL
:MySQL 是一种开源的关系型数据库管理系统,具有高性能、易用性和可靠性,被广泛用于各种规模的应用程序。
2. Oracle Database
:Oracle Database 是由 Oracle 公司开发的一种关系型数据库管理系统,具有强大的功能和可扩展性,广泛用于企业级应用。
3. SQL Server
:SQL Server 是由 Microsoft 公司开发的一种关系型数据库管理系统,提供了丰富的功能和集成的开发工具,广泛用于 Windows 环境中的应用程序。
4. PostgreSQL
:PostgreSQL 是一种开源的关系型数据库管理系统,具有高度的可扩展性和兼容性,被广泛用于大型企业和高负载的应用。
5. MongoDB
:MongoDB 是一种开源的文档型数据库管理系统,以其灵活的数据模型和高性能而闻名,适用于大数据和实时数据处理。
这些都是常见的 DBMS,每个 DBMS 都有其特定的特性和适用场景,可以根据项目需求和性能要求选择合适的 DBMS。
21、什么是 MyBatis 的接口绑定?有哪些实现方式?
MyBatis 的接口绑定是指将 Mapper 接口与对应的 SQL 语句进行绑定,使得在 Java 代码中可以通过接口方法来执行数据库操作。
MyBatis 提供了两种主要的接口绑定实现方式:
1. XML 配置方式
:
-
创建一个 Mapper 接口,定义数据库操作的方法。
-
在映射文件中,使用
<mapper>
标签指定命名空间,并使用<select>
、<insert>
、<update>
、<delete>
等标签来配置具体的 SQL 语句和映射关系。 -
在 MyBatis 配置文件中,通过
<mappers>
标签或<mapper>
标签的 resource 属性或 class 属性来引入映射文件。 -
在 Java 代码中,通过
SqlSession
的getMapper
方法获取接口的实现对象,从而调用接口中定义的数据库操作方法。
示例代码如下:
在映射文件中定义 SQL 语句和映射关系:
<!-- userMapper.xml -->
<mapper namespace="com.example.UserMapper">
<select id="getUserById" resultType="com.example.User">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
在接口中引用映射文件:
public interface UserMapper {
User getUserById(Long id);
}
在 Java 代码中调用接口方法:
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.getUserById(1L);
2. 注解方式
:
-
创建一个 Mapper 接口,使用
@Select
、@Insert
、@Update
、@Delete
等注解来配置具体的 SQL 语句。 -
在 MyBatis 配置文件中开启注解扫描或使用
<mapper>
标签的 class 属性来引入接口。 -
在 Java 代码中,通过
SqlSession
的getMapper
方法获取接口的实现对象,从而调用接口中定义的数据库操作方法。
示例代码如下:
在接口中使用注解配置 SQL 语句:
public interface UserMapper {
@Select("SELECT * FROM user WHERE id = #{id}")
User getUserById(Long id);
}
在 Java 代码中调用接口方法:
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.getUserById(1L);
以上是 MyBatis 的接口绑定的两种实现方式。根据个人和项目的需求,可以选择适合的方式来进行接口绑定。
22、Mybatis 的表关联的映射?
MyBatis 提供了多种方式来处理表关联的映射,包括一对一、一对多和多对多关联。下面是一些常见的表关联映射示例:
1. 一对一关联映射
:
假设有两个表:User 和 UserProfile,一个用户对应一个用户资料。
在 User 表中有一个外键 profile_id,指向 UserProfile 表的主键 id。
在映射文件中定义一对一关联映射:
<!-- userMapper.xml -->
<resultMap id="userMap" type="User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<!-- 其他字段映射 -->
<association property="profile" column="profile_id" javaType="UserProfile" select="getUserProfileById"/>
</resultMap>
<select id="getUserById" resultMap="userMap">
SELECT * FROM user WHERE id = #{id}
</select>
<select id="getUserProfileById" resultType="UserProfile">
SELECT * FROM user_profile WHERE id = #{profileId}
</select>
在 User 对象中定义 UserProfile 对象的属性:
public class User {
private Long id;
private String name;
private UserProfile profile;
// getters and setters
}
在 UserMapper 接口中定义查询方法:
public interface UserMapper {
User getUserById(Long id);
UserProfile getUserProfileById(Long profileId);
}
通过以上配置,MyBatis 将根据外键 profile_id 查询 UserProfile 表,并将查询结果映射到 User 对象的 profile 属性上,实现了一对一关联映射。
2. 一对多关联映射
:
假设有两个表:Post 和 Comment,一个帖子对应多个评论。
在 Comment 表中有一个外键 post_id,指向 Post 表的主键 id。
在映射文件中定义一对多关联映射:
<!-- postMapper.xml -->
<resultMap id="postMap" type="Post">
<id property="id" column="id"/>
<result property="title" column="title"/>
<!-- 其他字段映射 -->
<collection property="comments" ofType="Comment" column="id" select="getCommentsByPostId"/>
</resultMap>
<select id="getPostById" resultMap="postMap">
SELECT * FROM post WHERE id = #{id}
</select>
<select id="getCommentsByPostId" resultType="Comment">
SELECT * FROM comment WHERE post_id = #{postId}
</select>
在 Post 对象中定义 List<Comment> 类型的属性:
public class Post {
private Long id;
private String title;
private List<Comment> comments;
// getters and setters
}
在 PostMapper 接口中定义查询方法:
public interface PostMapper {
Post getPostById(Long id);
List<Comment> getCommentsByPostId(Long postId);
}
通过以上配置,MyBatis 将根据外键 post_id 查询 Comment 表,并将查询结果映射到 Post 对象的 comments 属性上,实现了一对多关联映射。
这些是 MyBatis 中处理表关联映射的示例。根据实际需求和数据库结构,可以选择适合的关联映射方式。
23、SQLMapConfig.xml 中配置有哪些内容?
在 MyBatis 中,SQLMapConfig.xml 是 MyBatis 的配置文件,用于配置 MyBatis 的全局设置和属性。以下是 SQLMapConfig.xml 中常见的配置内容:
1. 数据库连接配置
:
- 配置数据源(DataSource)的连接信息,包括数据库驱动、URL、用户名和密码等。
2. TypeAliases 配置
:
-
配置类型别名,用于简化映射文件中的类名引用。
-
可以使用
<typeAliases>
标签配置单个别名,或使用<package>
标签配置扫描的包路径。
3. Mappers 配置
:
-
配置映射器(Mapper)的引入方式,包括 XML 映射文件和注解方式。
-
可以使用
<mappers>
标签配置单个映射文件,或使用<package>
标签配置扫描的包路径。
4. 插件(Plugins)配置
:
-
配置插件的引入方式,用于扩展 MyBatis 的功能。
-
可以使用
<plugins>
标签配置单个插件,或使用<package>
标签配置扫描的包路径。
5. 其他全局设置
:
- 配置全局的参数、缓存、日志等设置。
示例代码如下:
<!-- SQLMapConfig.xml -->
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_db" />
<property name="username" value="root" />
<property name="password" value="password" />
</dataSource>
</environment>
</environments>
<typeAliases>
<package name="com.example.model" />
</typeAliases>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml" />
<package name="com.example.mapper" />
</mappers>
<plugins>
<plugin interceptor="com.example.MyPlugin" />
<package name="com.example.plugins" />
</plugins>
</configuration>
以上是 SQLMapConfig.xml 中的常见配置内容。根据具体项目需求,可以进行相应的配置。
24、简述 Mybatis 的 Xml 映射文件和 Mybatis 内部数据结构之间的映射关系?
MyBatis 的 XML 映射文件(Mapper XML)是用于配置 SQL 语句和对象映射关系的文件,它与 MyBatis 内部的数据结构之间存在一种映射关系。
MyBatis 内部的数据结构主要包括 MappedStatement、ResultMap、ParameterMap 等,它们与 XML 映射文件中的 <select>
、 <insert>
、 <update>
、 <delete>
等标签以及 <resultMap>
、 <parameterMap>
等标签相对应。
以下是 XML 映射文件和 MyBatis 内部数据结构之间的映射关系的示例说明:
在 XML 映射文件中定义查询语句和结果映射:
<!-- userMapper.xml -->
<select id="getUserById" resultMap="userMap">
SELECT * FROM user WHERE id = #{id}
</select>
<resultMap id="userMap" type="User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
</resultMap>
在 MyBatis 内部的数据结构中对应的定义如下:
1. MappedStatement 对应 <select> 标签
:
- MappedStatement 包含了 SQL 语句的相关信息,如语句的 ID、类型(SELECT、INSERT、UPDATE、DELETE)等。
2. ResultMap 对应 <resultMap> 标签
:
- ResultMap 定义了查询结果与 Java 对象的映射关系,包括属性名、列名、类型转换等。
3. ParameterMap 对应 <parameterMap> 标签(已废弃,推荐使用注解方式)
:
- ParameterMap 定义了 SQL 语句中的参数与 Java 对象的映射关系。
在 Java 代码中使用的对应关系如下:
1. MappedStatement 对应 Mapper 接口中的方法
:
- Mapper 接口中的方法对应了 XML 映射文件中的 SQL 语句,通过 MappedStatement 来执行 SQL 语句。
2. ResultMap 对应 Java 对象
:
- ResultMap 中的映射关系定义了查询结果与 Java 对象的属性之间的映射关系,通过 ResultMap 将查询结果映射到 Java 对象。
通过以上对应关系,MyBatis 可以根据 XML 映射文件中的配置,将 SQL 语句和对象映射关系转化为内部的数据结构,从而实现数据库操作的映射和执行。
25、如何获取生成的主键?
在 MyBatis 中,获取生成的主键可以通过以下方式:
1. 在插入语句中使用 useGeneratedKeys 和 keyProperty 属性
:
a. 首先,在插入语句中添加 useGeneratedKeys="true"
属性,表示使用数据库自动生成的主键。
b. 然后,在插入语句中添加 keyProperty
属性,指定一个 Java 对象的属性来接收生成的主键值。
举例来说,假设有一个 User 表,其中 id 字段是自动生成的主键:
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user(name, age) VALUES(#{name}, #{age})
</insert>
在执行插入操作后,MyBatis 会将生成的主键值自动设置到指定的 keyProperty
属性中。
2. 使用 <selectKey> 元素
:
a. 在插入语句之前,使用 <selectKey>
元素来查询生成的主键值。
b. 在 <selectKey>
元素中,指定查询生成主键的 SQL 语句,并使用 resultType
属性指定主键值的类型。
c. 在插入语句中,使用 ${}
语法引用 <selectKey>
元素中查询到的主键值。
举例来说,假设有一个 User 表,其中 id 字段是自动生成的主键:
<insert id="insertUser">
<selectKey keyProperty="id" resultType="java.lang.Long" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO user(name, age) VALUES(#{name}, #{age})
</insert>
在执行插入操作后, #{id}
会被替换为生成的主键值。
这些是获取生成的主键值的两种常见方式。具体的实现方式取决于你的数据库和项目需求。
26、Mybatis 执行批量插入,能返回数据库主键列表吗?
在 MyBatis 中执行批量插入时,默认情况下无法直接返回数据库主键列表。因为批量插入操作是将多条记录一次性插入到数据库中,数据库只会返回一个整体的执行结果,而不会返回每条记录的主键。
如果需要获取每条记录的主键列表,可以通过以下方式之一来实现:
1. 使用数据库的自增主键机制
:如果数据库表的主键是通过自增机制生成的,可以在插入操作后,通过查询最新插入的记录的方式来获取主键列表。
举例来说,假设有一个 User 表,其中 id 字段是通过自增机制生成的主键:
public interface UserMapper {
void batchInsertUser(List<User> userList);
List<Long> getGeneratedKeys();
}
在插入操作后,调用 getGeneratedKeys
方法来获取主键列表:
userMapper.batchInsertUser(userList);
List<Long> generatedKeys = userMapper.getGeneratedKeys();
2. 使用 SELECT LAST_INSERT_ID() 函数
:如果数据库支持 SELECT LAST_INSERT_ID() 函数,可以在插入操作后,通过查询该函数的方式来获取最新插入的主键列表。
举例来说,假设有一个 User 表,其中 id 字段是通过 SELECT LAST_INSERT_ID() 函数生成的主键:
<insert id="batchInsertUser">
<!-- 插入操作 -->
</insert>
<select id="getGeneratedKeys" resultType="java.lang.Long">
SELECT LAST_INSERT_ID()
</select>
在插入操作后,调用 getGeneratedKeys
方法来获取主键列表:
userMapper.batchInsertUser(userList);
List<Long> generatedKeys = userMapper.getGeneratedKeys();
需要注意的是,使用 SELECT LAST_INSERT_ID() 函数获取主键列表时,要确保数据库连接是在同一个事务中执行的,以确保能够正确获取到最新插入的主键。
27、简述 Mybatis 的 Xml 映射文件和 Mybatis 内部数据结构之间的映射关系?
MyBatis 的 XML 映射文件和 MyBatis 内部数据结构之间存在一种映射关系,这种关系通过 MyBatis 的解析过程来实现。
在 MyBatis 中,XML 映射文件负责定义 SQL 语句和对象映射的关系,它包含了数据库操作的 SQL 语句、参数映射、结果集映射等。而 MyBatis 内部数据结构则是 MyBatis 在运行时使用的对象,用于表示和处理 SQL 语句、参数和结果集等。
XML 映射文件和 MyBatis 内部数据结构之间的映射关系主要通过以下过程实现:
1. 解析 XML 映射文件
:MyBatis 在启动时会读取 XML 映射文件,并通过解析器将其解析为内部的数据结构。
2. 创建 Configuration 对象
:解析过程会生成一个 Configuration 对象,它是 MyBatis 的核心配置对象,用于存储和管理 MyBatis 的配置信息。
3. 创建 MappedStatement 对象
:解析过程会根据 XML 映射文件中的配置信息,创建对应的 MappedStatement 对象。MappedStatement 对象包含了 SQL 语句、参数映射、结果集映射等信息。
4. 创建 ParameterMapping 对象
:解析过程会根据 XML 映射文件中的配置信息,创建对应的 ParameterMapping 对象。ParameterMapping 对象用于存储参数映射的相关信息。
5. 创建 ResultMapping 对象
:解析过程会根据 XML 映射文件中的配置信息,创建对应的 ResultMapping 对象。ResultMapping 对象用于存储结果集映射的相关信息。
通过以上过程,MyBatis 将 XML 映射文件中的配置信息解析为内部的数据结构,以便在运行时进行 SQL 执行和结果集映射等操作。
需要注意的是,XML 映射文件和 MyBatis 内部数据结构之间的映射关系是一对多的关系,一个 XML 映射文件中可以包含多个 SQL 语句和映射关系的配置。
28、MyBatis 框架的优缺点各是什么?
MyBatis 框架有以下几个优点和缺点:
优点:
-
灵活性:MyBatis 提供了灵活的 SQL 控制,开发人员可以直接编写和优化 SQL 语句,更好地控制数据库操作。
-
性能优化:由于可以手动优化 SQL 语句,MyBatis 在性能方面具有优势,可以针对具体的场景进行性能调优。
-
易于学习和使用:相对于其他 ORM 框架,MyBatis 的学习曲线较低,上手相对容易。
-
易于集成:MyBatis 可以与各种数据源和第三方框架集成,如 Spring、Spring Boot 等。
缺点:
-
配置复杂:相对于全自动的 ORM 框架,MyBatis 的配置相对复杂,需要手动编写 SQL 语句和配置对象映射关系。
-
缺乏自动化:相对于全自动的 ORM 框架,MyBatis 需要开发人员手动编写和维护 SQL 语句和对象映射关系,增加了开发的工作量。
-
对象关系映射相对简单:相对于全自动的 ORM 框架,MyBatis 的对象关系映射相对简单,不支持复杂的继承关系、关联关系等。
需要注意的是,优点和缺点是相对的,取决于具体的需求和项目情况。对于需要更大灵活性和性能优化的项目,MyBatis 可能是一个更好的选择。而对于简单的 CRUD 操作和快速开发,全自动的 ORM 框架可能更适合。