Java-08 深入浅出 MyBatis - 多对多模型 SqlMapConfig 与 Mapper 详细讲解 ...

打印 上一主题 下一主题

主题 984|帖子 984|积分 2952

点一下关注吧!!!非常感谢!!持续更新!!!

大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html


目前已经更新到了:



  • MyBatis(正在更新)
多对多

在数据库操持中,“多对多”关系是指两张表中的记录可以相互关联,多条记录可以关联多条记录。例如,“学生”表和“课程”表之间的关系可能是多对多,由于一个学生可以选修多门课程,而一门课程也可能被多名学生选修。
要实现多对多的关系,通常须要使用一个 中间表(关联表)。这个中间表起到桥梁的作用,将两个表的记录通过其主键关联起来。
多对多关系的特点



  • 双向性:A可以关联多个B,同时B也可以关联多个A。
  • 须要中间表:为了表示这种关系,通常使用一个中间表来维护关联。
  • 机动性高:多对多关系非常适适用来表示复杂的业务逻辑,尤其是在须要动态添加或修改关系时。
多对多关系的扩展

添加额外字段

中间表可以扩展为更多功能。例如,可以为选课添加时间戳、结果字段、是否通过等。
索引优化

为中间表中的外键添加索引,进步查询性能。
ORM 框架支持

现代框架(如 Hibernate、Django ORM)支持多对多关系的自动管理。在代码中只须要声明模型的关系,底层会自动生成并管理中间表。
查询模型


用户表和脚色的关系,一个用户有多个脚色,一个脚色被多个用户使用。
多对多的查询的需求,查询用户同时查询出该用户所有的脚色。
创建表

wzk_user_role

  1. CREATE TABLE `wzk_user_role` (
  2.   `id` int(11) NOT NULL,
  3.   `user_id` int(11) NOT NULL,
  4.   `role_id` int(11) NOT NULL,
  5.   PRIMARY KEY (`id`) USING BTREE
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
复制代码
wzk_role

  1. CREATE TABLE `wzk_role` (
  2.   `id` int(11) NOT NULL,
  3.   `rolename` varchar(255) DEFAULT NULL,
  4.   PRIMARY KEY (`id`)
  5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
复制代码
插入数据

wzk_user_role

  1. INSERT INTO wzk_user_role
  2. VALUES(1, 1, 1);
  3. INSERT INTO wzk_user_role
  4. VALUES(1, 2, 2);
复制代码
wzk_role

  1. INSERT INTO wzk_role
  2. VALUES(1, "ADMIN");
  3. INSERT INTO wzk_role
  4. VALUES(2, "USER");
复制代码
查询语句

  1. select u.*,r.*,r.id rid from wzk_user u
  2. left join wzk_user_role ur on u.id=ur.user_id
  3. inner join wzk_role r on ur.role_id=r.id;
复制代码
实行效果如下所示:

创建类

WzkUser

这里须要参加新的字段
  1. package icu.wzk.model;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import java.util.Date;
  6. import java.util.List;
  7. @Data
  8. @AllArgsConstructor
  9. @NoArgsConstructor
  10. public class WzkUser {
  11.     private int id;
  12.     private String username;
  13.     private String password;
  14.     private Date birthday;
  15.     private List<WzkOrder> orderList;
  16.     private List<WzkRole> roleList;
  17. }
复制代码
对应的截图如下所示:

WzkRole

  1. package icu.wzk.model;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. @Data
  6. @AllArgsConstructor
  7. @NoArgsConstructor
  8. public class WzkRole {
  9.     private Integer id;
  10.     private String rolename;
  11. }
复制代码
对应的截图如下所示:

UserMapper

  1. package icu.wzk.mapper;
  2. import icu.wzk.model.WzkUser;
  3. import java.util.List;
  4. public interface UserMapper {
  5.     List<WzkUser> findAll();
  6.     List<WzkUser> findAllUserAndRole();
  7. }
复制代码
对应的截图如下所示:

UserMapper.xml

  1. <resultMap id="userRoleMap" type="icu.wzk.model.WzkUser">
  2.     <result column="id" property="id"></result>
  3.     <result column="username" property="username"></result>
  4.     <result column="password" property="password"></result>
  5.     <result column="birthday" property="birthday"></result>
  6.     <collection property="roleList" ofType="icu.wzk.model.WzkRole">
  7.         <result column="rid" property="id"></result>
  8.         <result column="rolename" property="rolename"></result>
  9.     </collection>
  10. </resultMap>
  11. <select id="findAllUserAndRole" resultMap="userRoleMap">
  12.     SELECT u.*, r.*, r.id rid
  13.     FROM wzk_user u
  14.     LEFT JOIN wzk_user_role ur on u.id=ur.user_id
  15.     INNER JOIN wzk_role r on ur.role_id=r.id;
  16. </select>
复制代码
对应的截图如下所示:

编写代码

  1. package icu.wzk;
  2. import icu.wzk.mapper.UserMapper;
  3. import icu.wzk.model.WzkUser;
  4. import org.apache.ibatis.io.Resources;
  5. import org.apache.ibatis.session.SqlSession;
  6. import org.apache.ibatis.session.SqlSessionFactory;
  7. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  8. import java.io.IOException;
  9. import java.io.InputStream;
  10. import java.util.List;
  11. public class WzkIcu10 {
  12.     public static void main(String[] args) throws IOException {
  13.         InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
  14.         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
  15.                 .build(resourceAsStream);
  16.         SqlSession sqlSession = sqlSessionFactory.openSession();
  17.         UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  18.         List<WzkUser> dataList = userMapper.findAllUserAndRole();
  19.         dataList.forEach(System.out::println);
  20.         sqlSession.close();
  21.     }
  22. }
复制代码
代码的截图如下所示:

运行效果

运行上面的代码,控制台输出的效果如下所示:
  1. WzkUser(id=1, username=wzk, password=icu, birthday=Mon Nov 11 00:00:00 CST 2024, orderList=null, roleList=[WzkRole(id=1, rolename=ADMIN)])
  2. WzkUser(id=2, username=wzk2, password=icu2, birthday=Mon Nov 11 00:00:00 CST 2024, orderList=null, roleList=[WzkRole(id=2, rolename=USER)])
  3. 24/11/12 18:02:33 DEBUG jdbc.JdbcTransaction: Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@15b204a1]
复制代码
对应的截图如下所示:

注意事项



  • 索引优化:为中间表的外键字段创建索引,提拔查询性能。
  • 关系约束:使用外键约束维护数据同等性,避免孤立数据。
  • 批量操作:在大规模插入、更新时,尽量使用批量操作,提拔效率。
  • 软删除:中间表可以操持“软删除”标志位,用于保存历史记录。
大表的分表与分库

题目配景

在超大规模应用中,单表可能变得过于巨大,导致性能题目。
解决方法



  • 垂直分表:将额外字段分离,减少单表宽度。
  • 水平分表:将记录按学生或课程拆分到多个表。
  • 分库:将差别表分布在多个数据库实例上。
日志和监控

题目配景

多对多关系中的数据修改频仍,容易引入错误,例如重复记录、孤立记录等。
解决方法



  • 日志记录:记录每次数据操作的详细信息。
  • 监控工具:定期查抄中间表是否存在孤立记录或重复记录。
暂时小结

优化多对多关系模型须要从多个方面入手:


  • 提拔性能:通过索引、分区、批量操作等方式优化查询和更新。
  • 保证数据同等性:通过外键约束和事务处置处罚避免数据异常。
  • 进步机动性:通过软删除和日志记录保存历史数据,支持规复和审计。
  • 应对大数据场景:通太过区、分表或分库操持,确保体系扩展性。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

飞不高

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表