MyBatis進行一對多的關聯表操作


一、准備t_role 、t_role_promission、t_promission表

CREATE TABLE `t_role` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `sn` varchar(255) NOT NULL,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8;
CREATE TABLE `t_permission` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `url` varchar(255) NOT NULL,
  `sn` varchar(255) NOT NULL,
  `systemmenu_id` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `qwe` (`systemmenu_id`),
  CONSTRAINT `qwe` FOREIGN KEY (`systemmenu_id`) REFERENCES `t_systemmenu` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
CREATE TABLE `t_role_permission` (
  `role_id` bigint(20) NOT NULL DEFAULT '0',
  `permission_id` bigint(20) NOT NULL DEFAULT '0',
  PRIMARY KEY (`role_id`,`permission_id`),
  KEY `wl` (`permission_id`),
  CONSTRAINT `wl` FOREIGN KEY (`permission_id`) REFERENCES `t_permission` (`id`),
  CONSTRAINT `wq` FOREIGN KEY (`role_id`) REFERENCES `t_role` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

二、准備role和permission的domain表,

 1 public class Role {
 2 
 3     private Long id;
 4 
 5     private String sn;//編碼  admin
 6 
 7     private String name;//名稱  超級管理員
 8 
 9     private List<Permission> permissions;//角色對應的權限
10 
11     //省略了get、set      
12 }
 1 public class Permission {
 2     private Long id;
 3 
 4     private String name;
 5 
 6     private String url;//權限路徑  /employee/save
 7 
 8     private String sn;//編碼  employee:save
 9 
10     private Long systemmenuId;//菜單
11   
12    // 省略get、set    
13 }

由於mabatis沒有級聯操作,所以我們將中間表也需要建立一個domain

1 public class RolePermission {
2 
3     private Role role;
4     private Permission permission;
5   
6   //省略get、set    
7 }

三、mabatis一對多關聯查詢

RoleMapper.xml
 1 <mapper namespace="com.wangshifu.car_repair.mapper.RoleMapper" >
 2   <resultMap id="BaseResultMap" type="com.wangshifu.car_repair.domain.Role" >
 3     <id column="id" property="id" jdbcType="BIGINT" />
 4     <result column="sn" property="sn" jdbcType="VARCHAR" />
 5     <result column="name" property="name" jdbcType="VARCHAR" />
 6     <collection property="permissions" ofType="com.wangshifu.car_repair.domain.Permission"
 7       column="id" select="com.wangshifu.car_repair.mapper.PermissionMapper.selectPermission"
 8     >
 9      <!-- <id column="pid" property="id" />
10       <result column="pname" property="name" />
11       <result column="purl" property="url" />
12       <result column="psn" property="sn" />-->
13     </collection>
14   </resultMap>
15 <!--分頁查詢-->
16   <select id="selectQuery" resultMap="BaseResultMap" parameterType="com.wangshifu.car_repair.query.RoleQuery" >
17     /*select r.id, r.sn, r.name,p.id pid,p.name pname,p.url purl,p.sn psn
18     from t_role r left join t_role_permission rp ON r.id=rp.role_id
19     left JOIN t_permission p ON p.id =rp.permission_id*/
20     select distinct id, sn, name
21     from t_role
22     /*高級查詢*/
23   <where>
24     <if test="name !=null and name!=''">
25       and r.name like concat('%',#{name},'%')
26     </if>
27   </where>
28   </select>
1 <!--  permission.xml     查詢角色權限-->
2   <select id="selectPermission" resultMap="BaseResultMap"  parameterType="com.wangshifu.car_repair.domain.Role">
3   select p.*
4     from t_role r join t_role_permission rp ON r.id=rp.role_id
5   JOIN t_permission p ON p.id =rp.permission_id where r.id=#{id}
6   </select>

四、mabatis關聯查詢出現的分頁問題

在上面我這里分別用了嵌套查詢(注釋部分)和嵌套結果,最開始使用的是嵌套查詢,發現前台的分頁是先將數據查詢出來然后進行的分頁,這樣就導致的分頁的錯誤信息,

 

所以得使用嵌套結果,將這倆條sql獨立,先將需要進行分頁的數據進行分頁,再將關聯表的數據加入進來,分頁信息就ok了。

 

五、mabatis一對多關聯增、刪、改

 1 <!--   roleMapper.xml   角色權限添加-->
 2   <insert id="insertRoleAndPermission" parameterType="com.wangshifu.car_repair.domain.RolePermission">
 3     insert into t_role_permission (role_id, permission_id)
 4     values (#{role.id}, #{permission.id});
 5   </insert>
 6   <!--角色權限修改-->
 7   <update id="updateRoleAndPermission" parameterType="com.wangshifu.car_repair.domain.RolePermission">
 8     update t_role_permission
 9     set  permission_id = #{permission.id}
10     where role_id = #{role.id,jdbcType=BIGINT}
11     and permission_id=#{permission.id,jdbcType=BIGINT}
12   </update>
13   <!--角色權限刪除-->
14   <delete id="deleteRoleAndPermission" parameterType="com.wangshifu.car_repair.domain.RolePermission" >
15     delete from t_role_permission
16     where role_id = #{role.id,jdbcType=BIGINT}
17     and permission_id=#{permission.id,jdbcType=BIGINT}
18   </delete>

六、mabatis一對多關聯增、刪、改java代碼部分

 1 @Controller
 2 @RequestMapping("/role")
 3 public class RoleController {
 4 
 5     @Autowired
 6     private IRoleService roleService;
 7     @Autowired
 8     private IPermissionService permissionService;
 9 
10 
11     @RequestMapping("/delete")
12     @ResponseBody
13     public AjaxResult delete(Long id){
14         try {
15             //查詢角色
16             Role role = roleService.findOne(id);
17             //查詢權限
18             List<Permission> permissionsList = permissionService.selectPermission(role);
19             permissionsList.forEach(e->{
20                 //先刪除中間表
21                 roleService.deleteRoleAndPermission(new RolePermission(role, e));
22             });
23             //再刪除角色表
24             roleService.delete(id);
25             return new AjaxResult();
26         } catch (Exception e) {
27             e.printStackTrace();
28             return new AjaxResult(e.getMessage());
29         }
30     }
31 
32 
33     @RequestMapping("/save")
34     @ResponseBody
35     public AjaxResult save(Role role){
36         try {
37             //該角色權限(只有id,前台傳過來的)
38             List<Permission> permissions = role.getPermissions();
39             //保存角色返回主鍵(需要在對應mapper.xml配置屬性)
40             roleService.save(role);
41             //如果有權限
42             if(permissions.size()>0){
43                 permissions.forEach(e->{
44                     //保存中間表
45                     roleService.insertRoleAndPermission(new RolePermission(role, e));
46                 });
47             }
48             return new AjaxResult();
49         } catch (Exception e) {
50             e.printStackTrace();
51             return new AjaxResult(e.getMessage());
52         }
53     }
54 
55     @RequestMapping("/update")
56     @ResponseBody
57     public AjaxResult update(Role role){
58         try {
59             //該角色最新的權限(有id)
60             List<Permission> permissions = role.getPermissions();
61             //原來的權限
62             List<Permission> permissionList = permissionService.selectPermission(role);
63             if(permissionList.size()>0){
64                 permissionList.forEach(e->{
65                     //先刪除原有關系中間表
66                     roleService.deleteRoleAndPermission(new RolePermission(role, e));
67                 });
68             }
69            if( permissions!=null  && permissions.size()>0 ){
70                permissions.forEach(p->{
71                    //添加最新的權限中間表
72                    roleService.insertRoleAndPermission(new RolePermission(role, p));
73                });
74            }
75             //最后修改角色表(因為外鍵關聯、需要在中間表操作后才操作)
76             roleService.update(role);
77             return new AjaxResult();
78         } catch (Exception e) {
79             e.printStackTrace();
80             return new AjaxResult(e.getMessage());
81         }
82     }
83 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM