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 注解的限制,不允许循环引用 | <