MyBatis一对一,一对多,多对多注解实现

MyBatis注解开发

常用注解:

@Insert:实现新增

@Update:实现更新

@Delete:实现删除

@Select:实现查询

@Result:实现结果集封装

@Results:可以与@Result一起使用,封装多个结果集

@One:实现一对一结果集封装

@Many:实现一对多结果集封装

实现复杂关系映射之前我们可以在映射文件中通过配置<resultMap>来实现,使用注解开发后,我们可以使用@Results注解,@Result注解,@One注解,@Many注解组合完成复杂关系的配置

 

注解 说明
@Results

代替的是标签<resultMap>,该注解中可以使用单个@Result注解,也可以使用@Result集合。

使用格式:@Results({@Result(),@Result()})或@Results(@Result())

@Result

代替了<id>标签和<result>标签

@Result中属性介绍:

column:数据库的列名

property:需要装配的属性名

one:需要使用的@One注解(@Result(one=@One)())

many:需要使用的@Many注解(@Result(many=@Many)())

@One

(一对一)

代替了<assocation>标签,是多表查询的关键,在注解中用来指定子查询返回单一对象

@One注解属性介绍:

select:指定用来多表查询的sqlmapper

使用格式:@Result(column=" ",property=" ",one=@One(select=" "))

@Many

(多对一)

代替了<collection>标签,是多表查询的关键,在注解中用来指定子查询返回对象集合

使用格式:@Result(property=" ",column=" ",many=@Many(select=" "))

 

1.一对一查询

1.1一对一查询的模型

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户
一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户

 1.2一对一查询的sql语句

sql语句:

select * from orders;
select * from user where id=查询出订单的uid;

 1.3创建User和Order实体

package cn.yyx.domain;

import lombok.Data;

import java.time.LocalDateTime;

/**
 * Created with IntelliJ IDEA.
 *
 * @version 1.0
 * @Author yyx
 * @DateTime 2021/7/19 21:32
 * @Description
 * @since 11
 */
@Data
public class User {
    private int id;
    private String username;
    private String password;
    private LocalDateTime birthday;
}
package cn.yyx.domain;

import lombok.Data;

import java.util.Date;

/**
 * Created with IntelliJ IDEA.
 *
 * @version 1.0
 * @Author yyx
 * @DateTime 2021/7/19 21:21
 * @Description
 * @since 11
 */
@Data
public class Order {
    private int id;
    private LocalDate ordertime;
    private double total;
    //表示当前订单属于哪一个用户
    private User user;
}

1.4创建配置Mapper接口

OrderMapper

package cn.yyx.mapper;

import cn.yyx.domain.Order;
import cn.yyx.domain.User;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * Created with IntelliJ IDEA.
 *
 * @version 1.0
 * @Author yyx
 * @DateTime 2021/7/19 21:40
 * @Description
 * @since 11
 */
public interface OrderMapper {
    @Select("select *,o.id oid from test.orders o,test.user u where o.uid=u.id")
    @Results({
            @Result(column = "oid",property = "id"),
            @Result(column = "ordertime",property = "ordertime"),
            @Result(column = "total",property = "total"),
            @Result(
                    property = "user", //要封装的属性名称
                    column = "uid",  //根据哪个字段来查user表的信息
                    javaType = User.class, //要封装的实体类型
                    one = @One(select = "cn.seim.mapper.UserMapper.findUserById")
            )
    })
    public List<Order> findOrderALl();
}

UserMapper

package cn.yyx.mapper;

import cn.yyx.domain.User;
import org.apache.ibatis.annotations.Select;

/**
 * Created with IntelliJ IDEA.
 *
 * @version 1.0
 * @Author yyx
 * @DateTime 2021/7/19 21:47
 * @Description
 * @since 11
 */
public interface UserMapper {
    @Select("select * from test.user where id=#{id}")
    public User findUserById(int id);
}

1.5测试

 @Test
    public void findOrderAll() {
        List<Order> orderALl = om.findOrderALl();
        for (Order order : orderALl) {
            log.debug(String.valueOf(order));
        }
    }

2.一对多查询

2.1一对多查询模型

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户
一对多查询的需求:查询一个用户,与此同时查询出该用户具有的订单

 2.2一对多查询的sql语句

sql语句:
select * from user;
select * from orders where uid=查询出用户的id;

 2.3User、Order实体

package cn.yyx.domain;

import lombok.Data;

import java.time.LocalDateTime;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 *
 * @version 1.0
 * @Author yyx
 * @DateTime 2021/7/19 21:32
 * @Description
 * @since 11
 */
@Data
public class User {
    private int id;
    private String username;
    private String password;
    private LocalDateTime birthday;
    //表示当前用户所拥有的订单数
    private List<Order> orderList;
}
package cn.yyx.domain;

import lombok.Data;

import java.time.LocalDate;
import java.util.Date;

/**
 * Created with IntelliJ IDEA.
 *
 * @version 1.0
 * @Author yyx
 * @DateTime 2021/7/19 21:21
 * @Description
 * @since 11
 */
@Data
public class Order {
    private int id;
    private LocalDate ordertime;
    private double total;
    //表示当前订单属于哪一个用户
    private User user;
}

2.4使用注解配置Mapper

UserMapper

@Select("select * from test.user")
@Results({
        @Result(id = true,column = "id",property = "id"),
        @Result(column = "username",property = "username"),
        @Result(column = "password",property = "password"),
        @Result(column = "birthday",property = "birthday"),
        @Result(
                property = "orderList",
                column = "id",
                javaType =List.class,
                many = @Many(select = "cn.seim.mapper.OrderMapper.findByUid")
        )
})
public List<User> findUserAndOrderAll();

OrderMapper

@Select("select * from orders where uid=#{uid}")
public List<Order> findByUid(int uid);

2.5测试

@Test
public void findUserAndOrderAll(){
    List<User> all = sm.findUserAndOrderAll();
    for (User user : all) {
        log.debug(String.valueOf(user));
    }
}

3.多对多查询

3.1多对多查询模型

用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用
多对多查询的需求:查询用户同时查询出该用户的所有角色

 3.2多对多查询语句

Sql语句:

select * from user;
select * from role r,user_role ur where r.id=ur.role_id and ur.user_id=用户的id

 3.3Role实体,User实体

package cn.yyx.domain;

import lombok.Data;

/**
 * Created with IntelliJ IDEA.
 *
 * @version 1.0
 * @Author yyx
 * @DateTime 2021/7/20 10:35
 * @Description
 * @since 11
 */
@Data
public class Role {
    private int id;
    private String roleName;
    private String roleDesc;
}
package cn.yyx.domain;

import lombok.Data;

import java.time.LocalDateTime;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 *
 * @version 1.0
 * @Author yyx
 * @DateTime 2021/7/19 21:32
 * @Description
 * @since 11
 */
@Data
public class User {
    private int id;
    private String username;
    private String password;
    private LocalDateTime birthday;
    //表示当前用户所拥有的订单数
    private List<Order> orderList;
    //表示用户所拥有的角色
    private List<Role> roleList;
}

3.4使用注解配置Mapper

UserMapper

@Select("select * from user")
@Results({
        @Result(id = true,column = "id",property = "id"),
        @Result(column = "username",property = "username"),
        @Result(column = "password",property = "password"),
        @Result(column = "birthday",property = "birthday"),
        @Result(
                property = "roleList",
                column = "id",
                javaType = List.class,
                many = @Many(select = "cn.seim.mapper.RoleMapper.findRoleByUid")
        )
})
public List<User> findUserAndRoleALl();

RoleMapper

@Select("select * from test.sys_user_role ur,test.sys_role r where ur.roleId=r.id and ur.userId=#{uid}")
public List<Role> findRoleByUid(int uid);

3.5测试

@Test
public void findUserAndRoleALl(){
    List<User> all = sm.findUserAndRoleALl();
    for (User user : all) {
        log.debug(String.valueOf(user));
    }
}

 

posted @ 2021-07-20 10:43  渣娃攻城狮  阅读(1862)  评论(0)    收藏  举报