Mybatis注解@Results、@Result、@ResultMap

 

先来看一组代码:

@Results(id="groupWithUsers",
         value = { 
            @Result(property = "groupId", column = "group_id", id = true),
            @Result(property = "name", column = "name"), 
            @Result(property = "accountId", column = "account_id"),
            @Result(property = "deleteFlag", column = "delete_Flag"),
            @Result(property = "parentId", column = "parent_Id"), 
            @Result(property = "userList", javaType=List.class, many =@Many(select="selectUsersByGroupId"), column = "group_id")})
//查询
@Select({"select * from group where account_id=#{accountId} and delete_flag=0"})
List<Group> selectGroupWithUsers(@Param("accountId") String accountId);


@Select({"select u.* from user u",
		"inner join user_group ug on u.user_id = ug.user_id",
		"where ug.group_id=#{groupId} and u.delete_flag=0"
		})
List<User> selectUsersByGroupId(@Param("groupId") String groupId);

我们的接受的对象Group中的字段:(User类中的映射关系这里就不再赘述)

@Data
public class Group {

    private String groupId;

    private String name;

    private String accountId;

    private String parentId;

    private String type;

    private List<User> userList;

}

调用List<Group> selectGroupWithUsers(@Param("accountId") String accountId);查出的结果为:

从结果中可以看出,查询出的列和Group中属性信息的映射关系是在@Results中value属性的@Result注解进行配置的,这里与mybatis的xml配置文件开发基本相同。再看一下userList包含了user信息,也就是selectUsersByGroupId方法被调用,查询结果被封装在Group类中的userList字段中。而selectUsersByGroupId方法被调用的配置在@Many注解中。下面我们来卓层分析一下@Results注解及注解中的属性信息:

@Results注解:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Results {
    String id() default "";  //当前Results注解的唯一标识

    Result[] value() default {};  //value值为Result[]数组
}

@Results中只有两个属性,id和value,id作为当前@Results注解的唯一标识很好理解;value值为@Result数组,下面我们看一下@Result的信息:

@Result:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({})
public @interface Result {
    boolean id() default false;  //id唯一标识

    String column() default "";  //对应数据库中的列名

    String property() default ""; //对应类中的属性名

    Class<?> javaType() default void.class;  //数据类型

    JdbcType jdbcType() default JdbcType.UNDEFINED;  //jdbc类型

    Class<? extends TypeHandler> typeHandler() default UnknownTypeHandler.class;

    One one() default @One;  //一对一配置

    Many many() default @Many;  //一对多配置
}

@Result中常用的属性是column和property,用于配置数据库中的列名和类中的属性名之间的映射关系。另外one和many用于关联查询。比如上面列子中提到的Group类中包含属性List<User> userList,这时集合类型数据,与Group是一对多的关系,需要用many配置,如果Group中需要对象类型数据User user,那么就需要使用one进行配置。这里我们以many为例进行说明:

@Result中many的应用:

@Many:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({})
public @interface Many {
    String select() default "";  //选择要执行的方法

    FetchType fetchType() default FetchType.DEFAULT;  //枚举值,懒加载、及时加载、默认
}
 

@Many中常用的属性只有selet,用于指定关联查询的方法

但是存在many属性的@Result注解的使用就有些变化:如下面的这段代码中,column属性的值为"group_id",是group表中的列,也是作为参数传递到selectUsersByGroupId中进行查询的参数。

@Result(property = "userList", javaType=List.class, many =@Many(select="selectUsersByGroupId"), column = "group_id")})

如果select属性指定的方法需要的参数是一个对象,要如何传递参数?比如select属性绑定的是如下方法:

public List<User> selectUsers(Map<String,Object> map);

需要的参数是一个Map对象,这时column属性的值要设置为:

column = "{groupId=group_id, userName=user_name}"

这时,就相当于我们在map中传入了两个值map.put("groupId",value) ,map.put("userName",value),而column中,“groupId=group_id”,相当于将库中的列group_id映射到groupId中,user_name也一样。

至此,@Resuts和@Result的使用大致就这些,那么@ResultMap注解的使用,其实就是引用已定义好的@Results

@ResultMap:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface ResultMap {
    String[] value();
}

@ResultMap中只有一个属性value,用于指定要引用的@Results,value值为@Results的id值,如下所示:

@ResultMap("resultsId")
@Select("......")
List<Object> select();

 

Mybatis是一种基于 Java 的持久层框架,它提供了一种通过注解的方式来进行 SQL 映射的方式,称为 Mybatis 注解映射。使用注解映射可以使得代码更加简洁,也更加易于维护。 在 Mybatis 中,注解主要分为两类:一类是用于描述 SQL 语句的注解,如 @Select、@Insert、@Update、@Delete 等;另一类是用于描述实体类与数据库字段之间映射关系的注解,如 @Results、@Result、@Param 等。 下面是一个使用 Mybatis 注解映射进行 CRUD 操作的示例: 1. 实体类 ```java public class User { private int id; private String name; private int age; //省略getter和setter方法 } ``` 2. Mapper 接口 ```java public interface UserMapper { @Select("SELECT * FROM user WHERE id = #{id}") User getUserById(int id); @Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})") int addUser(User user); @Update("UPDATE user SET name=#{name}, age=#{age} WHERE id=#{id}") int updateUser(User user); @Delete("DELETE FROM user WHERE id=#{id}") int deleteUser(int id); } ``` 3. 配置文件 ```xml <!-- 配置 Mybatis --> <configuration> <!-- 配置 Mapper 接口扫描 --> <mappers> <mapper class="com.example.mapper.UserMapper"/> </mappers> </configuration> ``` 以上代码中,@Select、@Insert、@Update、@Delete 注解分别对应查询、插入、更新、删除操作,其中 #{} 表示占位符,用于接收参数。同时,Mapper 接口中的方法名需要与对应的 SQL 语句名称一致。 除了 SQL 语句的注解外,@Results、@Result、@Param 等注解也可以用于实体类与数据库字段之间的映射关系。例如: ```java @Results(id = "userMap", value = { @Result(property = "id", column = "id", id = true), @Result(property = "name", column = "name"), @Result(property = "age", column = "age") }) public interface UserMapper { @Select("SELECT * FROM user WHERE id = #{id}") @ResultMap("userMap") User getUserById(int id); //省略其他方法 } ``` 以上代码中,@Results 注解用于定义结果集映射规则,@Result 注解用于定义单个属性与字段之间的映射关系,@ResultMap 注解用于引用结果集映射规则。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值