Java Fluent Mybatis 项目工程化与常规操作详解流程篇 下
作者:剑客阿良_ALiang 时间:2021-07-19 11:33:11
前言
接着上一篇: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
标签:Java,Fluent,Mybatis,常规操作
0
投稿
猜你喜欢
浅谈redis key值内存消耗以及性能影响
2022-11-09 20:35:17
Java实例讲解多态数组的使用
2021-08-30 19:34:46
Android异步下载图片并且缓存图片到本地DEMO详解
2022-10-27 14:16:17
Springboot Vue实现单点登陆功能示例详解
2023-11-05 00:29:11
Spring的事务管理你了解吗
2023-02-05 19:44:16
详解Spring Cloud Stream使用延迟消息实现定时任务(RabbitMQ)
2022-09-14 05:07:34
Java遍历Map对象的四种方式
2022-05-07 14:30:04
Java泛型的使用限制实例分析
2023-05-07 20:14:52
java编程多线程并发处理实例解析
2022-06-02 22:14:59
jenkins+maven+svn自动部署和发布的详细图文教程
2023-08-24 05:18:07
Kotlin 和 Java 混合开发入门教程
2023-07-06 01:41:51
SpringBoot项目中遇到的BUG问题及解决方法
2022-01-19 14:44:38
详解Mybatis多参数传递入参四种处理方式
2022-12-27 15:18:20
C#中split用法实例总结
2023-11-27 11:31:16
Android优化提升应用启动速度及Splash页面的设计
2022-02-18 06:02:27
浅谈Java内存区域划分和内存分配策略
2023-08-11 18:52:49
浅谈Java消息队列总结篇(ActiveMQ、RabbitMQ、ZeroMQ、Kafka)
2022-06-13 01:30:40
Java读取本地json文件及相应处理方法
2023-10-16 16:37:34
详解SpringBoot定时任务说明
2022-08-11 05:03:11
Android Studio 引用外部依赖时报错的解决方法
2023-09-26 18:20:11