一、Mybatis仿JPA增强
第1章 快速入门
1.1设计说明
基于数据库表设计一般以t_xx_yy格式命令,以及很多表操作的复杂问题,设计了本工具类,旨在减少DAO层编码设计,一般数据库格式不会大变,有一定程度的硬编码(数据库相关列/表名),但整体不影响使用。
代码基于反射和Mybatis Provider高级应用实现。
设计力求一套代码设计,满足数据库的基本操作以及复杂业务需求。
1.2基础注解
注解 解释
@SqlTableInfo 注释表名
@SqlInfoField 注释字段名
@Data lombok注解,实现get/set/构造器等
@Primary 注释字段主键
1.3相关组件介绍
1.3.1 Repositories介绍
1.3.1.1提供了DynamicSqlProvider 接口
标记接口
一、捕获泛型提示的类型和实体ID的类型
二、在类路径扫描期间,帮助Spring容器找到具体的数据仓库接口
1.3.1.2提供操作支持
提供了增删查改,分页等基础CURD机制。
提供单条数据结果集,与list集合结果集封装。
提供自定义sql执行机制。
1.3.2 QueryParam实体基类
基础实体类,用于注解解析。
核心 属性
// 设置分页起始点
setLimitStart(int num);
// 设置分页总计
setLimitPage(int num);
// 查询表名
queryTable
// 设置字段组合Map集合
fieldMap
// 设置字段类型Map集合
fieldTypeMap
1.4 Springboot集成说明
1.4.1pom引入
<dependency>
<groupId>com.hecore</groupId>
<artifactId>common-bdp</artifactId>
<version>v-1.0</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
1.4.2实体类注解
参照数据库需要
package com.hecore.cbs.mybaits.model;
import com.epoch.core.entity.QueryParam;
import com.epoch.core.support.mybatis.annotation.SqlInfoFiled;
import com.epoch.core.support.mybatis.annotation.SqlTableInfo;
import lombok.Data;
/**
* @Author: hecore
* @Date: 2019/12/18 16:04
* @Description:
*/
@SqlTableInfo(tableName = "t_custom_config")
@Data
public class ConfigInfoVO extends QueryParam {
@SqlInfoFiled(name = "config_name")
private String configName;
@SqlInfoFiled(name = "config_info")
private String configInfo;
@SqlInfoFiled(name = "config_code",primary = true)
private String configCode;
@SqlInfoFiled(name = "config_flag")
private String configFlag;
}
1.4.3定制DAO层
package com.hecore.cbs.dao;
import com.epoch.core.dao.DynamicSqlProvider;
import com.hecore.cbs.mybaits.model.ConfigInfoVO;
import org.springframework.stereotype.Repository;
@Repository
public interface ConfigInfoDAO extends DynamicSqlProvider<ConfigInfoVO> {
}
1.4.4扫描配置
package com.hecore.cbs;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan({"com.hecore.cbs.dao","com.epoch.core.dao"})
public class CbsSyncServiceApplication {
public static void main(String[] args) {
SpringApplication.run(CbsSyncServiceApplication.class, args);
}
}
1.5 spring集成说明
1.5.1Spring-mybatis.xml配置插件
<!-- 2019-12-13 hecore 配置自定义的通用Mapper-Mybatis的插件plugin-->
<property name="plugins">
<array>
<bean class="com.epoch.core.support.mybatis.result.ResultMapInterceptor">
<property name="properties">
<value> property-key=property-value </value>
</property>
</bean>
</array>
</property>
1.5.2其他同上
1.6测试说明
1.6.1测试查询
ppackage com.hecore.cbs.mybaits.service.impl;
import com.epoch.core.dao.DynamicSqlProvider;
import com.epoch.core.entity.QueryParam;
import com.epoch.core.support.mybatis.sql.DynamicMapperCustomSql;
import com.hecore.cbs.dao.ConfigInfoDAO;
import com.hecore.cbs.mybaits.model.ConfigInfoVO;
import com.hecore.cbs.mybaits.service.IConfigService;
import com.hecore.rest.ReturnT;
import org.apache.ibatis.annotations.SelectProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @Author: hecore
* @Date: 2021/7/8 10:06
* @Description:
*/
@Service
public class ConfigServiceImpl implements IConfigService {
@Autowired
private ConfigInfoDAO configInfoDAO;
@Override
public ReturnT query(){
ConfigInfoVO configInfoVO =new ConfigInfoVO();
configInfoVO.setConfigCode("BANK_SYNC_FLAG");
ConfigInfoVO resVO = configInfoDAO.selectInfoSql(configInfoVO);
return new ReturnT(resVO);
}
@Override
public ReturnT delete() {
ConfigInfoVO configInfoVO =new ConfigInfoVO();
configInfoVO.setConfigCode("TEMP_CODE");
int res=configInfoDAO.deleteInfoSql(configInfoVO);
return new ReturnT(res);
}
@Override
public ReturnT update() {
ConfigInfoVO configInfoVO =new ConfigInfoVO();
configInfoVO
.setConfigCode("TEMP_CODE")
.setConfigName("更新临时编码");
int res=configInfoDAO.updateInfoSql(configInfoVO);
return new ReturnT(res);
}
@Override
public ReturnT insert() {
ConfigInfoVO configInfoVO =new ConfigInfoVO();
configInfoVO
.setConfigCode("TEMP_CODE")
.setConfigName("插入临时编码");
int res=configInfoDAO.insertInfoSql(configInfoVO);
return new ReturnT(res);
}
}
测试结果:
1.6.2测试插入
1.6.3测试更新
1.6.4测试删除
第2章 DQM设计
2.1 DQM介绍
该语法是:带查询功能的方法名由查询策略(关键字)+ 查询字段 + 一些限制性条件组成,具有语义清晰、功能完整的特性,我们实际工作中 80% 的 API 查询都可以简单实现。
综上,总结 3 点经验:
方法名的表达式通常是实体属性连接运算符的组合,如 And、or、Between、LessThan、GreaterThan、Like 等属性连接运算表达式,不同的数据库(NoSQL、MySQL)可能产生的效果不一样,如果遇到问题,我们可以打开 SQL 日志观察。
IgnoreCase 可以针对单个属性(如 findByLastnameIgnoreCase(…)),也可以针对查询条件里面所有的实体属性忽略大小写(所有属性必须在 String 情况下,如 findByLastnameAndFirstnameAllIgnoreCase(…))。
OrderBy 可以在某些属性的排序上提供方向(Asc 或 Desc),称为静态排序,也可以通过一个方便的参数 Sort 实现指定字段的动态排序的查询方法(如 repository.findAll(Sort.by(Sort.Direction.ASC, “myField”)))。
2.2 排序相关注解
注解名 注解解释
@orderBy 作用于字段增加排序字段,默认type asc,level为1
@orderBy(type=ASC,level=1) 作用于字段Type为ASC|DESC,level 1.2…自增,代表排序sql组装优先顺序.由于排序涉及多字段可能。
@orderBy(type=ASC,level=1,case=””) 作用于字段用于实现 order by case when语法;注解case中为case when完整逻辑
2.3 Between and 注解
注解名 注解解释
@betweenVal(between=””,and=””) 作用于字段between为between前值,and为之后值
2.4 like注解
注解名 注解解释
@likeVal(likeType=PRE,value=””) 作用于字段,likeType, PRE|SUFFIX|ALL 代表 %在前后,字段前后都有; value指字段值
第3章 自定义sql执行
3.1 介绍
自定义sql执行可用于定制化sql计划以及实现复杂查询以及执行特定更新删除等sql,满足程序使用的特质化需求。
缺点是代码硬编码。
3.2 核心api
List selectListInfoBySql(QueryParam var1);
int executeInfoBySql(String var1);
3.3 测试
@Override
public ReturnT custom() {
ConfigInfoVO configInfoVO=new ConfigInfoVO();
configInfoVO.setSql("select config_name configName from t_custom_config where config_code=\"BANK_SYNC_FLAG\"");
List<ConfigInfoVO> list= configInfoDAO.selectListInfoBySql(configInfoVO);
return new ReturnT(list);
}