核心内容摘要
苹果斥资20亿美元收购AI初创公司:准备把“耳语”变成换机杀手锏?
HoRain 云小助手个人主页⛺️生活的理想就是为了理想的生活!⛳️ 推荐前些天发现了一个超棒的服务器购买网站性价比超高大内存超划算忍不住分享一下给大家。
点击跳转到网站。
目录⛳️ 推荐MyBatis关联关系映射详解
关联映射概述
一对一1:1映射场景示例实现方式一嵌套结果映射多表连接实现方式二嵌套查询子查询Java实体类示例
一对多1:N映射场景示例实现方式Java实体类示例
多对一N:1映射场景示例实现方式Java实体类示例
多对多N:N映射场景示例实现方式Java实体类示例
最佳实践和
注意事项
避免N1查询问题
合理选择映射方式
使用驼峰命名转换
复杂查询的优化
七、
总结MyBatis关联关系映射详解在实际开发中数据库表之间通常存在复杂的关联关系。
MyBatis通过resultMap提供了强大的对象关系映射能力支持一对一1:
一对多1:N、多对一N:1和多对多N:N四种经典关系的映射。
本文将结合代码示例系统讲解各种关联关系的实现方式。
关联映射概述在关系型数据库中表与表之间存在三种基本关联关系一对一One-to-One一个表中的每个记录与另一个表中的一个记录相关联一对多/多对一One-to-Many/Many-to-One一个表中的一个记录可以与另一个表中的多个记录相关联多对多Many-to-Many一个表中的多个记录可以与另一个表中的多个记录相关联MyBatis实现关联关系映射主要有两种方式多表连接和子查询。
一对一1:1映射场景示例用户和身份证信息班级和班主任用户和用户详情实现方式一嵌套结果映射多表连接!-- UserMapper.xml -- resultMap iduserWithIdCard typeUser id propertyid columnuser_id/ result propertyusername columnusername/ !-- 一对一关联 -- association propertyidCard javaTypeIdCard id propertyid columncard_id/ result propertynumber columncard_number/ /association /resultMap select idselectUserWithIdCard resultMapuserWithIdCard SELECT u.user_id, u.username, c.card_id, c.card_number FROM user u LEFT JOIN id_card c ON u.user_id c.user_id WHERE u.user_id #{id} /select实现方式二嵌套查询子查询resultMap iduserWithIdCard2 typeUser id propertyid columnuser_id/ result propertyusername columnusername/ !-- 通过执行另一个SQL映射语句来返回预期的复杂类型 -- association propertyidCard columncard_id selectcom.example.mapper.IdCardMapper.selectById/ /resultMap select idselectUserWithIdCard2 resultMapuserWithIdCard2 SELECT * FROM user WHERE user_id #{id} /selectJava实体类示例// User.java public class User { private Integer id; private String username; private IdCard idCard; // 一对一关联属性 // getter和setter方法... } // IdCard.java public class IdCard { private Integer id; private String number; // getter和setter方法... }
一对多1:N映射场景示例一个班级有多个学生一个用户拥有多个角色一个部门有多个员工实现方式!-- UserMapper.xml -- resultMap iduserWithRoles typeUser id propertyid columnuser_id/ result propertyusername columnusername/ !-- 一对多关联使用collection标签 -- collection propertyroles ofTypeRole id propertyid columnrole_id/ result propertyname columnrole_name/ /collection /resultMap select idselectUserWithRoles resultMapuserWithRoles SELECT u.user_id, u.username, r.role_id, r.role_name FROM user u LEFT JOIN user_role ur ON u.user_id ur.user_id LEFT JOIN role r ON ur.role_id r.role_id WHERE u.user_id #{id} /selectJava实体类示例// User.java public class User { private String id; private String username; private ListRole roles; // 一对多关联属性 // getter和setter方法... } // Role.java public class Role { private String id; private String name; // getter和setter方法... }
多对一N:1映射场景示例多个学生属于一个班级多个订单属于一个用户多个项目属于一个公司实现方式!-- StudentMapper.xml -- resultMap idstudentWithClass typeStudent id propertyid columnstudent_id/ result propertyname columnstudent_name/ !-- 多对一关联使用association标签 -- association propertyclazz javaTypeClass id propertyid columnclass_id/ result propertyname columnclass_name/ /association /resultMap select idselectStudentWithClass resultMapstudentWithClass SELECT s.student_id, s.student_name, c.class_id, c.class_name FROM student s LEFT JOIN class c ON s.class_id c.class_id WHERE s.student_id #{id} /selectJava实体类示例// Student.java public class Student { private Integer id; private String name; private Class clazz; // 多对一关联属性 // getter和setter方法... } // Class.java public class Class { private Integer id; private String name; // getter和setter方法... }
多对多N:N映射场景示例学生和课程一个学生可以选修多门课程一门课程可以被多个学生选修用户和角色一个用户可以有多个角色一个角色可以被多个用户拥有实现方式多对多关系通常通过一个**关联表中间表**来实现。
!-- StudentMapper.xml -- resultMap idstudentWithCourses typeStudent id propertyid columnstudent_id/ result propertyname columnstudent_name/ !-- 多对多关联使用collection标签 -- collection propertycourses ofTypeCourse id propertyid columncourse_id/ result propertyname columncourse_name/ /collection /resultMap select idselectStudentWithCourses resultMapstudentWithCourses SELECT s.student_id, s.student_name, c.course_id, c.course_name FROM student s LEFT JOIN student_course sc ON s.student_id sc.student_id LEFT JOIN course c ON sc.course_id c.course_id WHERE s.student_id #{id} /selectJava实体类示例// Student.java public class Student { private Integer id; private String name; private ListCourse courses; // 多对多关联属性 // getter和setter方法... } // Course.java public class Course { private Integer id; private String name; // getter和setter方法... }
最佳实践和
注意事项
避免N1查询问题在使用嵌套查询子查询方式时容易产生N1查询问题。
例如查询10个用户及其角色会先执行1次查询用户然后对每个用户再执行1次查询角色的SQL总共11次查询。
解决方案优先使用嵌套结果映射多表连接方式使用MyBatis的延迟加载功能合理使用缓存
合理选择映射方式嵌套结果映射多表连接适合数据量不大、关联表不多的场景只需一次SQL查询嵌套查询子查询适合数据量大、需要延迟加载的场景但要注意N1问题
使用驼峰命名转换在MyBatis配置文件中开启驼峰命名转换可以简化映射配置settings setting namemapUnderscoreToCamelCase valuetrue/ /settings
复杂查询的优化对于复杂的关联查询可以考虑使用数据库视图简化查询使用MyBatis的动态SQL功能合理设计数据库索引使用分页查询减少数据传输量
七、
总结MyBatis的关联映射功能为开发者提供了强大的数据访问层支持。
通过resultMap、association和collection标签可以灵活地处理各种复杂的对象关系映射。
在实际开发中应根据具体业务场景选择合适的映射方式并注意性能优化以构建高效、稳定的数据访问层。
❤️❤️❤️本人水平有限如有纰漏欢迎各位大佬评论批评指正如果觉得这篇文对你有帮助的话也请给个点赞、收藏下吧非常感谢! Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧