MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
无论是使用注解还是 xml 映射文件配置方式,在使用之前有两步是必须的:
-
引入依赖
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> -
在启动类上加注解
@MapperScan指明 mapper 类的位置@MapperScan("com.solo.coderiver.project.mapper") public class ProjectApplication { public static void main(String[] args) { SpringApplication.run(ProjectApplication.class, args); } }
一、注解方式
相比于 xml 映射方式,注解方式明显更简洁,但没有 xml 方式灵活。目前大部分公司还是主要用 xml 方式。
package com.solo.coderiver.project.mapper;
import com.solo.coderiver.project.dataobject.ProjectInfo;
import org.apache.ibatis.annotations.*;
/**
* 注解方式使用 mybatis 增删改查
*/
@Mapper
public interface ProjectMapper {
@Select("SELECT * FROM project_info WHERE project_id = #{id}")
@Results({
@Result(property = "projectId", column = "project_id"),
@Result(property = "projectName", column = "project_name"),
@Result(property = "projectAvatar", column = "project_avatar"),
@Result(property = "projectDifficulty", column = "project_difficulty"),
@Result(property = "categoryType", column = "category_type"),
@Result(property = "categoryName", column = "category_name"),
@Result(property = "projectProgress", column = "project_progress"),
@Result(property = "projectStatus", column = "project_status"),
@Result(property = "projectIntroduce", column = "project_introduce"),
@Result(property = "projectCreatorId", column = "project_creator_id"),
@Result(property = "teamId", column = "team_id"),
})
ProjectInfo findProjectById(String id);
@Insert("INSERT INTO " +
"project_info(project_id, project_name, project_avatar, project_difficulty," +
" category_type, category_name, project_progress, project_status, " +
"project_introduce, project_creator_id, team_id) " +
"VALUES(#{projectId}, #{projectName}, #{projectAvatar}, #{projectDifficulty}," +
"#{categoryType}, #{categoryName}, #{projectProgress}, #{projectStatus}," +
"#{projectIntroduce}, #{projectCreatorId}, #{teamId})")
int insertProject(ProjectInfo info);
@Update("UPDATE project_info set project_name = #{name} where project_id = #{id}")
int updateProjectName(String id, String name);
@Delete("DELETE FROM project_info WHERE project_id = #{id}")
int deleteProject(String id);
}
直接将 sql 语句写在注解里,免去了配置 xml 文件。但有个显而易见的缺点是如果 sql 太长了,像字段多的 @Insert ,如果换行需要用 + 连接,不利于后期维护。
MyBatis 支持的注解属性表:
| 注解 | 使用对象 | 相对应的 XML | 描述 |
|---|---|---|---|
@CacheNamespace |
类 |
<cache> |
为给定的命名空间(比如类)配置缓存。属性有:implemetation, eviction, flushInterval, size, readWrite, blocking 和properties。 |
@Property |
N/A | <property> |
指定参数值或占位值(placeholder)(能被 mybatis-config.xml内的配置属性覆盖)。属性有:name, value。(仅在MyBatis 3.4.2以上版本生效) |
@CacheNamespaceRef |
类 |
<cacheRef> |
参照另外一个命名空间的缓存来使用。属性有:value, name。如果你使用了这个注解,你应设置 value 或者 name 属性的其中一个。value 属性用于指定 Java 类型而指定命名空间(命名空间名就是指定的 Java 类型的全限定名),name 属性(这个属性仅在MyBatis 3.4.2以上版本生效)直接指定了命名空间的名字。 |
@ConstructorArgs |
方法 |
<constructor> |
收集一组结果传递给一个结果对象的构造方法。属性有:value,它是形式参数数组。 |
@Arg |
N/A | <arg> <idArg> |
单参数构造方法,是 ConstructorArgs 集合的一部分。属性有:id, column, javaType, jdbcType, typeHandler, select 和 resultMap。id 属性是布尔值,来标识用于比较的属性,和<idArg> XML 元素相似。 |
@TypeDiscriminator |
方法 |
<discriminator> |
一组实例值被用来决定结果映射的表现。属性有:column, javaType, jdbcType, typeHandler 和 cases。cases 属性是实例数组。 |
@Case |
N/A | <case> |
单独实例的值和它对应的映射。属性有:value, type, results。results 属性是结果数组,因此这个注解和实际的 ResultMap 很相似,由下面的 Results 注解指定。 |
@Results |
方法 |
<resultMap> |
结果映射的列表,包含了一个特别结果列如何被映射到属性或字段的详情。属性有:value, id。value 属性是 Result 注解的数组。这个 id 的属性是结果映射的名称。 |
@Result |
N/A | <result> <id> |
在列和属性或字段之间的单独结果映射。属性有:id, column, javaType, jdbcType, typeHandler, one, many。id 属性是一个布尔值,来标识应该被用于比较(和在 XML 映射中的<id>相似)的属性。one 属性是单独的联系,和 <association> 相似,而 many 属性是对集合而言的,和<collection>相似。它们这样命名是为了避免名称冲突。 |
@One |
N/A | <association> |
复杂类型的单独属性值映射。属性有:select,已映射语句(也就是映射器方法)的全限定名,它可以加载合适类型的实例。fetchType会覆盖全局的配置参数 lazyLoadingEnabled。注意 联合映射在注解 API中是不支持的。这是因为 Java 注解的限制,不允许循环引用。 |
@Many |
N/A | <collection> |
映射到复杂类型的集合属性。属性有:select,已映射语句(也就是映射器方法)的全限定名,它可以加载合适类型的实例的集合,fetchType 会覆盖全局的配置参数 lazyLoadingEnabled。注意 联合映射在注解 API中是不支持的。这是因为 Java 注解的限制,不允许循环引用 |
@MapKe |

本文介绍了MyBatis与SpringBoot整合的两种方式:注解和XML。详细讲解了注解方式的简洁与限制,以及XML方式的配置步骤,包括配置、编写mapper XML映射文件和mapper接口。内容涵盖MyBatis的select、insert、update、delete、Result Maps等元素,解析了XML映射文件的关键属性和用法。
最低0.47元/天 解锁文章
2万+





