提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
实现一对一表关联,需要主表里设置一个字段为外键,子表的主键和主表的外键字段名称一致,小编根据自己的实战项目做演示,本项目根据网友的功能诉求扩展开发,属于开源项目《工程项目管理OA系统》基础上的升级版,开发工作目前进展顺利,新版系统近期将公示上线发布,大家期待已久的手机版也会发布,希望您能给予关注、点赞、收藏,您的支持将是小编呈现应用开发优秀项目的动力源泉。实例以立项申请表(主表)和项目表(子表)的关联查询为例给大家讲解,
一、mybatis知识点
-
MyBatis 是一个持久层框架,它允许开发者使用 SQL 语句来操作数据库。一对一关联查询是指查询两个表之间的关联关系,其中一个表的每一条记录都只对应另一个表的一条记录。
-
在 MyBatis 中进行一对一关联查询的思路如下:
-
定义两个实体类,分别代表两个表的记录。这两个实体类之间需要建立一对一关联关系的字段。
-
定义两个对应的 Mapper 接口,分别用于查询两个表的记录。这两个接口需要使用相应的 SQL 语句查询出需要的数据。
-
在 MyBatis 的映射文件中编写 SQL 语句。对于一对一关联查询,可以使用 JOIN 或者嵌套查询来实现。JOIN 可以将两个- 表的记录合并在一起,嵌套查询则是在外层查询中嵌套执行内层查询。
-
使用 JOIN 查询时,可以通过 ON 条件指定两个表之间的关联关系。例如:SELECT * FROM table1 JOIN table2 ON table1.id = table2.id;
-
使用嵌套查询时,可以在外层查询中使用 SELECT 子查询来查询关联表的数据。例如:SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);
-
在映射文件中配置结果映射。需要使用 元素来定义实体类之间的关联关系。可以使用 元素来指定一对一的关联关系。
-
在 Mapper 接口中定义查询方法,并在映射文件中进行配置。可以使用 元素来定义查询方法,并通过 resultMap 属性指定结果映射。
-
在 Java 代码中调用 Mapper 接口的方法来执行查询操作。通过查询得到的结果可以获取到两个表的关联数据。
二、关联表 sql 语句
主表外键project_id与字表主键project_id保持一致;
2.1主表:立项申请(oa_establish)
CREATE TABLE `oa_establish` (
`establish_id` bigint(20) unsigned NOT NULL COMMENT '主键ID',
`project_id` bigint(20) NOT NULL COMMENT '项目ID',
`instance_id` bigint(20) DEFAULT NULL COMMENT '流程实例ID',
`accessory` text COLLATE utf8mb4_bin COMMENT '附件',
`remark` varchar(256) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`establish_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='立项申请表';
2.2 子表:项目表(oa_project)
CREATE TABLE `oa_project` (
`project_id` bigint(20) unsigned NOT NULL COMMENT '主键ID',
`pro_title` varchar(128) COLLATE utf8mb4_bin DEFAULT '' COMMENT '项目名称',
`pro_number` varchar(64) COLLATE utf8mb4_bin DEFAULT '' COMMENT '项目编号',
`pro_price` decimal(6,2) DEFAULT NULL COMMENT '项目金额',
`del_flag` char(1) COLLATE utf8mb4_bin DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
PRIMARY KEY (`project_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='项目信息表';
三、代码生成
-
借助 ruoyi-vue代码生成工具,导入、根据需要编辑字段,下载源码并导入到项目;
-
Ruoyi-Vue 是一个基于 Spring Boot 和 Vue.js 的前后端分离开发平台。它提供了一套完整的代码生成器,可以帮助开发者快速生成前后端的代码,包括前端页面、后端接口、数据库表结构等;
-
Ruoyi-Vue 的代码生成器通过读取数据库的表结构,自动生成对应的 Java 实体类、控制器、服务层和前端页面等代码。开发者只需要简单配置一些参数,就可以生成符合项目需求的代码,大大减少了开发工作量和时间。
四、修改mybatis xml文件
4.1 association标签
1、在resultMap标签里添加association标签,根据需要添加需要调用数据的字段,MyBatis中的association是一种对象关联映射,用于映射两个对象之间的关系。
2、在数据库中,通常会存在多个表之间的关联关系。MyBatis提供了association标签来映射这种关系。在映射文件中,可以使用association标签定义一个对象关联。
association标签具有以下属性:
- property:指定关联对象的属性名。
- column:指定关联对象需要关联的列名。
- javaType:指定关联对象的类型。
- 在association标签内部,可以使用result标签来映射关联对象的属性。
3、通过使用association标签,可以将数据库中多个表之间的关联关系映射为Java对象之间的关系,方便进行操作和查询。
4.2 修改resultMap标签
<resultMap type="OaEstablish" id="OaEstablishResult">
<result property="establishId" column="establish_id" />
<result property="projectId" column="project_id" />
<result property="instanceId" column="instance_id" />
<result property="accessory" column="accessory" />
<result property="remark" column="remark" />
<association property="oaProject" javaType="OaProject">
<id column="project_id" property="projectId" />
<result column="pro_title" property="proTitle" />
</association>
</resultMap>
4.3 关联查询语句
<sql id="selectOaEstablishVo">
select e.establish_id, e.project_id, e.instance_id, e.accessory, e.remark, p.project_id, p.pro_title
from oa_establish e
left join oa_project p on e.project_id = p.project_id
</sql>
<select id="selectOaEstablishList" parameterType="OaEstablish" resultMap="OaEstablishResult">
<include refid="selectOaEstablishVo"/>
<where>
<if test="projectId != null "> and e.project_id = #{projectId}</if>
<if test="instanceId != null "> and e.instance_id = #{instanceId}</if>
</where>
</select>
五、实体类
/**关联项目表**/
private OaProject oaProject;
/**get set**/
public OaProject getOaProject() {return oaProject;}
public void setOaProject(OaProject oaProject) { this.oaProject = oaProject;}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("establishId", getEstablishId())
.append("projectId", getProjectId())
.append("instanceId", getInstanceId())
.append("oaProject", getOaProject())
.toString();
}
六、查看视图数据
打印接口返回的数据
created() {
this.getList();
},
methods: {
/** 查询立项申请列表 */
getList() {
this.loading = true;
listEstablish(this.queryParams).then(response => {
console.log(22223, response);
this.establishList = response.rows;
this.total = response.total;
this.loading = false;
});
},
出现下面对象属性值的时候,表示大功告成
七、总结
总之,MyBatis 中进行一对一关联查询的思路是定义实体类、Mapper 接口和映射文件,编写相应的 SQL 语句,并配置结果映射,最后通过调用 Mapper 接口的方法执行查询操作。