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

文章目录

    • 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}*/#endprivate $!{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.namewhere $!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转换为SubjectLabelBOSubjectLabelBO convertDTOToSubjectLabel(SubjectLabelDTO subjectLabelDTO);// 将SubjectLabelBO转换为SubjectLabelDTOSubjectLabelDTO 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转换为SubjectLabelSubjectLabel convertBoToSubjectLabel(SubjectLabelBO subjectLabelBO);// 将SubjectLabel转换为SubjectLabelBOSubjectLabelBO 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 {@Resourceprivate 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为BOSubjectLabelBO 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 {@Resourceprivate SubjectLabelService subjectLabelService;@Overridepublic Boolean add(SubjectLabelBO subjectLabelBO) {// 打印日志if (log.isInfoEnabled()) {log.info("SubjectLabelDomainServiceImpl add SubjectLabelBO, SubjectLabelBO:{}", JSON.toJSONString(subjectLabelBO));}// 将BO转换为SubjectLabelSubjectLabel 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 实例对象*/@Overridepublic 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为BOSubjectLabelBO 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转换为SubjectLabelSubjectLabel 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 实例对象*/@Overridepublic 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为BOSubjectLabelBO 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
    @Overridepublic Boolean delete(SubjectLabelBO subjectLabelBO) {// 打印日志if (log.isInfoEnabled()) {log.info("SubjectLabelDomainServiceImpl delete SubjectLabelBO, SubjectLabelBO:{}", JSON.toJSONString(subjectLabelBO));}// 将BO转换为SubjectLabelSubjectLabel 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为BOSubjectLabelBO subjectLabelBO = SubjectLabelDTOConverter.INSTANCE.convertDTOToSubjectLabel(subjectLabelDTO);// 调用领域服务List<SubjectLabelBO> subjectLabelBOList =  subjectLabelDomainService.queryLabelByCategoryId(subjectLabelBO);// 将BO转换为DTOList<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
    @Overridepublic List<SubjectLabelBO> queryLabelByCategoryId(SubjectLabelBO subjectLabelBO) {// 打印日志if (log.isInfoEnabled()) {log.info("SubjectLabelDomainServiceImpl queryLabelByCategoryId SubjectLabelBO, SubjectLabelBO:{}", JSON.toJSONString(subjectLabelBO));}// 获取分类idString categoryId = subjectLabelBO.getCategoryId();SubjectMapping subjectMapping = new SubjectMapping();// 设置分类idsubjectMapping.setCategoryId(Long.parseLong(categoryId));// 设置逻辑删除subjectMapping.setIsDeleted(IsDeleteFlagEnum.UN_DELETED.getCode());// 查询所有分类id对应的标签idList<SubjectMapping> mappingList = subjectMappingService.queryLabelId(subjectMapping);// 判断是否为空if (CollectionUtils.isEmpty(mappingList)) {return Collections.emptyList();}// 获取标签idList<Long> labelIds = mappingList.stream().map(SubjectMapping::getLabelId).collect(Collectors.toList());// 对标签表进行批量查询List<SubjectLabel> subjectLabels = subjectLabelService.batchQueryById(labelIds);// 将SubjectLabel转换为BOList<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*/@Overridepublic List<SubjectMapping> queryLabelId(SubjectMapping subjectMapping) {return this.subjectMappingDao.queryDistinctLabelId(subjectMapping);}
4.SubjectLabelServiceImpl.java
    /*** 批量查询标签* @param labelIdList* @return*/@Overridepublic 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_idfrom 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_deletedfrom subject_labelwhere 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.mzph.cn/news/861411.shtml

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

相关文章

【RedHat】使用VMware Workstation创建配置RedHat操作系统

目录 &#x1f31e;1.前言 &#x1f31e;2. 使用 VMware Workstation 创建配置RedHat &#x1f33c;2.1 VMware Workstation 创建虚拟机 &#x1f33c;2.2 安装RedHat 7.6 &#x1f30a;2.2.1 添加光盘 &#x1f30a;2.2.2 开始安装操作系统 &#x1f30a;2.2.3 系统初始…

从基础到前沿:PLM产品生命周期管理系统在物料管理中的应用

在当今竞争激烈的市场中&#xff0c;制造型企业必须不断寻求提高效率和降低成本的方法。物料管理作为企业内部物流的核心环节&#xff0c;对于控制成本、提高生产效率、加快产品上市时间具有至关重要的作用。本文将探讨物料管理的重要性&#xff0c;以及如何通过三品产品生命周…

Python数据可视化-地图可视化

1.首先绘制实现数据可视化的思维导图 具体要实现什么功能-怎么处理&#xff0c;先把思路写好 数据来源&#xff1a; 爬取的数据 运行结果&#xff1a; 部分代码&#xff1a; 完整代码请在下方↓↓↓&#x1f447;获取 转载请注明出处&#xff01;

75101A 1553B总线测试模块

75101A 1553B总线测试模块 75101A 1553B总线测试模块是单通道多功能&#xff0c;符合CPCI/PXI总线的标准3U尺寸模块&#xff0c;可同时用作BC、RTs和BM&#xff0c;其中BM具有比特误码、highbit、lowbit、highword、lowword、校验错误、消息错误检测以及最大256M字节的数据捕…

新能源革命风起云涌:创新科技引领可持续发展新篇章

随着全球气候变化和环境问题日益严峻&#xff0c;新能源革命正以其不可阻挡的势头&#xff0c;席卷着世界的每一个角落。 创新科技在这场革命中发挥着至关重要的作用&#xff0c;它不仅是新能源开发利用的引擎&#xff0c;更是推动可持续发展的关键力量。 新能源革命的核心在于…

ubuntu如何切换到root用户

1、主要指令&#xff1a; sudo -i su root 2、示例 3、其他说明 在Ubuntu&#xff08;以及大多数其他基于Linux的操作系统中&#xff09;&#xff0c;切换到root用户通常意味着获得了对系统的完全访问权限。这种权限允许执行以下操作&#xff08;但不限于这些&#xff09;…

Spring AI 实现调用openAi 多模态大模型

什么是多模态? 多模态(Multimodal)指的是数据或信息的多种表现形式。在人工智能领域,我们经常会听到这个词,尤其是在近期大型模型(如GPT-4)开始支持多模态之后。 模态:模态是指数据的一种形式,例如文本、图像、音频等。每一种形式都是一种模态。多模态:多模态就是将…

ctfshow 新春欢乐赛 web

web1 <?phphighlight_file(__FILE__); error_reporting(0);$content $_GET[content]; file_put_contents($content,<?php exit();.$content);?contentphp://filter/string.rot13|<?cuc flfgrz(yf /);?>|/resourceshell.php绕过死亡exit 但是我发现个问题就是…

Fragment与ViewModel(MVVM架构)

简介 在Android应用开发中&#xff0c;Fragment和ViewModel是两个非常重要的概念&#xff0c;它们分别属于架构组件库的一部分&#xff0c;旨在帮助开发者构建更加模块化、健壮且易维护的应用。 Fragment Fragment是Android系统提供的一种可重用的UI组件&#xff0c;它能够作为…

基于51单片机密码锁—六位密码LCD1602显示

基于51单片机密码锁设计 &#xff08;仿真&#xff0b;程序&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.密码为六位数字&#xff0c;有键按下&#xff0c;LCD1602就会显示出字符 “*”&#xff1b; 2.当用户键入正确密码后&#xff0c;再按确认键&a…

是时候系统性的的学习那些开发中必备的软件了!

大家好&#xff0c;我是 王有志&#xff0c;一个分享硬核 Java 技术的金融摸鱼侠&#xff0c;欢迎大家加入 Java 人自己的交流群“共同富裕的 Java 人”。 最近小组内心来了两个实习生&#xff0c;各方面都很不错&#xff0c;基础知识扎实&#xff0c;勤奋好学&#xff08;卷&…

记一次 APK 逆向动静调试 + so 动态链接库分析

0x00 前言&#xff1a; 好久没有做过安卓逆向了&#xff0c;最近重新系统地学习了安卓逆向技术。找到了一道较为典型的逆向分析题来练手&#xff0c;以锻炼动静态分析和动态链接库分析的基本能力。在这里记录基本的分析流程手法。 0x01 逆向分析&#xff1a; 一、使用 Genym…

IPython最简洁方便的Python语法测试工具

前言和需求 相信不少人使用JS时&#xff0c;最常用的快捷键是F12。网页调试&#xff0c;不仅可以调试我们的前端页面&#xff0c;对于多数后端JS程序员来讲&#xff0c;我们有个啥语法不确定了&#xff0c;直接开个网页F12确认一下就行了。甚至写了个方法&#xff0c;不确定对…

springboot + Vue前后端项目(第十九记)

项目实战第十九记 写在前面1. redis安装(windows安装)1.1 获取软件链接地址&#xff1a;1.2 启动redis1.3 测试是否启动成功1.4 通过 Another Redis DeskTop软件可视化查看redis 2. SpringBoot集成redis2.1 引入依赖2.2 注入RedisTemplate2.3 使用redis2.4 redis更新2.5 redis使…

【自然语言处理系列】掌握jieba分词器:从基础到实战,深入文本分析与词云图展示

本文旨在全面介绍jieba分词器的功能与应用&#xff0c;从分词器的基本情况入手&#xff0c;逐步解析全模式与精确模式的不同应用场景。文章进一步指导读者如何通过添加自定义词典优化分词效果&#xff0c;以及如何利用jieba分词器进行关键词抽取和词性标注&#xff0c;为后续的…

美创携手浙江长征职业技术学院,共建智云数据安全大师工作室

6月24日&#xff0c;“美创科技浙江长征职业技术学院智云数据安全大师工作室揭牌暨中国特色学徒制第四期云数据安全和智能运维人才选拔培养启动仪式”在长征职业技术学院隆重举行。 浙江长征职业技术学院计算机与信息技术学院院长梅灿华、计算机与信息技术学院学工办副主任华春…

使用 frida hook Android app

Frida&#xff1a; 一种基于动态插装&#xff08;dynamic instrumentation&#xff09;技术的工具包&#xff0c;它主要是为测试人员、开发人员和逆向工程爱好者创建&#xff0c;在目标程序运行时&#xff0c;允许用户将 JavaScript代码注入其中&#xff0c;实现动态修改和调试…

ONLYOFFICE8.1版本桌面编辑器的测评

首先我们先出示一下我们所测评官网的链接&#xff1a; ONLYOFFICE官网链接&#xff1a;ONLYOFFICE - 企业在线办公应用软件 | ONLYOFFICE 我们这款ONLYOFFICE8.1版本有这一下优点 1.解决PDF痛点 ONLYOFFICE在PDF编辑方面支持高亮显示、下划线和删除线、添加批注等功能&#…

【2024最新版】Eclipse安装配置全攻略:图文详解

目录 1. Eclipse介绍1.1 背景1.2 主要特点和功能1.3 版本发布1.4 优势与劣势 2. 下载Eclipse3. 安装Eclipse4. 启动Eclipse 1. Eclipse介绍 Eclipse是一个开源的、基于Java的可扩展开发平台&#xff0c;主要用于Java开发者&#xff0c;但也支持其他语言如C/C、PHP、Python等。…

【PWN · TcachebinAttack | UAF】[2024CISCN · 华中赛区] note

一道简单的tcache劫持 一、题目 二、思路 存在UAF&#xff0c;libc版本2.31&#xff0c;经典菜单题 1.通过unsorted-bin-attack来leak-libc 2.通过uaf打tcache-bin-attack劫持__free_hook实现getshell 三、EXP from pwn import * context(archamd64,log_leveldebug)ioproce…