MyBatis 之关系映射(下)
作者:andy
- 2022-10-27 北京
本文字数:3042 字
阅读完需:约 10 分钟
一、多对多关系映射
对于多对多的数据库表操作,关键在于多对多关系中的中间表。同时,需要注意的是,在多对多关系之中,一定要找到关系主控方。如何去寻找,可以这样思考,如果没有了一方,另一方会如何。
1.1、建立数据库表
role 表:
create table role(
rid int auto_increment,
name varchar(255) not null,
constraint pk_rid primary key(rid)
)engine innodb;
复制代码
groups 表:
create table groups(
gid int auto_increment,
name varchar(255) not null,
constraint pk_gid primary key(gid)
)engine innodb;
复制代码
role_groups 表:
create table role_groups(
rid int,
gid int,
constraint fk_rid foreign key(rid) references role(rid)on delete cascade,
constraint fk_gid foreign key(gid) references groups(gid)on delete cascade
)engine innodb;
复制代码
1.2、定义 VO 类
Role 类:
package org.fuys.owndb.vo;
import java.io.Serializable;
import java.util.List;
@SuppressWarnings("serial")
public class Role implements Serializable {
private Integer rid;
private String name;
private List<Groups> groupses;
}
复制代码
Groups 类:
package org.fuys.owndb.vo;
import java.io.Serializable;
import java.util.List;
@SuppressWarnings("serial")
public class Groups implements Serializable {
private Integer gid;
private String name;
private List<Role> roles;
}
复制代码
RoleGroups 类:
package org.fuys.owndb.vo;
import java.io.Serializable;
@SuppressWarnings("serial")
public class RoleGroups implements Serializable {
private Integer rid;
private Integer gid;
}
复制代码
1.3、增加配置文件
Role.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="org.fuys.owndb.vo.mapping.Role">
<resultMap type="Role" id="RoleMap">
<id column="rid" property="rid"/>
<result column="name" property="name"/>
<collection property="groupses" column="rid" javaType="java.util.List"
ofType="Groups" select="org.fuys.owndb.vo.mapping.Groups.selectByCid"/>
</resultMap>
<insert id="insert" parameterType="Role" keyProperty="rid" useGeneratedKeys="true">
INSERT INTO role(name) VALUES(#{name})
</insert>
<insert id="insertRoleGroups" parameterType="RoleGroups">
INSERT INTO role_groups(rid,gid) VALUES(#{rid},#{gid})
</insert>
<update id="updateByRid" parameterType="Role">
UPDATE role SET name = #{name} WHERE rid = #{rid}
</update>
<delete id="deleteRoleGroupsByRid" parameterType="int">
DELETE FROM role_groups WHERE rid = #{rid}
</delete>
<select id="selectByRid" parameterType="int" resultMap="RoleMap">
SELECT rid,name
FROM role
WHERE rid = #{rid}
</select>
</mapper>
复制代码
Groups.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="org.fuys.owndb.vo.mapping.Groups">
<resultMap type="Groups" id="GroupsMap">
<id column="gid" property="gid"/>
<result column="name" property="name"/>
</resultMap>
<insert id="insert" parameterType="Groups" keyProperty="gid" useGeneratedKeys="true">
INSERT INTO groups(name) VALUES(#{name})
</insert>
<select id="selectByCid" parameterType="int" resultMap="GroupsMap">
SELECT gid,name
FROM groups
WHERE gid in (
SELECT gid FROM role_groups WHERE rid = #{rid}
)
</select>
</mapper>
复制代码
1.4、修改核心配置文件
<typeAliases>
<typeAlias type="org.fuys.owndb.vo.Role" alias="Role"/>
<typeAlias type="org.fuys.owndb.vo.Groups" alias="Groups"/>
</typeAliases>
<mappers>
<mapper resource="org/fuys/owndb/vo/mapping/Role.xml"/>
<mapper resource="org/fuys/owndb/vo/mapping/Groups.xml"/>
</mappers>
复制代码
1.5、测试数据增加程序
@Test
public void testInsert() throws Exception {
Role role = new Role();
role.setName("family");
int lenR = MyBatisSqlSessionFactory.getSqlSession().insert("org.fuys.owndb.vo.mapping.Role.insert", role);
logger.info("role --> " + role.toString() + " --> " + lenR);
List<Integer> groupses = new ArrayList<>();
Groups groups = new Groups();
groups.setName("life");
int lenG = MyBatisSqlSessionFactory.getSqlSession().insert("org.fuys.owndb.vo.mapping.Groups.insert",groups);
logger.info("groups --> " + groups.toString() + " --> " + lenG);
groupses.add(groups.getGid());
groups.setName("gift");
lenG = MyBatisSqlSessionFactory.getSqlSession().insert("org.fuys.owndb.vo.mapping.Groups.insert",groups);
logger.info("groups --> " + groups.toString() + " --> " + lenG);
groupses.add(groups.getGid());
RoleGroups roleGroups = new RoleGroups();
for(int x=0;x<groupses.size();x++){
roleGroups.setRid(role.getRid());
roleGroups.setGid(groupses.get(x));
int lenRG = MyBatisSqlSessionFactory.getSqlSession().insert("org.fuys.owndb.vo.mapping.Role.insertRoleGroups",roleGroups);
logger.info("groups --> " + roleGroups + " --> " + lenRG);
}
MyBatisSqlSessionFactory.getSqlSession().commit();
MyBatisSqlSessionFactory.closeSqlSession();
}
复制代码
1.6、测试数据修改
@Test
public void testUpdate(){
Role role = new Role();
role.setRid(1);
role.setName("better friend");
int len = MyBatisSqlSessionFactory.getSqlSession().update("org.fuys.owndb.vo.mapping.Role.updateByRid", role);
logger.info("role --> " + len);
int delRG = MyBatisSqlSessionFactory.getSqlSession().delete("org.fuys.owndb.vo.mapping.Role.deleteRoleGroupsByRid", 1);
logger.info("roleGroups --> " + delRG);
List<Integer> groupses = new ArrayList<>();
groupses.add(1);
groupses.add(2);
RoleGroups roleGroups = new RoleGroups();
for(int x=0;x<groupses.size();x++){
roleGroups.setRid(role.getRid());
roleGroups.setGid(groupses.get(x));
int lenRG = MyBatisSqlSessionFactory.getSqlSession().insert("org.fuys.owndb.vo.mapping.Role.insertRoleGroups",roleGroups);
logger.info("groups --> " + roleGroups + " --> " + lenRG);
}
MyBatisSqlSessionFactory.getSqlSession().commit();
MyBatisSqlSessionFactory.closeSqlSession();
}
复制代码
1.7、测试数据查询
@Test
public void testMoreVsMore(){
Role role = MyBatisSqlSessionFactory.getSqlSession().selectOne("org.fuys.owndb.vo.mapping.Role.selectByRid",1);
logger.info(role.toString());
}
复制代码
综上所述,使用级联查询非常麻烦,所以,能够不使用,就不要使用。
划线
评论
复制
发布于: 刚刚阅读数: 5
andy
关注
还未添加个人签名 2019-11-21 加入
还未添加个人简介
评论