目录
一:背景介绍
二:思路&方案
三:过程
1.Controller层接口的复用
2.Mapper层sql语句的复用
四:总结
一:背景介绍
我们在开发项目的过程中非常容易出现的一种现象就是用什么我就直接写什么,就像我们从数据库读或者存数据一样。我们想要什么数据就从数据库中获取什么样的数据。没有考虑是否浪费了资源的开销。代码是不是复用的问题。
以上两个图都是没有体现复用思想的例子。两个类似的业务场景写了两个接口、两个接口、两个实现类、两个sql,下面我们将上面的代码进行改造。
二:思路&方案
两个接口都是都是实现查询在线人员的情况,区别在去两个接口的入参不同。这里我们可以通过使用mybatis的动态SQL进行实现。
三:过程
1.Controller层接口的复用
Controller层
/*
* @description:查询课程内容
* @author: 武梓龙
* @date: 2023/3/7 16:00
* @param: [courseContent]
* @return: java.util.List<com.wangwei.mvc.entity.CourseContentEntity>
**/
@PostMapping("/queryCourseContent")
public List<CourseContentEntity> queryCourseContent(@RequestBody CourseContentEntity courseContent){
return iCourseContentService.queryCourseContent(courseContent);
}
IService层
public interface ICourseContentService {
List<CourseContentEntity> queryCourseContent(CourseContentEntity courseContent);
}
ServiceImpl层
/*
* @description:查询课程内容
* @author: 武梓龙
* @date: 2023/3/7 15:57
* @param: [courseContent]
* @return: java.util.List<com.wangwei.mvc.entity.CourseContentEntity>
**/
@Override
public List<CourseContentEntity> queryCourseContent(CourseContentEntity courseContent) {
return courseContentMapper.queryCourseContentRecord(courseContent);
}
Mapper层
List<CourseContentEntity> queryCourseContentRecord(CourseContentEntity courseContentEntity);
<!--通用查询语句-->
<select id="queryCourseContentRecord" resultMap="courseContentMap" >
SELECT id,course_assembly_id,assembly_content,create_time,created_id,created_by,update_time,updated_id,updated_by
FROM tar_course_content_info
WhERE
is_delete=0
<if test="id != null"> and id = #{id} </if>
<if test="courseAssemblyId != null">and course_assembly_id = #{courseAssemblyId}</if>
<if test="assemblyContent != null">and assembly_content = #{assemblyContent}</if>
<if test="createdBy != null">and created_by = #{createdBy}</if>
<if test="updatedBy != null">and updated_by = #{updatedBy}</if>
<if test="remark != null">and remark = #{remark}</if>
</select>
结果
2.Mapper层sql语句的复用
结果
通过编写通用sql我们对于用一个表的查询(其他的增删改也是可以的)就只需要一个sql语句就可以了,通过传入的参数不同,我们得到的结果也会不同。以下是同一个sql语句传入两个参数和传输三个参数的结果。
四:总结
面向对象的三个特征是封装继承和多态,封装的目的就是让我们的代码复用性强。便于后期的维护。所以在我们进行编码之前首先要考虑的就是我们写的代码有没有通用性和抽象性。是不是别人有类似的业务的时候能复用我们写的代码。让我们编写的代码更加的有价值。