Mybatis-plus预加载

文章展示了在SpringBoot应用中如何使用MyBatis进行多表关联的预加载。通过TestUser、TestOrder和TestItem三个实体类,以及对应的Mapper接口和方法,实现了用户与其订单及订单中的商品信息的联合查询,减少多次数据库访问,提高性能。
摘要由CSDN通过智能技术生成

1、两表关联预加载

 

 

实体类:

TestUser:

@Data
@TableName("test_user")
@NoArgsConstructor
public class TestUser {
    private Long id;
    private String name;
    private List<TestOrder> orders;
}

TestOrder:

@TableName("test_order")
@NoArgsConstructor
public class TestOrder {
    private Long id;
    private String orderNo;
    private Long userId;
}

controller层

@RestController
@RequestMapping("/test")
public class UserController {
    @Resource
    private UserService userService;
    @GetMapping("/preloadList")
    public List<TestUser> list() {
        return userService.findAll();
    }
}

plm-module
/
src/main/java/com/plm/module/demo/preload/domain
/

service层


public interface UserService {
    List<TestUser> findAll();
}


@Service
public class UserServiceImpl implements UserService {
    @Resource
    private UserMapper userMapper;
    @Override
    public List<TestUser> findAll() {
        return userMapper.findAll();
    }
}


mapper层

@Mapper
public interface UserMapper extends BaseMapper<TestUser> {
    @Select("select * from test_user")
    @Results(id = "userResultMap", value = {
            @Result(property = "id", column = "id"),
            @Result(property = "name", column = "name"),
            @Result(property = "orders", column = "id", many = @Many(select = "com.plm.module.demo.preload.mapper.OrderMapper.findByUserId"))
    })
    List<TestUser> findAll();
}


@Mapper
public interface OrderMapper {
    @Select("select * from test_order where user_id=#{id}")
    List<TestOrder> findByUserId(@Param("id") Long id);
}

运行结果:

[
    {
        "id": 1,
        "name": "张三",
        "orders": [
            {
                "id": 1,
                "orderNo": "asd",
                "userId": 1
            },
            {
                "id": 2,
                "orderNo": "q w we",
                "userId": 1
            }
        ]
    },
    {
        "id": 2,
        "name": "李四",
        "orders": [
            {
                "id": 3,
                "orderNo": "as",
                "userId": 2
            }
        ]
    },
    {
        "id": 3,
        "name": "王五",
        "orders": [
            {
                "id": 4,
                "orderNo": "adc",
                "userId": 3
            },
            {
                "id": 5,
                "orderNo": "fff",
                "userId": 3
            }
        ]
    },
    {
        "id": 4,
        "name": "赵六",
        "orders": []
    }
]

2、多表关联预加载

 

 

实体类

TestUser:

@Data
@TableName("test_user")
@NoArgsConstructor
public class TestUser {

    private Long id;

    private String name;

    private List<TestOrder> orders;
}

TestOrder:

@Data
@TableName("test_order")
@NoArgsConstructor
public class TestOrder {

    private Long id;

    private String orderNo;

    private Long userId;

    private List<TestItem> items;
}

TestItem:

@Data
@TableName("test_item")
@NoArgsConstructor
public class TestItem {

    private Long id;

    private String name;

    private Long orderId;
}

controller层

@RestController
@RequestMapping("/test")
public class UserController {
    @Resource
    private UserService userService;

    @GetMapping("/preloadList")
    public List<TestUser> list() {
        return userService.findAll();
    }
}

service层

public interface UserService {
    List<TestUser> findAll();
}

@Service
public class UserServiceImpl implements UserService {

    @Resource
    private UserMapper userMapper;

    @Override
    public List<TestUser> findAll() {
        return userMapper.findAll();
    }
}

mapper层

@Mapper
public interface UserMapper extends BaseMapper<TestUser> {
    @Select("select * from test_user")
    @Results(id = "userResultMap", value = {
            @Result(property = "id", column = "id"),
            @Result(property = "name", column = "name"),
            @Result(property = "orders", column = "id", many = @Many(select = "com.plm.module.demo.preload.mapper.OrderMapper.findByUserId"))
    })
    List<TestUser> findAll();
}


@Mapper
public interface OrderMapper extends BaseMapper<TestOrder> {
    @Select("select * from test_order where user_id=#{id}")
    @Results(id = "orderResultMap", value = {
            @Result(column = "id", property = "id"),
            @Result(column = "order_no", property = "orderNo"),
            @Result(column = "user_id", property = "userId"),
            @Result(column = "id", property = "items", many = @Many(select = "com.plm.module.demo.preload.mapper.ItemMapper.selectItemsByOrderId")),
    })
    List<TestOrder> findByUserId(@Param("id") Long id);
}


@Mapper
public interface ItemMapper extends BaseMapper<TestItem> {
    @Select("select * from test_item where order_id=#{id}")
    List<TestItem> selectItemsByOrderId(@Param("id") Long id);
}

运行结果:

[
	{
		"id": 1,
		"name": "张三",
		"orders": [
			{
				"id": 1,
				"orderNo": "asd",
				"userId": 1,
				"items": [
					{
						"id": 1,
						"name": "ss",
						"orderId": 1
					},
					{
						"id": 2,
						"name": "dd",
						"orderId": 1
					}
				]
			},
			{
				"id": 2,
				"orderNo": "q w we",
				"userId": 1,
				"items": [
					{
						"id": 3,
						"name": "ff",
						"orderId": 2
					}
				]
			}
		]
	},
	{
		"id": 2,
		"name": "李四",
		"orders": [
			{
				"id": 3,
				"orderNo": "as",
				"userId": 2,
				"items": [
					{
						"id": 4,
						"name": "cc",
						"orderId": 3
					},
					{
						"id": 5,
						"name": "ww",
						"orderId": 3
					}
				]
			}
		]
	},
	{
		"id": 3,
		"name": "王五",
		"orders": [
			{
				"id": 4,
				"orderNo": "adc",
				"userId": 3,
				"items": []
			},
			{
				"id": 5,
				"orderNo": "fff",
				"userId": 3,
				"items": []
			}
		]
	},
	{
		"id": 4,
		"name": "赵六",
		"orders": []
	}
]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值