Java Fluent Mybatis 项目工程化与常规操作详解流程篇 下
作者:剑客阿良_ALiang 发布时间:2021-07-19 11:33:11
标签:Java,Fluent,Mybatis,常规操作
前言
接着上一篇:Java Fluent Mybatis 项目工程化与常规操作详解流程篇 上
仓库地址:GitHub仓库
查询
定义查询请求体
package com.hy.fmp.dto.req;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/** @Author huyi @Date 2021/10/20 19:37 @Description: 查询条件 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class TestFluentMybatisQueryReq {
private String age;
private String name;
}
查询写法1
查询接口方法定义
/**
* 查询接口1
*
* @param queryReq 查询请求
* @return 列表
*/
List<TestFluentMybatisEntity> query1(TestFluentMybatisQueryReq queryReq);
方法实现,这里我们改用了mapper来实现一下官方给出的查询语法模式。
package com.hy.fmp.service.Impl;
import cn.hutool.core.util.StrUtil;
import com.hy.fmp.dto.req.TestFluentMybatisQueryReq;
import com.hy.fmp.fluent.dao.intf.TestFluentMybatisDao;
import com.hy.fmp.fluent.entity.TestFluentMybatisEntity;
import com.hy.fmp.fluent.helper.TestFluentMybatisMapping;
import com.hy.fmp.fluent.mapper.TestFluentMybatisMapper;
import com.hy.fmp.fluent.wrapper.TestFluentMybatisQuery;
import com.hy.fmp.service.IBaseService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
/** @Author huyi @Date 2021/10/20 17:10 @Description: 基础操作接口实现 */
@Slf4j
@Service
public class BaseServiceImpl implements IBaseService {
@Autowired private TestFluentMybatisDao testFluentMybatisDao;
@Autowired private TestFluentMybatisMapper testFluentMybatisMapper;
@Override
public TestFluentMybatisEntity insertOrUpdate(TestFluentMybatisEntity param) {
testFluentMybatisDao.saveOrUpdate(param);
return param;
}
@Override
public List<TestFluentMybatisEntity> query1(TestFluentMybatisQueryReq queryReq) {
return testFluentMybatisMapper.listEntity(
new TestFluentMybatisQuery()
.selectAll()
.where
.age()
.eq(queryReq.getAge())
.and
.name()
.eq(queryReq.getName())
.end());
}
}
control层方法定义
@ApiOperation(value = "查询数据1", notes = "查询数据1")
@RequestMapping(value = "/query1", method = RequestMethod.POST)
@ResponseBody
public Result<List<TestFluentMybatisEntity>> query1(
@RequestBody TestFluentMybatisQueryReq queryReq) {
try {
return Result.ok(baseService.query1(queryReq));
} catch (Exception exception) {
return Result.error(ErrorCode.BASE_ERROR_CODE.getCode(), exception.getMessage(), null);
}
}
调试一下接口
一眼望去貌似没问题,但是长期后端开发的朋友应该能看出来,这个实现方式如果一旦age或者name参数为空的话,那么肯定查不出结果。因为按照语句的写法,会强制比较age和name两个参数。
我们将其中一个参数设置为空字符串试试看。
不出意料。现在我可以就该方法做调整,参数判断然后替换select语句,为了更优雅的实现,我去官方文档再找找。
查询写法2
查询方法2
package com.hy.fmp.service.Impl;
import cn.hutool.core.util.StrUtil;
import com.hy.fmp.dto.req.TestFluentMybatisQueryReq;
import com.hy.fmp.fluent.dao.intf.TestFluentMybatisDao;
import com.hy.fmp.fluent.entity.TestFluentMybatisEntity;
import com.hy.fmp.fluent.helper.TestFluentMybatisMapping;
import com.hy.fmp.fluent.mapper.TestFluentMybatisMapper;
import com.hy.fmp.fluent.wrapper.TestFluentMybatisQuery;
import com.hy.fmp.service.IBaseService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
/** @Author huyi @Date 2021/10/20 17:10 @Description: 基础操作接口实现 */
@Slf4j
@Service
public class BaseServiceImpl implements IBaseService {
@Autowired private TestFluentMybatisDao testFluentMybatisDao;
@Autowired private TestFluentMybatisMapper testFluentMybatisMapper;
@Override
public TestFluentMybatisEntity insertOrUpdate(TestFluentMybatisEntity param) {
testFluentMybatisDao.saveOrUpdate(param);
return param;
}
@Override
public List<TestFluentMybatisEntity> query1(TestFluentMybatisQueryReq queryReq) {
return testFluentMybatisMapper.listEntity(
new TestFluentMybatisQuery()
.selectAll()
.where
.age()
.eq(queryReq.getAge())
.and
.name()
.eq(queryReq.getName())
.end());
}
@Override
public List<TestFluentMybatisEntity> query2(TestFluentMybatisQueryReq queryReq) {
return testFluentMybatisMapper.listByMap(
true,
new HashMap<String, Object>() {
{
if (!StrUtil.hasEmpty(queryReq.getAge())) {
this.put(TestFluentMybatisMapping.age.column, queryReq.getAge());
}
if (!StrUtil.hasEmpty(queryReq.getName())) {
this.put(TestFluentMybatisMapping.name.column, queryReq.getName());
}
}
});
}
}
代码说明
我对比了一下官方文档的写法,发现我这个版本的fm该listByMap方法多一个isColumn的布尔型参数。所以我追了一下源码。
只影响错误打印,主要就是设置的map参数必须要是列名或者实体对象内的参数名。就不管了。
验证一下
没什么问题,还是可以查出来。
新问题
但是按照这个查询方法,如果两个值都传空字符串会查出全表数据吗?
验证一下
咳咳,报错了。
所以我还是老老实实先把代码参数判空优化一下。
package com.hy.fmp.service.Impl;
import cn.hutool.core.util.StrUtil;
import com.hy.fmp.dto.req.TestFluentMybatisQueryReq;
import com.hy.fmp.fluent.dao.intf.TestFluentMybatisDao;
import com.hy.fmp.fluent.entity.TestFluentMybatisEntity;
import com.hy.fmp.fluent.helper.TestFluentMybatisMapping;
import com.hy.fmp.fluent.mapper.TestFluentMybatisMapper;
import com.hy.fmp.fluent.wrapper.TestFluentMybatisQuery;
import com.hy.fmp.service.IBaseService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
/** @Author huyi @Date 2021/10/20 17:10 @Description: 基础操作接口实现 */
@Slf4j
@Service
public class BaseServiceImpl implements IBaseService {
@Autowired private TestFluentMybatisDao testFluentMybatisDao;
@Autowired private TestFluentMybatisMapper testFluentMybatisMapper;
@Override
public TestFluentMybatisEntity insertOrUpdate(TestFluentMybatisEntity param) {
testFluentMybatisDao.saveOrUpdate(param);
return param;
}
@Override
public List<TestFluentMybatisEntity> query1(TestFluentMybatisQueryReq queryReq) {
return testFluentMybatisMapper.listEntity(
new TestFluentMybatisQuery()
.selectAll()
.where
.age()
.eq(queryReq.getAge())
.and
.name()
.eq(queryReq.getName())
.end());
}
@Override
public List<TestFluentMybatisEntity> query2(TestFluentMybatisQueryReq queryReq) {
if (StrUtil.hasEmpty(queryReq.getAge()) && StrUtil.hasEmpty(queryReq.getName())) {
return testFluentMybatisMapper.listEntity(new TestFluentMybatisQuery().selectAll());
}
return testFluentMybatisMapper.listByMap(
true,
new HashMap<String, Object>() {
{
if (!StrUtil.hasEmpty(queryReq.getAge())) {
this.put(TestFluentMybatisMapping.age.column, queryReq.getAge());
}
if (!StrUtil.hasEmpty(queryReq.getName())) {
this.put(TestFluentMybatisMapping.name.column, queryReq.getName());
}
}
});
}
}
验证一下
删
添加通过ID删除数据的接口方法
/**
* 删除接口
*
* @param id id
*/
void deleteById(Integer id);
实现接口方法
@Override
public void deleteById(Integer id) {
testFluentMybatisMapper.deleteById(id);
}
验证一下
删除成功
来源:https://huyi-aliang.blog.csdn.net/article/details/120875177
0
投稿
猜你喜欢
- 参考答案java.sql.Date 是 java.util.Date 的子类java.util.Date 是 JDK 中的日期类,精确到时、
- 开发环境JDK1.8 eclipse struts2-2.3.31 1.创建web项目 2.导入struts2核心jar包 3.更改web.
- 1.新建文件上传页面在static目录中新建upload-test.html,上传页面代码如下所示:<!DOCTYPE html>
- 一、 通过JDK网络类Java.net.HttpURLConnection1.java.net包下的原生java api提供的http请求使
- 1、properties文件显示乱码问题原因是因为properties默认使用ASCII码,就算在文件中填写了中文,再打开后依然会转换成AS
- Flyweight定义:避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类)。为什么使用共享模式/享元模式面向对象语言的
- 前言之前写过一篇关于配置中心对配置内容加密解密的介绍:《Spring Cloud构建微服务架构:分布式配置中心(加密解密) 》。在这篇文章中
- 高并发下restTemplate的错误分析1. 问题现象和分析org.apache.http.conn.ConnectionPoolTime
- 简述在学着使用Java的命令行来编译java文件的时候,遇到了这个问题Windows操作系统报错“‘
- 今天做统计时需要对X轴的地区按照地区代码(areaCode)进行排序,由于在构建XMLData使用的map来进行数据统计的,所以在统计过程中
- 一、前言之前介绍了JMeter engine启动原理,但是里面涉及到HashTree这个类结构没有给大家详细介绍,这边文章就详细介绍JMet
- 问题由来一个简单的需求,要求把和当前用户相关的数据置顶展示。这里,我用了一个简单的用户表来复现这个需求。很简单,查询语句后面加上:order
- 本文实例讲述了Android实现将应用崩溃信息发送给开发者并重启应用的方法。分享给大家供大家参考,具体如下:在开发过程中,虽然经过测试,但在
- 1.概述MybatisPlus是国产的第三方插件, 它封装了许多常用的CURDapi,免去了我们写mapper.xml的重复劳动,这里介绍了
- 这篇文章主要介绍了java接口私有方法实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可
- cookie和session的比较一、对于cookie:①cookie是创建于服务器端②cookie保存在浏览器端③cookie的生命周期可
- 本文实例讲述了java之swing表格实现方法。分享给大家供大家参考。具体如下:import java.awt.*;import java.
- Spring @Cacheable指定失效时间新版本配置@Configuration@EnableCachingpublic class R
- Map接口存储特点以键(key)值(value)对的形式存储键无序、无下标、元素不可重复值无序、无下标、元素可以重复常用实现类HashMap
- 一、线程的生命周期1.五种状态:新建状态、就绪状态、运行状态、阻塞状态、消亡状态2.就绪状态的线程表示有权利去获取CPU的时间片,CPU时间