要全面掌握 MyBatis 和 MyBatis-Plus 的使用方法,确实需要一个系统的学习过程,包含它们的基本用法、高级用法、各种配置及优化方式。我将为你提供详细的介绍,分成两个部分:
- MyBatis 的详细使用
- MyBatis-Plus 的详细使用
一、MyBatis 的详细用法
1.1 MyBatis 配置文件
MyBatis 的配置文件通常是 mybatis-config.xml,用于全局配置 MyBatis 的行为。
<configuration>
<!-- 全局配置 -->
<settings>
<!-- 配置缓存 -->
<setting name="cacheEnabled" value="true"/>
<!-- 配置延迟加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 配置映射器的自动查找 -->
<setting name="autoMappingBehavior" value="PARTIAL"/>
</settings>
<!-- 数据源配置 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<!-- 映射器配置 -->
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</configuration>
settings:全局配置,例如缓存、懒加载等。environments:配置数据源及事务管理方式。mappers:配置 SQL 映射文件。
1.2 MyBatis 映射文件(Mapper XML)
MyBatis 使用 XML 文件来写 SQL,并将查询结果映射到 Java 对象。
<mapper namespace="com.example.mapper.UserMapper">
<!-- 查询用户 -->
<select id="findById" resultType="com.example.model.User">
SELECT * FROM user WHERE id = #{id}
</select>
<!-- 插入用户 -->
<insert id="insertUser">
INSERT INTO user(name, age)
VALUES(#{name}, #{age})
</insert>
<!-- 更新用户 -->
<update id="updateUser">
UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}
</update>
<!-- 删除用户 -->
<delete id="deleteUser">
DELETE FROM user WHERE id = #{id}
</delete>
</mapper>
常用的标签:
<select>:查询语句,支持id,resultType(返回类型),resultMap(返回映射)等。<insert>:插入语句。<update>:更新语句。<delete>:删除语句。<if>:条件判断,常用于动态 SQL。<choose>:类似if-else的判断语句。
1.3 动态 SQL(<if>、<choose>、<foreach> 等)
<select id="findUsers" resultType="User">
SELECT * FROM user
<where>
<if test="name != null">AND name = #{name}</if>
<if test="age != null">AND age = #{age}</if>
</where>
</select>
<select id="findUsersByIds" resultType="User">
SELECT * FROM user WHERE id IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
1.4 Mapper 接口
public interface UserMapper {
// 使用 @Select 注解(如果不使用 XML 配置)
@Select("SELECT * FROM user WHERE id = #{id}")
User findById(Long id);
int insertUser(User user);
int updateUser(User user);
int deleteUser(Long id);
}
1.5 MyBatis 分页插件
MyBatis 本身并没有内置分页功能,但你可以使用第三方分页插件(例如 PageHelper)来实现分页功能。
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="dialect" value="mysql"/>
</plugin>
</plugins>
1.6 MyBatis 配置缓存(Cache)
MyBatis 支持二级缓存,允许跨 Session 共享缓存。
<cache/>
<cache>:启用 MyBatis 的二级缓存。- 可以在
<mapper>文件中进行自定义缓存配置。
二、MyBatis-Plus 的详细用法
2.1 MyBatis-Plus 配置
MyBatis-Plus 是 MyBatis 的增强工具,提供了更多的自动化操作功能,如 CRUD 操作、分页、Wrapper 等。
2.1.1 添加依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
2.1.2 配置 application.properties
mybatis-plus.mapper-locations=classpath:/mappers/*.xml
mybatis-plus.global-config.db-config.id-type=auto
2.2 MyBatis-Plus 核心功能
2.2.1 自动生成 CRUD 方法
只要继承 BaseMapper,MyBatis-Plus 就会为你自动生成常见的 CRUD 方法。
public interface UserMapper extends BaseMapper<User> {
// 你可以自定义额外的查询方法
}
常用方法:
selectById():查询单条记录。insert():插入数据。updateById():根据 ID 更新数据。deleteById():根据 ID 删除数据。selectList():查询多条记录。
2.2.2 分页查询
MyBatis-Plus 提供了简单的分页查询功能,使用 Page 对象来进行分页。
Page<User> page = new Page<>(1, 10); // 页码1,每页10条记录
Page<User> userPage = userMapper.selectPage(page, null);
你也可以通过 QueryWrapper 自定义条件:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("age", 25);
Page<User> userPage = userMapper.selectPage(page, queryWrapper);
2.2.3 条件构造器(QueryWrapper)
QueryWrapper 用于构建 SQL 条件,可以方便地进行动态查询。
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "John").gt("age", 18);
List<User> users = userMapper.selectList(queryWrapper);
2.2.4 Lambda 表达式查询
LambdaQueryWrapper 通过 Lambda 表达式来构建查询条件,避免了硬编码字段名。
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(User::getName, "John").gt(User::getAge, 18);
List<User> users = userMapper.selectList(queryWrapper);
2.2.5 批量操作
MyBatis-Plus 支持批量插入、批量更新等操作。
// 批量插入
List<User> users = Arrays.asList(new User("Tom", 20), new User("Jerry", 22));
userMapper.insertBatchSomeColumn(users);
2.2.6 自动填充字段(AutoFill)
MyBatis-Plus 提供了自动填充字段的功能,如自动填充创建时间和更新时间等。
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
2.2.7 逻辑删除
MyBatis-Plus 提供了逻辑删除的功能,只需要在实体类上标注 @TableLogic 注解。
@TableLogic
private Integer deleted; // 1 表示删除,0 表示存在
使用时:
userMapper.deleteById(1L); // 这会将 deleted 字段设置为 1,而不是物理删除
2.2.8 自定义 SQL
你可以在 Mapper 中自定义 SQL 查询,MyBatis-Plus 支持与 MyBatis XML 配合使用。
@Select("SELECT * FROM user WHERE age = #{age}")
List<User> findUsersByAge(@Param("age") Integer age);
2.3 其他功能
- 全局配置:MyBatis-Plus 提供了全局配置
,用于配置全局行为,如 ID 策略、逻辑删除字段等。
- Wrapper 构造器:
QueryWrapper、UpdateWrapper等支持链式操作,简化代码。
2.4 高级用法
- 乐观锁:MyBatis-Plus 提供了对乐观锁的支持,可以自动处理并发更新。
- 性能分析插件:MyBatis-Plus 提供了性能分析插件,可以帮助你查看 SQL 执行性能。
@Bean
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor interceptor = new PerformanceInterceptor();
interceptor.setMaxTime(1000); // 设置 SQL 最大执行时间
interceptor.setFormat(true); // 格式化 SQL
return interceptor;
}
结语
通过学习 MyBatis 和 MyBatis-Plus,你将能够高效地进行数据库操作,并且能根据需求选择使用 MyBatis 或 MyBatis-Plus。
- MyBatis:更适合于复杂的 SQL 查询和对 SQL 的完全控制,适合需要高度定制化的场景。
- MyBatis-Plus:提供了大量自动化的功能,可以快速开发,减少样板代码,适合常见的 CRUD 操作。


949

被折叠的 条评论
为什么被折叠?



