Java Fluent Mybatis 项目工程化与常规操作详解流程篇 下

网友投稿 303 2022-09-19


Java Fluent Mybatis 项目工程化与常规操作详解流程篇 下

目录前言查询查询写法1查询写法2代码说明新问题删总结

前言

接着上一篇: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 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 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> 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 query1(TestFluentMybatisQueryReq queryReq) {

return testFluentMybatisMapper.listEntity(

new TestFluentMybatisQuery()

.selectAll()

.where

http:// .age()

.eq(queryReq.getAge())

.and

.name()

.eq(queryReq.getName())

.end());

}

@Override

public List query2(TestFluentMybatisQueryReq queryReq) {

return testFluentMybatisMapper.listByMap(

true,

new HashMap() {

{

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 query1(TestFluentMybatisQueryReq queryReq) {

return testFluentMybatisMapper.listEntity(

new TestFluentMybatisQuery()

.selectAll()

.where

.age()

.eq(queryReq.getAge())

.and

.name()

.eq(queryReq.getName())

.end());

}

@Override

public List query2(TestFluentMybatisQueryReq queryReq) {

if (StrUtil.hasEmpty(queryReq.getAge()) && StrUtil.hasEmpty(queryReq.getName())) {

return testFluentMybatisMapper.listEntity(new TestFluentMybatisQuery().selectAll());

}

return testFluentMybatisMapper.listByMap(

true,

new HashMap() {

{

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);

}

验证一下

删除成功

总结

这两篇文章主要是将之前的项目进行工程化改造,增加了文档、接口等一些列常规化操作。实现了数据库表的基本增删改查功能。其他的功能会在之后慢慢更新,fm融合了很多其他orm框架的东西,需要慢慢摸索摸索。

如果本文对你有帮助,请点个赞支持一下吧。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:BGP邻居概述(BGP邻居建立)
下一篇:双汇聚层网络(双汇发展官网)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~