标签接口开发(富含完整CRUD开发流程)

news2025/2/24 23:39:45

文章目录

    • 1.easyCode生成CRUD
        • 1.生成代码
        • 2.查看代码
        • 3.调整代码
          • 1.SubjectLabelDao.xml发现生成的select语句不带逗号!!!
            • 1.解决方法:
            • 2.entity.java.vm
            • 3.dao.java.vm
            • 4.Mapper.xml.vm
          • 2.重新生成代码
          • 3.SubjectLabelDao.java 删除Pageable相关代码
          • 4.SubjectLabelService.java 删除分页查询接口
          • 5.SubjectLabelServiceImpl.java 删除分页查询接口
          • 6.实体类SubjectLabel.java 使用lombok简化
    • 2.新增标签接口
        • 1.sun-club-application-controller
          • 1.编写SubjectLabelDTO.java
          • 2.SubjectLabelDTOConverter.java 编写基础转换器
        • 2.sun-club-domain
          • 1.SubjectLabelBO.java
          • 2.SubjectLabelConverter.java 编写基础转换器
        • 3.sun-club-domain
          • 1.service
            • 1.SubjectLabelDomainService.java 先编写一个新增标签的接口
        • 4.sun-club-application-controller
          • 1.SubjectLabelController.java
        • 5.sun-club-domain
          • 1.SubjectLabelDomainServiceImpl.java
        • 6.sun-club-infra
          • 1.SubjectLabelService.java
          • 2.SubjectLabelServiceImpl.java
    • 3.更新标签接口
        • 1.基本设计
        • 2.sun-club-application-controller
          • 1.SubjectLabelController.java
        • 3.sun-club-domain
          • 1.SubjectLabelDomainService.java
          • 2.SubjectLabelDomainServiceImpl.java
        • 4.sun-club-infra
          • 1.SubjectLabelService.java
          • 2.SubjectLabelServiceImpl.java
    • 4.删除标签接口
        • 1.基本设计
        • 2.sun-club-application-controller
          • 1.SubjectLabelController.java
        • 3.sun-club-domain
          • 1.SubjectLabelDomainService.java
          • 2.SubjectLabelDomainServiceImpl.java
    • 5.根据分类查询标签
        • 1.生成subject_mapping表的CRUD
          • 1.生成代码
          • 2.修改生成的SubjectMappingDao.java的位置为mapper下
          • 3.实体类SubjectMapping.java使用lombok简化
          • 4.SubjectMappingDao.java删除Pageable
          • 5.SubjectMappingService.java删除分页查询接口
          • 6.SubjectMappingServiceImpl.java删除分页查询实现类
          • 7.SubjectMappingService.java把新增和修改的返回值改为int,只返回影响的记录条数
          • 8.SubjectMappingServiceImpl.java也对新增和修改的实现类做相应调整
        • 2.SubjectLabelController.java
        • 3.sun-club-domain
          • 1.SubjectLabelDomainService.java
          • 2.SubjectLabelDomainServiceImpl.java
        • 4.sun-club-infra
          • 1.service
            • 1.SubjectMappingService.java
            • 2.SubjectLabelService.java
            • 3.SubjectMappingServiceImpl.java
            • 4.SubjectLabelServiceImpl.java
          • 2.mapper
            • 1.SubjectMappingDao.java
            • 2.SubjectLabelDao.java
            • 3.SubjectMappingDao.xml
            • 4.SubjectLabelDao.xml
    • 6.标签接口总体测试
        • 1.新增标签接口
        • 2.更新标签接口
        • 3.删除标签接口
        • 4.根据分类查询标签
          • 1.报错Parsing error was found in mapping #{categoryId, INTEGER}. Check syntax #{property|(expression), var1=value1, var2=value2, ...}
          • 2.将SubjectMappingDao.xml里面指定类型时加上jdbcType属性即可
          • 3.再次请求,发现根据id批量查询的时候判断空的条件错了,将!去掉
          • 4.再次请求发现xml中的labelIdList参数没找到,原因是没有加@Param注解
          • 5.再次请求,成功查找到信息
          • 6.但是,在根据labelId进行批量查询的时候没有考虑逻辑删除,会将数据都查出来
          • 7.在SubjectLabelDao.xml的批量查询时加个条件即可

1.easyCode生成CRUD

1.生成代码

image-20240525164022418

2.查看代码

image-20240525162249082

3.调整代码
1.SubjectLabelDao.xml发现生成的select语句不带逗号!!!
1.解决方法:

在easycode的设置里找到:

1、Template下的 mapper.xml.vm脚本

2、Global Config下的 mybatisSupport.vm脚本

然后将这两个脚本里的 $velocityHasNext 替换成 $foreach.hasNext,然后保存设置。之后新生成的mapper.xml里就不会出现没有逗号间隔的问题了。

2.entity.java.vm
##引入宏定义
$!{define.vm}
 
##使用宏定义设置回调(保存位置与文件后缀)
#save("/entity", ".java")
 
##使用宏定义设置包后缀
#setPackageSuffix("entity")
 
##使用全局变量实现默认包导入
$!{autoImport.vm}
import java.io.Serializable;
 
##使用宏定义实现类注释信息
#tableComment("实体类")
public class $!{tableInfo.name} implements Serializable {
    private static final long serialVersionUID = $!tool.serial();
#foreach($column in $tableInfo.fullColumn)
    #if(${column.comment})/**
     * ${column.comment}
     */#end
 
    private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end
 
#foreach($column in $tableInfo.fullColumn)
##使用宏定义实现get,set方法
#getSetMethod($column)
#end
 
}
3.dao.java.vm
##定义初始变量
#set($tableName = $tool.append($tableInfo.name, "Dao"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/dao"))
 
##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
    #set($pk = $tableInfo.pkColumn.get(0))
#end
 
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}dao;
 
import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name};
import org.apache.ibatis.annotations.Param;
import org.springframework.data.domain.Pageable;
import java.util.List;
 
/**
 * $!{tableInfo.comment}($!{tableInfo.name})表数据库访问层
 *
 * @author $!author
 * @since $!time.currTime()
 */
public interface $!{tableName} {
 
    /**
     * 通过ID查询单条数据
     *
     * @param $!pk.name 主键
     * @return 实例对象
     */
    $!{tableInfo.name} queryById($!pk.shortType $!pk.name);
 
    /**
     * 查询指定行数据
     *
     * @param $!tool.firstLowerCase($!{tableInfo.name}) 查询条件
     * @param pageable         分页对象
     * @return 对象列表
     */
    List<$!{tableInfo.name}> queryAllByLimit($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}), @Param("pageable") Pageable pageable);
 
    /**
     * 统计总行数
     *
     * @param $!tool.firstLowerCase($!{tableInfo.name}) 查询条件
     * @return 总行数
     */
    long count($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}));
 
    /**
     * 新增数据
     *
     * @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象
     * @return 影响行数
     */
    int insert($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}));
 
    /**
     * 批量新增数据(MyBatis原生foreach方法)
     *
     * @param entities List<$!{tableInfo.name}> 实例对象列表
     * @return 影响行数
     */
    int insertBatch(@Param("entities") List<$!{tableInfo.name}> entities);
 
    /**
     * 批量新增或按主键更新数据(MyBatis原生foreach方法)
     *
     * @param entities List<$!{tableInfo.name}> 实例对象列表
     * @return 影响行数
     * @throws org.springframework.jdbc.BadSqlGrammarException 入参是空List的时候会抛SQL语句错误的异常,请自行校验入参
     */
    int insertOrUpdateBatch(@Param("entities") List<$!{tableInfo.name}> entities);
 
    /**
     * 修改数据
     *
     * @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象
     * @return 影响行数
     */
    int update($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}));
 
    /**
     * 通过主键删除数据
     *
     * @param $!pk.name 主键
     * @return 影响行数
     */
    int deleteById($!pk.shortType $!pk.name);
 
}
4.Mapper.xml.vm
##引入mybatis支持
$!{mybatisSupport.vm}
 
##设置保存名称与保存位置
$!callback.setFileName($tool.append($!{tableInfo.name}, "Dao.xml"))
$!callback.setSavePath($tool.append($modulePath, "/src/main/resources/mapper"))
 
##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
    #set($pk = $tableInfo.pkColumn.get(0))
#end
 
<?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="$!{tableInfo.savePackageName}.dao.$!{tableInfo.name}Dao">
 
    <resultMap type="$!{tableInfo.savePackageName}.entity.$!{tableInfo.name}" id="$!{tableInfo.name}Map">
#foreach($column in $tableInfo.fullColumn)
        <result property="$!column.name" column="$!column.obj.name" jdbcType="$!column.ext.jdbcType"/>
#end
    </resultMap>
 
    <!--查询单个-->
    <select id="queryById" resultMap="$!{tableInfo.name}Map">
        select #allSqlColumn() 
        from $!tableInfo.obj.name
        where $!pk.obj.name = #{$!pk.name}
    </select>
 
    <!--查询指定行数据-->
    <select id="queryAllByLimit" resultMap="$!{tableInfo.name}Map">
        select  #allSqlColumn()
        from $!tableInfo.obj.name
        <where>
#foreach($column in $tableInfo.fullColumn)
            <if test="$!column.name != null#if($column.type.equals("java.lang.String")) and $!column.name != ''#end">
                and $!column.obj.name = #{$!column.name, $!column.ext.jdbcType}
            </if>
#end
        </where>
        limit #{pageable.offset}, #{pageable.pageSize}
    </select>
 
    <!--统计总行数-->
    <select id="count" resultType="java.lang.Long">
        select count(1)
        from $!tableInfo.obj.name
        <where>
#foreach($column in $tableInfo.fullColumn)
            <if test="$!column.name != null#if($column.type.equals("java.lang.String")) and $!column.name != ''#end">
                and $!column.obj.name = #{$!column.name, $!column.ext.jdbcType}
            </if>
#end
        </where>
    </select>
 
    <!--新增所有列-->
    <insert id="insert" keyProperty="$!pk.name" useGeneratedKeys="true">
        insert into $!{tableInfo.obj.name}(#foreach($column in $tableInfo.otherColumn)$!column.obj.name#if($foreach.hasNext), #end#end)
        values (#foreach($column in $tableInfo.otherColumn)#{$!{column.name}}#if($foreach.hasNext), #end#end)
    </insert>
 
    <insert id="insertBatch" keyProperty="$!pk.name" useGeneratedKeys="true">
        insert into $!{tableInfo.obj.name}(#foreach($column in $tableInfo.otherColumn)$!column.obj.name#if($foreach.hasNext), #end#end)
        values
        <foreach collection="entities" item="entity" separator=",">
        (
        #foreach($column in $tableInfo.otherColumn)
           <choose>
                <when test="entity.${column.name} != null">
                 #{entity.$!{column.name}}#if($foreach.hasNext), #end
                </when>
                <otherwise>NULL#if($foreach.hasNext), #end</otherwise>
          </choose>
         #end
         )
        </foreach>
    </insert>

 
    <insert id="insertOrUpdateBatch" keyProperty="$!pk.name" useGeneratedKeys="true">
        insert into $!{tableInfo.obj.name}(#foreach($column in $tableInfo.otherColumn)$!column.obj.name#if($foreach.hasNext), #end#end)
        values
        <foreach collection="entities" item="entity" separator=",">
            (#foreach($column in $tableInfo.otherColumn)#{entity.$!{column.name}}#if($foreach.hasNext), #end#end)
        </foreach>
        on duplicate key update
        #foreach($column in $tableInfo.otherColumn)
         $!column.obj.name = values($!column.obj.name)#if($foreach.hasNext),
        #end#end
 
    </insert>
 
    <!--通过主键修改数据-->
    <update id="update">
        update $!{tableInfo.obj.name}
        <set>
#foreach($column in $tableInfo.otherColumn)
            <if test="$!column.name != null#if($column.type.equals("java.lang.String")) and $!column.name != ''#end">
                $!column.obj.name = #{$!column.name},
            </if>
#end
        </set>
        where $!pk.obj.name = #{$!pk.name}
    </update>
 
    <!--通过主键删除-->
    <delete id="deleteById">
        delete from $!{tableInfo.obj.name} where $!pk.obj.name = #{$!pk.name}
    </delete>
 
</mapper>
2.重新生成代码
3.SubjectLabelDao.java 删除Pageable相关代码

image-20240525164912586

4.SubjectLabelService.java 删除分页查询接口

image-20240525165147218

5.SubjectLabelServiceImpl.java 删除分页查询接口

image-20240525165209692

6.实体类SubjectLabel.java 使用lombok简化

image-20240525165354818

2.新增标签接口

1.sun-club-application-controller
1.编写SubjectLabelDTO.java
package com.sunxiansheng.subject.application.dto;

import lombok.Data;

import java.io.Serializable;

/**
 * 题目标签表(SubjectLabel)实体类
 */
@Data
public class SubjectLabelDTO implements Serializable {
    private static final long serialVersionUID = 965293549798069262L;
    /**
     * 主键
     */
    private Long id;

    /**
     * 标签分类
     */
    private String labelName;

    /**
     * 排序
     */
    private Integer sortNum;

    /**
     * 分类id
     */
    private String categoryId;

}

2.SubjectLabelDTOConverter.java 编写基础转换器
package com.sunxiansheng.subject.application.convert;

import com.sunxiansheng.subject.application.dto.SubjectLabelDTO;
import com.sunxiansheng.subject.domain.entity.SubjectLabelBO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

import java.util.List;

/**
 * Description: DTO与BO转换
 * @Author sun
 * @Create 2024/5/24 9:40
 * @Version 1.0
 */
@Mapper
public interface SubjectLabelDTOConverter {
    SubjectLabelDTOConverter INSTANCE= Mappers.getMapper(SubjectLabelDTOConverter.class);

    // 将SubjectLabelDTO转换为SubjectLabelBO
    SubjectLabelBO convertDTOToSubjectLabel(SubjectLabelDTO subjectLabelDTO);

    // 将SubjectLabelBO转换为SubjectLabelDTO
    SubjectLabelDTO convertSubjectLabelToDto(SubjectLabelBO subjectLabelBO);

    // 将List<SubjectLabelDTO>转换为List<SubjectLabelBO>
    List<SubjectLabelBO> convertDTOToSubjectLabel(List<SubjectLabelDTO> subjectLabelDTOList);

    // 将List<SubjectLabelBO>转换为List<SubjectLabelDTO>
    List<SubjectLabelDTO> convertSubjectLabelToDto(List<SubjectLabelBO> subjectLabelBOList);
}

2.sun-club-domain
1.SubjectLabelBO.java
package com.sunxiansheng.subject.domain.entity;

import lombok.Data;

import java.io.Serializable;

/**
 * Description:
 * @Author sun
 * @Create 2024/5/25 17:10
 * @Version 1.0
 */
@Data
public class SubjectLabelBO implements Serializable {
    private static final long serialVersionUID = 965293549798069262L;
    /**
     * 主键
     */
    private Long id;

    /**
     * 标签分类
     */
    private String labelName;

    /**
     * 排序
     */
    private Integer sortNum;

    /**
     * 分类id
     */
    private String categoryId;
}

2.SubjectLabelConverter.java 编写基础转换器
package com.sunxiansheng.subject.domain.convert;

import com.sunxiansheng.subject.domain.entity.SubjectLabelBO;
import com.sunxiansheng.subject.infra.basic.entity.SubjectLabel;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

import java.util.List;

/**
 * Description: 题目标签转换器
 * @Author sun
 * @Create 2024/5/24 9:18
 * @Version 1.0
 */
@Mapper // mapstruct的注解
public interface SubjectLabelConverter {
    SubjectLabelConverter INSTANCE = Mappers.getMapper(SubjectLabelConverter.class);

    // 将SubjectLabelBO转换为SubjectLabel
    SubjectLabel convertBoToSubjectLabel(SubjectLabelBO subjectLabelBO);

    // 将SubjectLabel转换为SubjectLabelBO
    SubjectLabelBO convertSubjectLabelToBo(SubjectLabel subjectLabel);

    // 将List<SubjectLabel>转换为List<SubjectLabelBO>
    List<SubjectLabelBO> convertSubjectLabelToBo(List<SubjectLabel> subjectLabelList);

    // 将List<SubjectLabelBO>转换为List<SubjectLabel>
    List<SubjectLabel> convertBoToSubjectLabel(List<SubjectLabelBO> subjectLabelBOList);

}

3.sun-club-domain
1.service
1.SubjectLabelDomainService.java 先编写一个新增标签的接口
package com.sunxiansheng.subject.domain.service;

import com.sunxiansheng.subject.domain.entity.SubjectLabelBO;

/**
 * Description: 题目标签领域服务
 * @Author sun
 * @Create 2024/5/24 9:03
 * @Version 1.0
 */
public interface SubjectLabelDomainService {

    // 新增标签
    Boolean add(SubjectLabelBO subjectLabelBO);
}

4.sun-club-application-controller
1.SubjectLabelController.java
package com.sunxiansheng.subject.application.controller;

import com.alibaba.fastjson.JSON;
import com.google.common.base.Preconditions;
import com.sunxiansheng.subject.application.convert.SubjectCategoryDTOConverter;
import com.sunxiansheng.subject.application.convert.SubjectLabelDTOConverter;
import com.sunxiansheng.subject.application.dto.SubjectCategoryDTO;
import com.sunxiansheng.subject.application.dto.SubjectLabelDTO;
import com.sunxiansheng.subject.common.eneity.Result;
import com.sunxiansheng.subject.domain.entity.SubjectCategoryBO;
import com.sunxiansheng.subject.domain.entity.SubjectLabelBO;
import com.sunxiansheng.subject.domain.service.SubjectLabelDomainService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * Description: 题目标签controller
 * @Author sun
 * @Create 2024/5/25 16:54
 * @Version 1.0
 */
@RestController
@RequestMapping("/subject/label")
@Slf4j
public class SubjectLabelController {
    @Resource
    private SubjectLabelDomainService subjectLabelDomainService;

    @PostMapping("/add")
    public Result<Boolean> add(@RequestBody SubjectLabelDTO subjectLabelDTO) {
        try {
            // 打印日志
            if (log.isInfoEnabled()) {
                log.info("SubjectLabelController add SubjectLabelDTO, subjectLabelDTO:{}", JSON.toJSONString(subjectLabelDTO));
            }
            // 参数校验
            Preconditions.checkArgument(!StringUtils.isBlank(subjectLabelDTO.getLabelName()), "标签名称不能为空");
            // 转换DTO为BO
            SubjectLabelBO subjectLabelBO = SubjectLabelDTOConverter.INSTANCE.convertDTOToSubjectLabel(subjectLabelDTO);
            // 调用领域服务
            Boolean result = subjectLabelDomainService.add(subjectLabelBO);
            return Result.ok(result);
        } catch (Exception e) {
            log.error("SubjectLabelController add error:{}", e.getMessage(), e);
            return Result.fail("新增标签失败");
        }
    }
}

5.sun-club-domain
1.SubjectLabelDomainServiceImpl.java
package com.sunxiansheng.subject.domain.service.impl;

import com.alibaba.fastjson.JSON;
import com.sunxiansheng.subject.common.enums.IsDeleteFlagEnum;
import com.sunxiansheng.subject.domain.convert.SubjectLabelConverter;
import com.sunxiansheng.subject.domain.entity.SubjectLabelBO;
import com.sunxiansheng.subject.domain.service.SubjectLabelDomainService;
import com.sunxiansheng.subject.infra.basic.entity.SubjectLabel;
import com.sunxiansheng.subject.infra.basic.service.SubjectLabelService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * Description:
 * @Author sun
 * @Create 2024/5/24 9:03
 * @Version 1.0
 */
@Service
@Slf4j
public class SubjectLabelDomainServiceImpl implements SubjectLabelDomainService {
    @Resource
    private SubjectLabelService subjectLabelService;

    @Override
    public Boolean add(SubjectLabelBO subjectLabelBO) {
        // 打印日志
        if (log.isInfoEnabled()) {
            log.info("SubjectLabelDomainServiceImpl add SubjectLabelBO, SubjectLabelBO:{}", JSON.toJSONString(subjectLabelBO));
        }
        // 将BO转换为SubjectLabel
        SubjectLabel subjectLabel = SubjectLabelConverter.INSTANCE.convertBoToSubjectLabel(subjectLabelBO);
        // 设置逻辑删除
        subjectLabel.setIsDeleted(IsDeleteFlagEnum.UN_DELETED.getCode());
        // 插入数据
        int insert = subjectLabelService.insert(subjectLabel);
        return insert > 0;
    }
}

6.sun-club-infra
1.SubjectLabelService.java
    /**
     * 新增数据
     *
     * @param subjectLabel 实例对象
     * @return 实例对象
     */
    int insert(SubjectLabel subjectLabel);
2.SubjectLabelServiceImpl.java
    /**
     * 新增数据
     *
     * @param subjectLabel 实例对象
     * @return 实例对象
     */
    @Override
    public int insert(SubjectLabel subjectLabel) {
        return this.subjectLabelDao.insert(subjectLabel);
    }

3.更新标签接口

1.基本设计

image-20240526133343998

2.sun-club-application-controller
1.SubjectLabelController.java
/**
 * 更新标签
 * @param subjectLabelDTO
 * @return
 */
@PostMapping("/update")
public Result<Boolean> update(@RequestBody SubjectLabelDTO subjectLabelDTO) {
    try {
        // 打印日志
        if (log.isInfoEnabled()) {
            log.info("SubjectLabelController update SubjectLabelDTO, subjectLabelDTO:{}", JSON.toJSONString(subjectLabelDTO));
        }
        // 参数校验
        Preconditions.checkNotNull(subjectLabelDTO.getId(), "标签id不能为空");
        // 转换DTO为BO
        SubjectLabelBO subjectLabelBO = SubjectLabelDTOConverter.INSTANCE.convertDTOToSubjectLabel(subjectLabelDTO);
        // 调用领域服务
        Boolean result = subjectLabelDomainService.update(subjectLabelBO);
        return Result.ok(result);
    } catch (Exception e) {
        log.error("SubjectLabelController update error:{}", e.getMessage(), e);
        return Result.fail("更新标签失败");
    }
}
3.sun-club-domain
1.SubjectLabelDomainService.java
    /**
     * 更新标签
     * @param subjectLabelBO
     * @return
     */
    Boolean update(SubjectLabelBO subjectLabelBO);
2.SubjectLabelDomainServiceImpl.java
@Override
public Boolean update(SubjectLabelBO subjectLabelBO) {
    // 打印日志
    if (log.isInfoEnabled()) {
        log.info("SubjectLabelDomainServiceImpl update SubjectLabelBO, SubjectLabelBO:{}", JSON.toJSONString(subjectLabelBO));
    }
    // 将BO转换为SubjectLabel
    SubjectLabel subjectLabel = SubjectLabelConverter.INSTANCE.convertBoToSubjectLabel(subjectLabelBO);
    // 更新数据
    int update = subjectLabelService.update(subjectLabel);
    return update > 0;
}
4.sun-club-infra
1.SubjectLabelService.java
    /**
     * 修改数据
     *
     * @param subjectLabel 实例对象
     * @return 实例对象
     */
    int update(SubjectLabel subjectLabel);
2.SubjectLabelServiceImpl.java
    /**
     * 修改数据
     *
     * @param subjectLabel 实例对象
     * @return 实例对象
     */
    @Override
    public int update(SubjectLabel subjectLabel) {
        return this.subjectLabelDao.update(subjectLabel);
    }

4.删除标签接口

1.基本设计

image-20240526135339866

2.sun-club-application-controller
1.SubjectLabelController.java
    /**
     * 删除标签
     * @param subjectLabelDTO
     * @return
     */
    @PostMapping("/delete")
    public Result<Boolean> delete(@RequestBody SubjectLabelDTO subjectLabelDTO) {
        try {
            // 打印日志
            if (log.isInfoEnabled()) {
                log.info("SubjectLabelController delete SubjectLabelDTO, subjectLabelDTO:{}", JSON.toJSONString(subjectLabelDTO));
            }
            // 参数校验
            Preconditions.checkNotNull(subjectLabelDTO.getId(), "标签id不能为空");
            // 转换DTO为BO
            SubjectLabelBO subjectLabelBO = SubjectLabelDTOConverter.INSTANCE.convertDTOToSubjectLabel(subjectLabelDTO);
            // 调用领域服务
            Boolean result = subjectLabelDomainService.delete(subjectLabelBO);
            return Result.ok(result);
        } catch (Exception e) {
            log.error("SubjectLabelController delete error:{}", e.getMessage(), e);
            return Result.fail("删除标签失败");
        }
    }
3.sun-club-domain
1.SubjectLabelDomainService.java
/**
 * 删除标签
 * @param subjectLabelBO
 * @return
 */
Boolean delete(SubjectLabelBO subjectLabelBO);
2.SubjectLabelDomainServiceImpl.java
    @Override
    public Boolean delete(SubjectLabelBO subjectLabelBO) {
        // 打印日志
        if (log.isInfoEnabled()) {
            log.info("SubjectLabelDomainServiceImpl delete SubjectLabelBO, SubjectLabelBO:{}", JSON.toJSONString(subjectLabelBO));
        }
        // 将BO转换为SubjectLabel
        SubjectLabel subjectLabel = SubjectLabelConverter.INSTANCE.convertBoToSubjectLabel(subjectLabelBO);
        // 设置逻辑删除
        subjectLabel.setIsDeleted(IsDeleteFlagEnum.DELETED.getCode());
        // 更新数据
        int delete = subjectLabelService.update(subjectLabel);
        return delete > 0;
    }

5.根据分类查询标签

1.生成subject_mapping表的CRUD
1.生成代码

image-20240526140504420

2.修改生成的SubjectMappingDao.java的位置为mapper下

image-20240526140852585

3.实体类SubjectMapping.java使用lombok简化

image-20240526141026599

4.SubjectMappingDao.java删除Pageable

image-20240526141106478

5.SubjectMappingService.java删除分页查询接口

image-20240526141212064

6.SubjectMappingServiceImpl.java删除分页查询实现类
7.SubjectMappingService.java把新增和修改的返回值改为int,只返回影响的记录条数

image-20240526141622512

8.SubjectMappingServiceImpl.java也对新增和修改的实现类做相应调整

image-20240526141754714

2.SubjectLabelController.java
    /**
     * 查询分类下的标签
     * @param subjectLabelDTO
     * @return
     */
    @PostMapping("/queryLabelByCategoryId")
    public Result<List<SubjectLabelDTO>> queryLabelByCategoryId(@RequestBody SubjectLabelDTO subjectLabelDTO) {
        try {
            // 打印日志
            if (log.isInfoEnabled()) {
                log.info("SubjectLabelController queryLabelByCategoryId SubjectLabelDTO, subjectLabelDTO:{}", JSON.toJSONString(subjectLabelDTO));
            }
            // 参数校验
            Preconditions.checkNotNull(subjectLabelDTO.getCategoryId(), "分类id不能为空");
            // 转换DTO为BO
            SubjectLabelBO subjectLabelBO = SubjectLabelDTOConverter.INSTANCE.convertDTOToSubjectLabel(subjectLabelDTO);
            // 调用领域服务
            List<SubjectLabelBO> subjectLabelBOList =  subjectLabelDomainService.queryLabelByCategoryId(subjectLabelBO);
            // 将BO转换为DTO
            List<SubjectLabelDTO> subjectLabelDTOList = SubjectLabelDTOConverter.INSTANCE.convertSubjectLabelToDto(subjectLabelBOList);
            return Result.ok(subjectLabelDTOList);
        } catch (Exception e) {
            log.error("SubjectLabelController queryLabelByCategoryId error:{}", e.getMessage(), e);
            return Result.fail("查询分类下的标签失败");
        }
    }
3.sun-club-domain
1.SubjectLabelDomainService.java
/**
 * 查询分类下标签
 * @param subjectLabelBO
 * @return
 */
List<SubjectLabelBO> queryLabelByCategoryId(SubjectLabelBO subjectLabelBO);
2.SubjectLabelDomainServiceImpl.java
    @Override
    public List<SubjectLabelBO> queryLabelByCategoryId(SubjectLabelBO subjectLabelBO) {
        // 打印日志
        if (log.isInfoEnabled()) {
            log.info("SubjectLabelDomainServiceImpl queryLabelByCategoryId SubjectLabelBO, SubjectLabelBO:{}", JSON.toJSONString(subjectLabelBO));
        }
        // 获取分类id
        String categoryId = subjectLabelBO.getCategoryId();
        SubjectMapping subjectMapping = new SubjectMapping();
        // 设置分类id
        subjectMapping.setCategoryId(Long.parseLong(categoryId));
        // 设置逻辑删除
        subjectMapping.setIsDeleted(IsDeleteFlagEnum.UN_DELETED.getCode());
        // 查询所有分类id对应的标签id
        List<SubjectMapping> mappingList = subjectMappingService.queryLabelId(subjectMapping);
        // 判断是否为空
        if (CollectionUtils.isEmpty(mappingList)) {
            return Collections.emptyList();
        }
        // 获取标签id
        List<Long> labelIds = mappingList.stream().map(SubjectMapping::getLabelId).collect(Collectors.toList());
        // 对标签表进行批量查询
        List<SubjectLabel> subjectLabels = subjectLabelService.batchQueryById(labelIds);
        // 将SubjectLabel转换为BO
        List<SubjectLabelBO> collect = subjectLabels.stream().map(
                subjectLabel -> {
                    // 创建一个SubjectLabelBO对象,用于存储转换后的数据
                    SubjectLabelBO subjectLabelBO1 = new SubjectLabelBO();
                    subjectLabelBO1.setId(subjectLabel.getId());
                    subjectLabelBO1.setLabelName(subjectLabel.getLabelName());
                    subjectLabelBO1.setSortNum(subjectLabel.getSortNum());
                    subjectLabelBO1.setCategoryId(subjectLabel.getCategoryId().toString());
                    return subjectLabelBO1;
                }
        ).collect(Collectors.toList());
        return collect;
    }
4.sun-club-infra
1.service
1.SubjectMappingService.java
    /**
     * 查询标签id
     * @param subjectMapping
     * @return
     */
    List<SubjectMapping> queryLabelId(SubjectMapping subjectMapping);
2.SubjectLabelService.java
    /**
     * 批量查询标签
     * @param labelIds
     * @return
     */
    List<SubjectLabel> batchQueryById(List<Long> labelIds);
3.SubjectMappingServiceImpl.java
    /**
     * 查询标签id
     * @param subjectMapping
     * @return
     */
    @Override
    public List<SubjectMapping> queryLabelId(SubjectMapping subjectMapping) {
        return this.subjectMappingDao.queryDistinctLabelId(subjectMapping);
    }
4.SubjectLabelServiceImpl.java
    /**
     * 批量查询标签
     * @param labelIdList
     * @return
     */
    @Override
    public List<SubjectLabel> batchQueryById(List<Long> labelIdList) {
        if (!CollectionUtils.isEmpty(labelIdList)) {
            return Collections.emptyList();
        }
        return subjectLabelDao.batchQueryById(labelIdList);
    }
2.mapper
1.SubjectMappingDao.java
    /**
     * 查询标签id
     * @param subjectMapping
     * @return
     */
    List<SubjectMapping> queryDistinctLabelId(SubjectMapping subjectMapping);
2.SubjectLabelDao.java
    /**
     * 批量查询标签
     * @param labelIdList
     * @return
     */
    List<SubjectLabel> batchQueryById(List<Long> labelIdList);
3.SubjectMappingDao.xml
    <!--根据分类的id查询不重复的所有标签id-->
    <select id="queryDistinctLabelId" resultMap="SubjectMappingMap">
        select distinct label_id
        from subject_mapping
        <where>
            <if test="id != null">
                and id = #{id, INTEGER}
            </if>
            <if test="subjectId != null">
                and subject_id = #{subjectId, INTEGER}
            </if>
            <if test="categoryId != null">
                and category_id = #{categoryId, INTEGER}
            </if>
            <if test="labelId != null">
                and label_id = #{labelId, INTEGER}
            </if>
            <if test="createdBy != null and createdBy != ''">
                and created_by = #{createdBy, VARCHAR}
            </if>
            <if test="createdTime != null">
                and created_time = #{createdTime, TIMESTAMP}
            </if>
            <if test="updateBy != null and updateBy != ''">
                and update_by = #{updateBy, VARCHAR}
            </if>
            <if test="updateTime != null">
                and update_time = #{updateTime, TIMESTAMP}
            </if>
            <if test="isDeleted != null">
                and is_deleted = #{isDeleted, INTEGER}
            </if>
        </where>
    </select>
4.SubjectLabelDao.xml
    <!--根据标签id批量查询所有记录-->
    <select id="batchQueryById" resultMap="SubjectLabelMap">
        select id, label_name, sort_num, category_id, created_by, created_time, update_by, update_time, is_deleted
        from subject_label
        where id in
        <foreach collection="labelIdList" item="id" open="(" separator="," close=")">
            #{id}
        </foreach>
    </select>

6.标签接口总体测试

1.新增标签接口

image-20240526161951349

image-20240526161957036

2.更新标签接口

image-20240526162107145

image-20240526162234821

3.删除标签接口

image-20240526162147401

image-20240526162225511

4.根据分类查询标签
1.报错Parsing error was found in mapping #{categoryId, INTEGER}. Check syntax #{property|(expression), var1=value1, var2=value2, …}

image-20240526163841120

2.将SubjectMappingDao.xml里面指定类型时加上jdbcType属性即可

image-20240526164511773

3.再次请求,发现根据id批量查询的时候判断空的条件错了,将!去掉

image-20240526164627922

4.再次请求发现xml中的labelIdList参数没找到,原因是没有加@Param注解

image-20240526164944888

image-20240526165056361

5.再次请求,成功查找到信息

image-20240526165220356

6.但是,在根据labelId进行批量查询的时候没有考虑逻辑删除,会将数据都查出来

image-20240526165651472

image-20240526165700075

7.在SubjectLabelDao.xml的批量查询时加个条件即可

image-20240526165853803

image-20240526165954108

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1866179.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

11-Django项目--Ajax请求二

目录 模版: demo_list.html perform_list.html 数据库操作: 路由: 视图函数: Ajax_data.py perform.py 模版: demo_list.html {% extends "index/index.html" %} {% load static %} # 未实现修改,删除操作{% block content %}<div class"container…

nacos在k8s上的集群安装实践

目录 概述实践nfs安装使用 k8s持久化nacos安装创建角色部署数据库执行数据库初始化语句部署nacos ingress效果展示 结束 概述 本文主要对 nacos 在k8s上的集群安装 进行说明与实践。主要版本信息&#xff0c;k8s: 1.27.x&#xff0c;nacos: 2.0.3。运行环境为 centos 7.x。 实…

江协科技51单片机学习- p19 串口通信

前言&#xff1a; 本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记&#xff0c;在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技51单片机教学视频和链接中的内容。 引用&#xff1a; 51单片机入门教程-2…

力扣:59. 螺旋矩阵 II(Java,模拟)

目录 题目描述示例 1&#xff1a;代码实现 题目描述 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5…

node mySql 实现数据的导入导出,以及导入批量插入的sql语句

node 实现导出, 在导出excel中包含图片&#xff08;附件&#xff09; node 实现导出, 在导出excel中包含图片&#xff08;附件&#xff09;-CSDN博客https://blog.csdn.net/snows_l/article/details/139999392?spm1001.2014.3001.5502 一、效果 如图&#xff1a; 二、导入 …

此消彼长之间,国货品牌如何“进化”?

2024年&#xff0c;国内运动鞋服行业各品牌的股价集体回暖。年初至今&#xff08;1月2日至6月26日&#xff09;&#xff0c;港股的四大运动品牌中&#xff0c;361度涨幅达30.55%&#xff0c;特步上涨19.1%&#xff0c;安踏上涨7.75%&#xff0c;而李宁与美股市场的耐克组成了“…

【ARM】内存属性Memory Attributes (MemAttr)

目录 1. EWA 2. Device 3. Cacheable 4. Allocate 5. 内存属性的传播 6. 事务属性组合 7. Memory Type 内存属性Memory Attributes (MemAttr) 包含Early Write Acknowledgment (EWA), Device, Cacheable, 以及Allocate。 1. EWA EWA&#xff0c;Early Write Acknowledg…

Java进阶-Lambda

Java进阶-Lambda 前言Lambda表达式什么是Lambda表达式初识Lambda表达式Lambda表达式的简单使用Lambda表达式格式分析与传统接口方法实现的比较 理解Lambda表达式函数式编程非纯函数实例纯函数示例函数式编程在Lambda表达式中的体现 闭包闭包与Lambda表达式的示例 类型推导-匿名…

裸机与操做系统区别(RTOS)

声明&#xff1a;该系列笔记是参考韦东山老师的视频&#xff0c;链接放在最后&#xff01;&#xff01;&#xff01; rtos&#xff1a;这种系统只实现了内核功能&#xff0c;比较简单&#xff0c;在嵌入式开发中&#xff0c;某些情况下我们只需要多任务&#xff0c;而不需要文件…

【插件】IDEA这款插件Key Promoter X,爱到无法自拔

文章目录 为什么选择Key Promoter X&#xff1f;1. 提升开发效率2. 友好的学习曲线3. 可定制性强 安装和配置Key Promoter X1. 安装插件2. 配置插件 使用Key Promoter X个人使用体验1. 快捷键记忆2. 定制化功能3. 整体体验提升 总结 &#x1f389;欢迎来到Java学习路线专栏~探索…

Excel中的“点选输入”——次级下拉列表创建

在Excel中&#xff0c;用“数据验证”功能可以设置下拉列表&#xff0c;二级下拉列表需要设置公式。 (笔记模板由python脚本于2024年06月16日 18:36:37创建&#xff0c;本篇笔记适合经常使用Excel处理数据的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;http…

iOS 实现类似抖音滚动效果

效果图 思路 整体上我们使用tableView实现&#xff0c;为了预留内容的缓冲&#xff0c;我们将tableView 的contentinset设置为上面一个屏幕的高度&#xff0c;下面一个屏幕的高度&#xff0c;左右为0&#xff0c;这样保证我们滚动过去的时候 都是准备好的内容 然后就是滑动效果…

创新与责任并重!中国星坤连接器的可持续发展战略!

在当今全球化的商业环境中&#xff0c;企业的社会责任、技术创新和产品质量是企业可持续发展的三大支柱。中国星坤正是这样一家企业&#xff0c;它在电子连接技术领域以其卓越的技术创新、坚定的环保责任和严格的生产品控而著称。本文将深入探讨星坤科技如何通过其FAE技术团队的…

2024年6月29日(星期六)骑行十里箐

2024年6月29日 (星期六&#xff09;骑行十里箐&#xff0c;早8:00到8:30&#xff0c;大观公园门口集合&#xff0c;9:00准时出发【因迟到者&#xff0c;骑行速度快者&#xff0c;可自行追赶偶遇。】 偶遇地点:大观公园门口集合 &#xff0c;家住东&#xff0c;南&#xff0c;北…

使用PEFT库进行ChatGLM3-6B模型的LORA高效微调

PEFT库进行ChatGLM3-6B模型LORA高效微调 LORA微调ChatGLM3-6B模型安装相关库使用ChatGLM3-6B模型GPU显存占用准备数据集加载模型加载数据集数据处理数据集处理配置LoRA配置训练超参数开始训练保存LoRA模型模型推理从新加载合并模型使用微调后的模型 LORA微调ChatGLM3-6B模型 本…

前端:Element UI 与 Vuetify 的选择

vuetify优势 1、多端适配&#xff0c;Vuetify完全按照Material设计规范进行开发&#xff0c;每一个组件都经过精心设计&#xff0c;具有模块化、响应式和优秀的性能。 使用独特和动态的 布局 自定义您的应用程序&#xff0c;并使用 SASS 变量 自定义您的组件的样式。只需要做下…

私有化部署ChatGPT:潜力与挑战

背景 以ChatGPT为代表的大语言模型服务在2023年初开始大规模爆发&#xff0c;AI技术从来没有如此接近普通民众。随着以Microsoft&#xff0c; Google&#xff0c; Meta &#xff08;Facebook&#xff09;为代表的科技巨头在AI技术领域相继发布重量级产品和服务&#xff0c;国内…

仓库管理系统12--物资设置供应商设置

1、添加供应商窗体 2、布局控件UI <UserControl x:Class"West.StoreMgr.View.SupplierView"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc"http://…

业绩尚可但股价不振,浙商银行陆建强闯“3元大关”

&#xff08;题图&#xff09; 文&#xff5c;新熔财经 作者&#xff5c;宏一 本来做着钱生钱的“美梦”&#xff0c;现在倒好&#xff0c;本金都不一定拿得回来。 因为不想把“鸡蛋都放在一个笼子里”&#xff0c;所以前几年在理财的时候一部分放在银行定存&#xff0c;一…

利用 Swifter 加速 Pandas 操作的详细教程

利用 Swifter 加速 Pandas 操作的详细教程 引言 Pandas 是数据分析中常用的库&#xff0c;但在处理大型数据集时效率可能会较低。Swifter 提供了一种简便的方法&#xff0c;通过并行处理来显著加速 Pandas 操作。 Swifter 简介 Swifter 是一个开源库&#xff0c;旨在自动优…