环境说明:eclipse JDK13 Oracle11g

情景说明

公司里各个部门的员工可以进行企业项目的申报,如果项目通过企业审核,可以投入企业的项目规划环节。

员工可以申请项目。一个员工申请多个项目,一个项目可以有多个员工。备注:

项目包含的数据项(项目编号,项目名称,项目内容,项目提交的时间

继续建设company数据库以及进行程序设计,完成上面关于多对多的映射案例。

设计三个表

员工表(empinfo)

项目表(cproject)

映射表(主要用于把两个主键映射起来,为了看着舒服一点,不创建也可以)

测试的公用部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// 公用部分
public static void connUntil() throws IOException {
Reader reader = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sessionfactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionfactory.openSession();
UserMapper stuMapper = session.getMapper(UserMapper.class);
//qUserAll(stuMapper);
//System.out.println(updateUserALL(stuMapper));
//System.out.println(deleteUserALL(stuMapper)+"has been totally deleted.✔");
//selectDepartAll(stuMapper);
//System.out.println(addProject(stuMapper)+"的项目已经提交✔");
//System.out.println(updateProject(stuMapper)+"行已经受影响✔");
//System.out.println(delteProject(stuMapper)+"已经被删除✔");
//queryprojectWithEid(stuMapper);
//queryprojectWithDid(stuMapper);
//queryprojectWithPName(stuMapper);
session.commit();
session.close();
}
public static void main(String[] args) throws IOException {
connUntil();
}
//放一个map
public static Map<String, Object> giveMeAMap() {
User user = giveMeAUser();
Map<String, Object> userMap = new HashMap<>();
userMap.put("UNAMEin", user.getUserinfo().getuName());
return userMap;
}

// 放一个user
public static User giveMeAUser() {
Detail detail = new Detail(3, "北京", "2085321569", "2085321569@qq.com");
UserInfo userinfo = new UserInfo(3, "老张", "321321");
User user = new User(userinfo, detail);
return user;
}
//放一个EMP
public static EmpInfo giveMeAEMP() {
EmpInfo ep =new EmpInfo(1, "根哥",10,"女","12321212545");
return ep;
}

(1)申请项目,插入操作。插入一个员工申请的项目。

SQL端制作一个存储过程

1
2
3
4
5
6
7
8
9
10
11
CREATE OR REPLACE PROCEDURE InsertPROJECT(PNAMEin IN VARCHAR2,PCONTENTin IN VARCHAR2,ENAMEin IN VARCHAR2,Informo OUT VARCHAR2)
AS
n1 NUMBER;--两个自增
n2 NUMBER;
BEGIN
select PROJECTSEQ.nextval into n1 from dual;
INSERT into CPROJECT(PID,PNAME,PCONTENT,PTIME) values (n1,PNAMEin,PCONTENTin,SYSDATE);
select EPMAPPERSEQ.nextval into n2 from dual;
INSERT INTO EPMAPPER(EPID,EID,PID) VALUES(n2,(SELECT e.EID FROM EMPINFO e WHERE e.ENAME=ENAMEin),n1);
SELECT ENAME INTO Informo FROM EMPINFO e WHERE e.ENAME=ENAMEin;
END;

xml

1
2
3
4
5
6
7
8
9
<!-- 添加项目 -->
<insert id="addProject" parameterType="HashMap" statementType="CALLABLE">
{CALL InsertPROJECT(
#{PNAMEin,jdbcType=VARCHAR,mode=IN},
#{PCONTENTin,jdbcType=VARCHAR,mode=IN},
#{ENAMEin,jdbcType=VARCHAR,mode=IN},
#{Informo,jdbcType=VARCHAR,mode=OUT}
)}
</insert>

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
//insert一个项目

public static String addProject(UserMapper stuMapper) throws IOException {
Map<String, Object> empMap=new HashMap<>();
EProject ep=new EProject("小项目","很小的一个项目");
EmpInfo emp=giveMeAEMP();
empMap.put("PNAMEin", ep.getpName());
empMap.put("PCONTENTin", ep.getpContent());
empMap.put("ENAMEin", emp.geteName());
stuMapper.addProject(empMap);

return (String) empMap.get("Informo");
}

(2)修改项目,更新操作。修改一个员工申请的项目。

对项目信息的更新相对简单一些

xml中

1
2
3
4
<!-- 更新项目 -->
<update id="updateProject" parameterType="top.eshyee.entity.EProject">
UPDATE CPROJECT p SET p.PNAME=#{pName},p.PCONTENT=#{pContent},p.PTIME=SYSDATE WHERE PID=#{pId}
</update>

测试集

1
2
3
4
5
//修改项目
public static int updateProject(UserMapper stuMapper) throws IOException {
EProject ep=new EProject(1,"成功的小项目","哈");
return stuMapper.updateProject(ep);
}

测试结果

(3)删除项目,删除操作。删除一个员工申请的项目。

删除除了删掉项目本身以外 还应考虑删掉映射表中的映射关系

创建存储过程

1
2
3
4
5
6
7
8
CREATE OR REPLACE PROCEDURE delproject(PIDin IN NUMBER,PNameout OUT VARCHAR2)
AS
BEGIN
SELECT PNAME INTO PNameout from CPROJECT WHERE PID=PIDin ;
DELETE FROM EPMAPPER WHERE PID=PIDin;
DELETE FROM CPROJECT WHERE PID=PIDin;

END;

配置xml

1
2
3
4
5
6
<delete id="delteProject" parameterType="HashMap" statementType="CALLABLE">
{CALL delproject(
#{PIDin,jdbcType=INTEGER,mode=IN},
#{PNameout,jdbcType=VARCHAR,mode=OUT}
)}
</delete>

测试集

1
2
3
4
5
6
7
//删除项目
public static String delteProject (UserMapper stuMapper) throws IOException {
Map<String, Object> userMap = new HashMap<>();
userMap.put("PIDin", 5);
stuMapper.delteProject(userMap);
return (String) userMap.get("PNameout");
}

(4)查询项目,查询操作。进行多条件查询。根据员工编号,员工所在部门,员工的项目名称(模糊查询)等条件进行查询。

这里虽然使用到多对多的概念 但是mybatis目前没有真正意义上的多对多 ,需要使用到两个多对一。然后采用resultmap,这里提供另一个思路。

SQL端将三个表连接起来去重

1
SELECT A.*,B.EPID,C.* FROM EMPINFO A  ,EPMAPPER B ,CPROJECT C WHERE A.EID=B.EID AND B.PID=C.PID
1
2
3
4
5
6
7
8
9
10
4	1	根哥	1013254621021	7	1	成功的小项目	哈	2020-03-24 17:39:14
2 1 小王 912545236547 5 1 成功的小项目 哈 2020-03-24 17:39:14
1 1 小刘 1121326545231 1 1 成功的小项目 哈 2020-03-24 17:39:14
4 1 根哥 1013254621021 8 2 项目二 项目二 2020-03-12 09:07:37
2 1 小王 912545236547 4 2 项目二 项目二 2020-03-12 09:07:37
1 1 小刘 1121326545231 2 2 项目二 项目二 2020-03-12 09:07:37
4 1 根哥 1013254621021 9 3 项目三 项目三 2020-03-15 09:08:03
2 1 小王 912545236547 6 3 项目三 项目三 2020-03-15 09:08:03
1 1 小刘 1121326545231 3 3 项目三 项目三 2020-03-15 09:08:03
4 1 根哥 1013254621021 12 8 小项目 很小的一个项目 2020-03-24 17:13:17

这样关系似乎更加明显了

然后再在mapper.xml文件中分别写三个查询就ok了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!-- project查询 EID-->
<select id="queryprojectWithEid" resultType="HashMap" parameterType="int">
SELECT DISTINCT * FROM (
<include refid="projectJoinAll"></include>
) WHERE EID=#{eId}
</select>

<!-- project查询 DID -->
<select id="queryprojectWithDid" resultType="HashMap" parameterType="int">
SELECT DISTINCT * FROM (
<include refid="projectJoinAll"></include>
) WHERE DID=#{dId}
</select>
<!-- project查询 模糊项目名称 -->
<select id="queryprojectWithPName" resultType="HashMap" parameterType="int">
SELECT DISTINCT * FROM (
<include refid="projectJoinAll"></include>
) WHERE PNAME like '%${pName}%'
</select>

<!-- 连接三个表 -->
<sql id="projectJoinAll">
SELECT A.*,B.EPID,C.* FROM EMPINFO A ,EPMAPPER B ,CPROJECT C WHERE A.EID=B.EID AND B.PID=C.PID
</sql>

测试文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//查询全部project相关 BY eId
public static void queryprojectWithEid(UserMapper stuMapper) throws IOException {
List<Map<String, Object>> map=stuMapper.queryprojectWithEid(1);
System.out.println("根据员工编号查询");
for(int i=0;i<map.size();i++) {
System.out.println(map.get(i));

}
}
//查询全部project相关 BY dId
public static void queryprojectWithDid(UserMapper stuMapper) throws IOException {
List<Map<String, Object>> map=stuMapper.queryprojectWithDid(1);
System.out.println("根据员工所在部门查询");
for(int i=0;i<map.size();i++) {
System.out.println(map.get(i));

}
}
//查询全部project相关 BY pName
public static void queryprojectWithPName(UserMapper stuMapper) throws IOException {
List<Map<String, Object>> map=stuMapper.queryprojectWithPName("项目三");
System.out.println("根据项目名称模糊查询");
for(int i=0;i<map.size();i++) {
System.out.println(map.get(i));

}
}
// 公用部分

测试结果

QQ图片20200324193915