级联查询数据
我们在做项目时,一定会遇到多表之间进行增删改查的操作。多表之间还会有关联关系,例如图书馆系统中图书类与书的关系。
当遇到一对多问题时,单表的增删改查已经不能满足需要,逆向生成工具只能生成单表的增删改查,此时需要手动编写使用级联查询方式进行。
先进行一下需求描述:
表1:
表2:
其中,表2的外键为category_id;
表1与表2之间的关系为一对多。
此时需要使用级联操作;
项目采用三层架构方式:
代码如下:
首先构建pojo类
package com.cms.bean.ex;
import java.io.Serializable;
import java.util.List;
import com.cms.bean.Article;
import io.swagger.annotations.ApiParam;
public class CategoryEX implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private Integer id;
//注解@ApiParam(value="栏目编号",required=true)是在Swagger插件运行时,起到提示作用,提示此条需填入的时栏目编号,required=true指的是词条数据为必填项,不可为空
@ApiParam(value="栏目编号",required=true)
private Long code;
@ApiParam(value="栏目名称",required=true)
private String name;
//栏目:文章=1:n,一对多模式,此时需要将Article属性进行依赖注入(在后面的xml配置文件中进行配置)
private List<Article> articles;
public List<Article> getArticles() {
return articles;
}
public void setArticles(List<Article> articles) {
this.articles = articles;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Long getCode() {
return code;
}
public void setCode(Long code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name == null ? null : name.trim();
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(getClass().getSimpleName());
sb.append(" [");
sb.append("Hash = ").append(hashCode());
sb.append(", id=").append(id);
sb.append(", code=").append(code);
sb.append(", name=").append(name);
sb.append(", articles=").append(articles);
sb.append(", serialVersionUID=").append(serialVersionUID);
sb.append("]");
return sb.toString();
}
}
mapper类:
package com.cms.mapper.ex;
import java.util.List;
import com.cms.bean.Category;
import com.cms.bean.ex.CategoryEX;
public interface CategoryEXMapper {
//查询所有栏目对象的所有文章
List<CategoryEX> findAllCategoryEX();
//根据ID查询栏目并和对应的所有文章
CategoryEX findCategoryEXById(int id);
}
根据mapper类提供的方法写对应的mysql语句:
配置文件中的sql语句一定要正确,否则会报错。如果不确定正不正确,可以现在数据库中进行验证。
mapper.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="com.cms.mapper.ex.CategoryEXMapper">
<!-- 结果集 -->
<resultMap id="BaseResultMap" type="com.cms.bean.ex.CategoryEX">
<id column="id" jdbcType="INTEGER" property="id" />
<result column="code" jdbcType="BIGINT" property="code" />
<result column="name" jdbcType="VARCHAR" property="name" />
<!-- conllertion:一对多,article的依赖注入 -->
<collection property="articles"
column="id"
ofType="com.cms.bean.Article"
select="selectArticleByCategoryId">
</collection>
</resultMap>
<!-- 结果集中的select方法 -->
<select id="selectArticleByCategoryId" parameterType="int" resultType="com.cms.bean.Article">
select * from cms_article where category_id=#{id}
</select>
<!-- 返回结果集:BaseResultMap -->
<select id="findAllCategoryEX" resultMap="BaseResultMap">
select * from cms_category
</select>
<!-- 返回结果集:BaseResultMap -->
<select id="findCategoryEXById" parameterType="int" resultMap="BaseResultMap">
select * from cms_category where id=#{id}
</select>
</mapper>
级联查询完毕,之后根据所需进行调用mapper接口中的方法。可在Service层中调用。
注:记得在application.properties配置文件中进行扫描mapper.xml文件的配置。
mybatis.mapper-locations=classpath:mapper/**/*Mapper.xml
(mapper文件夹下,任意文件,以Mapper.xml结尾的文件)
级联删除数据
如图关系所示:
表:category;
表:article;
表article中的未见category_id是表category的主键id值。在删除category表时,必须先删除掉外键等于category主键值的id的数据,否则article表中的关联外键值为空,会报错。
代码为:
//删除category表根据提供的id值。
public void deleteCategoryById(int id) throws CategoryException {
//在删除栏目之前,需要先删除对象的文章
ArticleExample example = new ArticleExample();
//生成条件选择器
Criteria criteria = example.createCriteria();
//条件:CategoryId==id值时
criteria.andCategoryIdEqualTo(id);
//删除article表中的数据
articleMapper.deleteByExample(example);
categoryMapper.deleteByPrimaryKey(id);
}