级联查询数据

我们在做项目时,一定会遇到多表之间进行增删改查的操作。多表之间还会有关联关系,例如图书馆系统中图书类与书的关系。

当遇到一对多问题时,单表的增删改查已经不能满足需要,逆向生成工具只能生成单表的增删改查,此时需要手动编写使用级联查询方式进行。

先进行一下需求描述:

表1:

java中如何做级联 java级联查询_java中如何做级联


表2:

java中如何做级联 java级联查询_java_02

其中,表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;

java中如何做级联 java级联查询_spring boot_03


表:article;

java中如何做级联 java级联查询_spring boot_04


表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);
}