mybatisplus 一对多配置
1:数据库表
-- ---------------------------- -- Table structure for t_user -- ---------------------------- DROP TABLE IF EXISTS `t_user`; CREATE TABLE `t_user` ( `t_user_id` bigint(255) NOT NULL AUTO_INCREMENT, `t_user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, `t_user_age` smallint(255) NULL DEFAULT NULL, PRIMARY KEY (`t_user_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for t_user_address -- ---------------------------- DROP TABLE IF EXISTS `t_user_address`; CREATE TABLE `t_user_address` ( `t_address_id` bigint(20) NOT NULL AUTO_INCREMENT, `t_user_id` bigint(255) NULL DEFAULT NULL, `t_address_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, PRIMARY KEY (`t_address_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;
2:实体类
(1)User
@Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("t_user") public class User implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "t_user_id", type = IdType.AUTO) private Long tUserId; private String tUserName; private Integer tUserAge; @TableField(exist = false)//表示该属性不为数据库表字段,但又是必须使用的 private List<Address> userAddressList; }
(2)Address
@Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("t_user_address") public class Address { private static final long serialVersionUID = 1L; @TableId(value = "t_address_id", type = IdType.AUTO) private Long tAddressId; private String tUserId; private String tAddressDesc; }
3:Mapper
(1)UserMapper
public interface UserMapper extends BaseMapper<User> { List<User> getUserList(Page<User> page); }
(2)UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.wzh.springbootmp.mapper.UserMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.wzh.springbootmp.entity.User"> <id column="t_user_id" property="tUserId" /> <result column="t_user_name" property="tUserName" /> <result column="t_user_age" property="tUserAge" /> <collection property="userAddressList" column="{t_user_id=t_user_id}" select="getUserAddressById"/> </resultMap> <!--根据userID查询地址信息--> <select id="getUserAddressById" resultType="com.wzh.springbootmp.entity.Address"> select t_user_id,t_address_id,t_address_desc from t_user_address where t_user_id=#{t_user_id} </select> <!--获取用户列表信息--> <select id="getUserList" resultMap="BaseResultMap"> select t_user_id,t_user_name,t_user_age from t_user </select> </mapper>
4:Service
(1)IUserService
public interface IUserService extends IService<User> { Page<User> getUserList(Page<User> page); }
(2)UserServiceImpl
@Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService { @Override public Page<User> getUserList(Page<User> page) { return page.setRecords(this.baseMapper.getUserList(page)); } }
5:UserController
@RestController @AllArgsConstructor public class UserController { private IUserService userService; @GetMapping("/users/{page}/{size}") public Map<String,Object> getUserList(@PathVariable Integer page, @PathVariable Integer size){ Map<String, Object> map = new HashMap<>(); Page<User> pageUser = new Page<>(page, size); QueryWrapper<User> queryWrapper = new QueryWrapper<>(); IPage<User> pages = userService.page(pageUser, queryWrapper); if (pages.getRecords().size() == 0) { map.put("code", -1); } else { map.put("code", 1); map.put("data", pages); } return map; } @GetMapping("/userAddressList/{page}/{size}") public Map<String, Object> getUserAddressList(@PathVariable Integer page, @PathVariable Integer size) { Map<String, Object> map = new HashMap<>(); Page<User> userAddressPage = userService.getUserList(new Page<>(page, size)); if (userAddressPage.getRecords().size() == 0) { map.put("code", 1); } else { map.put("code", 0); map.put("data", userAddressPage); } return map; } }
6:测试结果
{ "code": 0, "data": { "records": [ { "userAddressList": [ { "taddressDesc": "徐州路", "taddressId": 1, "tuserId": "1" }, { "taddressDesc": "东莞路", "taddressId": 2, "tuserId": "1" } ], "tuserAge": 20, "tuserId": 1, "tuserName": "张三" }, { "userAddressList": [ { "taddressDesc": "抚顺路", "taddressId": 3, "tuserId": "2" } ], "tuserAge": 30, "tuserId": 2, "tuserName": "李四" } ], "total": 2, "size": 10, "current": 1, "pages": 1 } }
分类:
spring-boot
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2019-04-16 CentOS7通过rsync+crontab实现两台服务器文件同步
2019-04-16 CentOS7配置MySQL5.7主备
2015-04-16 HttpClient3.1 警告: Cookie rejected:
2015-04-16 WebService实现文件上传下载
2015-04-16 使用dom4j生成xml字符串,以及解析xml字符串