知识点10--如何自定义书写数据业务逻辑代码
前八章知识点我们对数据的操作都是使用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--如何自定义书写数据业务逻辑代码相关推荐
- 在 CloudIDE 里实现天猫精灵自定义技能的业务逻辑
技能后端编码 技能的后端编码是天猫精灵自定义技能开发的重头戏.点击 代码编辑 面板,可以为该技能针对的业务接口实现,选择对应的服务部署方式. 在线开发模式同阿里云云原生开发即 FAAS,这两种方式均无 ...
- 【C 语言】字符串拷贝 ( 字符串拷贝业务逻辑代码 | 分离 主函数 与 字符串拷贝 业务模型 )
文章目录 一.字符串拷贝业务逻辑代码 二.分离 主函数 与 字符串拷贝 业务模型 一.字符串拷贝业务逻辑代码 下面的代码 , 是 字符串 拷贝 最简单的代码 , 仅 使用 指针 遍历内存 , 实现了字 ...
- 利用React 自定义Hooks实现业务逻辑复用实例
目录 简介 适用读者 请求数据的例子 需求 定义 States 加载 Posts 加载 Todos 展示数据 问题 用自定义 Hooks 改造 useRequest 加载 Posts 和 Todos ...
- FluentData-新型轻量级ORM 利用T4模板 批量生成多文件 实体和业务逻辑 代码
FluentData,它是一个轻量级框架,关注性能和易用性. 下载地址:FlunenData.Model 利用T4模板,[MultipleOutputHelper.ttinclude]批量生成多文件 ...
- SpringMVC--Ajax异步加载数据$(function (){ 逻辑代码}) 的意思是让dom结构加载完毕后再去执行逻辑代码
1. SpringMVC–Ajax异步加载数据 1.1 实体类user User.java package com.tian.pojo;import lombok.AllArgsConstructor ...
- SQL基础【十八、事物】(sql事物慎用,还是写业务逻辑代码好一些,入伙涉及到更换数据啥的很麻烦!)
1.了解事务和锁 事务:保持逻辑数据一致性与可恢复性,必不可少的利器. 锁:多用户访问同一数据库资源时,对访问的先后次序权限管理的一种机制,没有他事务或许将会一塌糊涂,不能保证数据的安全正确读写. 死 ...
- 表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)
三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL).区分层次的目的即为了"高内聚,低耦 ...
- android ui层 交互层 业务逻辑层 服务层,表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)...
三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL).区分层次的目的即为了"高内聚,低耦 ...
- 三层架构:表示层-业务逻辑层-数据访问层
三层架构和MVC是两个东西. 非要相关的话: 三层架构中"表现层"的aspx页面对应MVC中的View(继承的类不一样) 三层架构中"表现层"的aspx.cs页 ...
最新文章
- 文本输入框、密码输入框
- sysenter Hook
- TabLayout属性详解
- DirectX11 With Windows SDK--12 深度/模板状态、平面镜反射绘制
- 如何抓取一个网站的分页_如何设计一个吸引人的网站
- quartz监听器使用
- VS2010配置清单
- php多线程扩展pthreads安装使用,swoole多进程,内置多进程
- 【TWVRP】基于matlab粒子群算法求解带时间窗的车辆路径规划问题【含Matlab源码 334期】
- 给linux默认mysql设置root密码
- SEO内容构建流程,SEO内容建设策略有哪些?
- 苹果开发者App Store绑定连连跨境支付收款教程!
- while在c语言中的作用,while的用法_C语言中while的用法
- 如何将Nios II硬件和软件合成一个文件(NIOS II)烧进EPCS falsh
- ERROR Failed to send requests for topics
- Shell--如何定义及遍历数组、字符串数组【工作笔记】
- Java中 \n \f \r \t 含义
- Uncaught SyntaxError: missing ) after argument list 解决办法
- 付宇泽20190919-5 代码规范,结对要求
- 江西自考 计算机及应用,江西自考专科本科计算机抵免政策解读
热门文章
- 东北林大计算机科学与技术怎么样,东北林业大学信息与计算机工程学院
- vista系统下载镜像_在Vista中生成系统运行状况报告
- 中国最大油轮交货 排水量相当于7艘辽宁舰[图]
- 2021-10-26快速测温电子体温计方案开发
- 智能合约开发 Ganache | Truffle | Solidity | Web3.js
- Day267.预约系统的性能瓶颈、营销活动无缝切换秒杀活动、预约系统数据迁移方案、高流量下预约系统搭建熔断机制、预约系统redis集群主从哨兵架构 -Redis的高并发预约抢购系统
- 【C++游戏设计】 通过函数设置字体的颜色
- VueScan Pro for Mac(扫描仪软件)破解教程
- Redis中如何批量删除key
- PMP考试100个主要知识点