前八章知识点我们对数据的操作都是使用spring boot框架封装的API进行的查询操作,我在前边的知识点中也说了,后面会介绍如何自定义业务逻辑的查询,那本篇就完成这一目标。

首先我们要明白为何要自定义业务逻辑?spring boot虽然封装了相对的方法,但是它并不是一定能满足我们对数据操作的需求,甚至它封装的操作数据API不能作为主要手段,只能说是在开发中,作为辅助减少代码量而已,在原则上主要开发靠自定义,当然开发中遇到很小的需求,且封装的API能够满足,我们就使用API。

接下来言归正传,本篇知识点的目标是自定义业务逻辑,将查询列表功能优化,因为现在的代码,如下

/*** 出列表* @param request* @param current* @param size* @param user* @return*/
@RequestMapping("/list")
public String list(HttpServletRequest request, @RequestParam(defaultValue = "1") long current, @RequestParam(defaultValue = "3") long size, User user){//创建分页对象Page<User> page =new Page<>(current,size);//创建查询条件对象QueryWrapper<User> wrapper = new QueryWrapper<>();//spring boot将条件查询封装成了一个对象,可以使用if(user!=null){if(user.getName()!=null && !"".equals(user.getName().trim())){wrapper.like("name",user.getName());}if(user.getBrith()!=null){wrapper.eq("brith",user.getBrith());}}//执行分页查询IPage<User> pageInfo = userService.page(page, wrapper);//展示部门//当前页的记录数List<User> records = pageInfo.getRecords();//遍历当前页的记录数for(User entity:records){//判断外键是否为空if(entity.getDid()!=null){//根据id查询Dept dept = deptService.getById(entity.getDid());//设置部门名称entity.setDname(dept.getName());}}//单独存储总页数,最所以怎么做是因为现在市场上用的JDK和mybatis-plus版本有点不符合,总页数无法封装到前台request.setAttribute("pages",pageInfo.getPages());//存储到request中request.setAttribute("pageInfo",pageInfo);request.setAttribute("user",user);return "/user_list";
}

我们明眼就能看出来,这个代码是写的多垃圾多low,在展示部门的时候竟然是递归一个一个的查询,查询条件也是不合适的,现在来优化它。

第一步:编写Dao层

在UserMapper.xml文件中书写自己的sql语句,这里注意mapper文件中的标签和SSM时没啥大差别,尤其是取值任然是#号是占位符,$是拼接符

<?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.wy.scjg.mapper.UserMapper"><resultMap id="BaseResultMap" type="com.wy.scjg.bean.User"><id column="id" property="id" /><result column="name" property="name" /><result column="age" property="age" /><result column="email" property="email" /><result column="brith" property="brith" /><result column="did" property="did" /><result column="dname" property="dname" /></resultMap><select id="getUserList" resultMap="BaseResultMap" >select u.*,d.name dname from user u left join dept d on u.did=d.id<where><if test="user.name!=null">and u.name like concat('%',#{user.name},'%')</if><if test="user.brith!=null">and u.brith=#{user.brith}</if></where></select></mapper>

编写Dao层的时候注意,多表联查resultMap中最常用的两个标签对一association或者是对多collection,上面的代码一般是需要写一个association包裹对一的部门,但是为了方便我直接写在一起了。并且对多的时候一定要使用外部select如果写在一个sql里面,则数据查询会占分页的位置。

UserMapper接口开发

package com.wy.scjg.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wy.scjg.bean.User;public interface UserMapper extends BaseMapper<User> {/*** 获取列表* @param page* @param user* @return*/IPage<User> getUserList(Page page,User user);}

这里说一个重点,Dao层的分页查询方法,第一个参数固定的必须是page对象,其他的和SSM时没差别

第二步:service层开发

Service接口定义方法

package com.wy.scjg.service;import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.wy.scjg.bean.User;public interface UserService extends IService<User>{IPage<User> getUserList(Page page, User user);
}

实现类重写该方法

package com.wy.scjg.service.impl;import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wy.scjg.bean.User;
import com.wy.scjg.mapper.UserMapper;
import com.wy.scjg.service.UserService;
import org.springframework.stereotype.Service;/*** 实现类固定继承ServiceImpl类,目的是直接注入Dao层以及操作的实例类,并实现自定义的service接口*/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {@Overridepublic IPage<User> getUserList(Page page, User user) {return baseMapper.getUserList(page,user);}
}

这里说一个重点,baseMapper对象是框架提供的ServiceImpl提供的参数,它的类型就是继承时泛型的Mapper,除了直接调用baseMapper,你也可以调用getBaseMapper()方法,效果是一样的

第三步:在UserController中我们将多余的代码直接删掉,调用我们自定义的业务逻辑

/*** 出列表* @param request* @param current* @param size* @param user* @return*/
@RequestMapping("/list")
public String list(HttpServletRequest request, @RequestParam(defaultValue = "1") long current, @RequestParam(defaultValue = "3") long size, User user){//创建分页对象Page<User> page =new Page<>(current,size);//此处调用我们写的自定义代码IPage<User> pageInfo = userService.getUserList(page, user);//单独存储总页数,最所以怎么做是因为现在市场上用的JDK和mybatis-plus版本有点不符合,总页数无法封装到前台request.setAttribute("pages",pageInfo.getPages());//存储到request中request.setAttribute("pageInfo",pageInfo);//封装查询条件request.setAttribute("user",user);return "/user_list";
}

此时运行程序,就可以看到效果


到此本篇知识点讲解结束,此外 本次整体讲解的spring boot项目已上传github

知识点10--如何自定义书写数据业务逻辑代码相关推荐

  1. 在 CloudIDE 里实现天猫精灵自定义技能的业务逻辑

    技能后端编码 技能的后端编码是天猫精灵自定义技能开发的重头戏.点击 代码编辑 面板,可以为该技能针对的业务接口实现,选择对应的服务部署方式. 在线开发模式同阿里云云原生开发即 FAAS,这两种方式均无 ...

  2. 【C 语言】字符串拷贝 ( 字符串拷贝业务逻辑代码 | 分离 主函数 与 字符串拷贝 业务模型 )

    文章目录 一.字符串拷贝业务逻辑代码 二.分离 主函数 与 字符串拷贝 业务模型 一.字符串拷贝业务逻辑代码 下面的代码 , 是 字符串 拷贝 最简单的代码 , 仅 使用 指针 遍历内存 , 实现了字 ...

  3. 利用React 自定义Hooks实现业务逻辑复用实例

    目录 简介 适用读者 请求数据的例子 需求 定义 States 加载 Posts 加载 Todos 展示数据 问题 用自定义 Hooks 改造 useRequest 加载 Posts 和 Todos ...

  4. FluentData-新型轻量级ORM 利用T4模板 批量生成多文件 实体和业务逻辑 代码

    FluentData,它是一个轻量级框架,关注性能和易用性. 下载地址:FlunenData.Model 利用T4模板,[MultipleOutputHelper.ttinclude]批量生成多文件 ...

  5. SpringMVC--Ajax异步加载数据$(function (){ 逻辑代码}) 的意思是让dom结构加载完毕后再去执行逻辑代码

    1. SpringMVC–Ajax异步加载数据 1.1 实体类user User.java package com.tian.pojo;import lombok.AllArgsConstructor ...

  6. SQL基础【十八、事物】(sql事物慎用,还是写业务逻辑代码好一些,入伙涉及到更换数据啥的很麻烦!)

    1.了解事务和锁 事务:保持逻辑数据一致性与可恢复性,必不可少的利器. 锁:多用户访问同一数据库资源时,对访问的先后次序权限管理的一种机制,没有他事务或许将会一塌糊涂,不能保证数据的安全正确读写. 死 ...

  7. 表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)

    三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL).区分层次的目的即为了"高内聚,低耦 ...

  8. android ui层 交互层 业务逻辑层 服务层,表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)...

    三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL).区分层次的目的即为了"高内聚,低耦 ...

  9. 三层架构:表示层-业务逻辑层-数据访问层

    三层架构和MVC是两个东西. 非要相关的话: 三层架构中"表现层"的aspx页面对应MVC中的View(继承的类不一样) 三层架构中"表现层"的aspx.cs页 ...

最新文章

  1. 文本输入框、密码输入框
  2. sysenter Hook
  3. TabLayout属性详解
  4. DirectX11 With Windows SDK--12 深度/模板状态、平面镜反射绘制
  5. 如何抓取一个网站的分页_如何设计一个吸引人的网站
  6. quartz监听器使用
  7. VS2010配置清单
  8. php多线程扩展pthreads安装使用,swoole多进程,内置多进程
  9. 【TWVRP】基于matlab粒子群算法求解带时间窗的车辆路径规划问题【含Matlab源码 334期】
  10. 给linux默认mysql设置root密码
  11. SEO内容构建流程,SEO内容建设策略有哪些?
  12. 苹果开发者App Store绑定连连跨境支付收款教程!
  13. while在c语言中的作用,while的用法_C语言中while的用法
  14. 如何将Nios II硬件和软件合成一个文件(NIOS II)烧进EPCS falsh
  15. ERROR Failed to send requests for topics
  16. Shell--如何定义及遍历数组、字符串数组【工作笔记】
  17. Java中 \n \f \r \t 含义
  18. Uncaught SyntaxError: missing ) after argument list 解决办法
  19. 付宇泽20190919-5 代码规范,结对要求
  20. 江西自考 计算机及应用,江西自考专科本科计算机抵免政策解读

热门文章

  1. 东北林大计算机科学与技术怎么样,东北林业大学信息与计算机工程学院
  2. vista系统下载镜像_在Vista中生成系统运行状况报告
  3. 中国最大油轮交货 排水量相当于7艘辽宁舰[图]
  4. 2021-10-26快速测温电子体温计方案开发
  5. 智能合约开发 Ganache | Truffle | Solidity | Web3.js
  6. Day267.预约系统的性能瓶颈、营销活动无缝切换秒杀活动、预约系统数据迁移方案、高流量下预约系统搭建熔断机制、预约系统redis集群主从哨兵架构 -Redis的高并发预约抢购系统
  7. 【C++游戏设计】 通过函数设置字体的颜色
  8. VueScan Pro for Mac(扫描仪软件)破解教程
  9. Redis中如何批量删除key
  10. PMP考试100个主要知识点