java SDK对接金蝶数据包装类(仅查询)
Posted £漫步 云端彡
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java SDK对接金蝶数据包装类(仅查询)相关的知识,希望对你有一定的参考价值。
java SDK对接金蝶
-
如果是Maven管理,可以在pom.xml中加入如下依赖:
<!-- 金蝶云对接 --> <dependency> <groupId>com.kingdee</groupId> <artifactId>k3cloud-webapi</artifactId> <version>1.0.0</version> <scope>system</scope> <!-- jar包存放的位置 --> <systemPath>$project.basedir/lib/k3cloud-webapi-sdk7.9.2.jar</systemPath> </dependency>
-
起步配置有官方教程:查看官方指南
-
官网只提供了一些查询数据方法。对于java代码来说写起来很不舒服。下面我做了一些工具类。
一共设计了10个java文件,下面简单的介绍一下
(1) AbstractBuilder:抽象构造器,用于构建查询语句的SQL方法定义
(2) FilterRuleBuilder: 通用的查询条件构造器,继承了AbstractBuilder,可构建常用的查询字段,条件等。使用方式类比mybatis-plus的QueryWrapper
(3) Builder:针对于实体类的条件构造,继承了AbstractBuilder,修饰了FilterRuleBuilder。功能同上,使用方式类比mybatis-plus的Wrappers。注:如果不设置查询字段则查询类中所有字段
(4) ConvertType:一个类型转换的枚举类,枚举了需要转换的位置。目的是为了将金蝶中查询字段和实体类的字段之间的_与.符号的转换处理。
(5) SymbolConvert:符号转换注解,将需要指定特殊转换的字段写入该注解,即可,例:在金蝶中查询字段为A_B.C,java实体类中字段只能为A_B_C,故在该字段上标明@SymbolConvert(ConvertType.Last),表示转换字符只转最后一个。不写注解默认为转换所有符号。
(6) FormId:FormId 注解,看过API的都知道,这是标识查询金蝶的FormId值,不填默认为类名。
(7) K3Const:K3使用的静态常量
(8) SFunction:序列化函数式接口
(9)SFunctionParse:函数式接口解析,很重要,其中解析了@SymbolConvert,解析了表达式
(10) K3Api:金蝶数据接口工具类,最终使用的是这个查询,该类已注入Spring,可以通过@Autowired自动注入,作用域为一个Session。
注:FilterRuleBuilder 和 Builder类提供特有的switchAND和switchOR来切换条件判断连接符,默认是and;可通过andLeft 和 orLeft 添加 ’ AND ( ’ 与 ’ OR ( ',通过right添加 ‘)’ 。以上类代码如下:import java.util.ArrayList; import java.util.Date; import java.util.List; /** * @Author * @Date 2022/5/16 10:03 * @Description 抽象构造器 */ public abstract class AbstractBuilder<T> /** * 定义所有的基本类型及包装类型,或者是String */ protected static final List<String> generalType = new ArrayList<String>() add(Date.class.getName()); add(Integer.class.getName()); add(Double.class.getName()); add(Float.class.getName()); add(Long.class.getName()); add(Short.class.getName()); add(Byte.class.getName()); add(Boolean.class.getName()); add(Character.class.getName()); add(String.class.getName()); add("int"); add("double"); add("float"); add("long"); add("short"); add("byte"); add("boolean"); add("char"); ; /** * 查询参数构造器 */ protected List<String> fieldKeys = new ArrayList<>(); /** * 过滤条件构造器 */ protected StringBuilder filterStrBuilder = new StringBuilder(); /** * 排序规则条件构造器 */ protected StringBuilder orderBuilder = new StringBuilder(); /** * 返回总行数 */ protected int TopRowCount = 0; /** * 开始行索引 */ protected int StartRow = 0; /** * 最大行数 */ protected int Limit = 0; protected final String LOGIC_AND = " AND "; protected final String LOGIC_OR = " OR "; /** * 获取查询字段 * * @return */ public abstract List<String> getFieldKeys(); /** * 构建查询字段 * * @return */ public abstract String buildFieldKeys(); /** * 构造查询条件 * * @return */ public abstract String buildFilter(); /** * 构造排序条件 * * @return */ public abstract String buildOrder(); /** * 构建总行数 * * @return */ public abstract int buildTopRowCount(); /** * 构建起始行数 * * @return */ public abstract int buildStartRow(); /** * 构建最大行数 * * @return */ public abstract int buildLimit();
import java.lang.reflect.Field; import java.util.Date; import java.util.List; /** * @Author * @Date 2022/5/12 9:54 * @Description K3Cloud 查询条件构造 */ public class FilterRuleBuilder extends AbstractBuilder public FilterRuleBuilder() /** * 逻辑关系,默认and */ protected String logic = LOGIC_AND; /** * 获取查询字段 * * @return */ public List<String> getFieldKeys() return this.fieldKeys; /** * 切换and逻辑 * * @return */ public FilterRuleBuilder switchAND() logic = LOGIC_AND; return this; /** * 切换or逻辑 * * @return */ public FilterRuleBuilder switchOR() logic = LOGIC_OR; return this; /** * 添加and左括号 * * @return */ public FilterRuleBuilder andLeft() if (filterStrBuilder.length() == 0) filterStrBuilder.append("("); else filterStrBuilder.append(LOGIC_AND + "("); return this; /** * 添加or左括号 * * @return */ public FilterRuleBuilder orLeft() if (filterStrBuilder.length() == 0) filterStrBuilder.append("("); else filterStrBuilder.append(LOGIC_OR + "("); return this; /** * 添加右括号 * * @return */ public FilterRuleBuilder right() filterStrBuilder.append(")"); return this; /** * 列表查询字段 * * @param fieldKeys * @return */ public FilterRuleBuilder select(List<String> fieldKeys) this.fieldKeys = fieldKeys; return this; /** * 查询具体类的所有字段 * * @param cls * @return */ public FilterRuleBuilder selectAllFiled(Class cls) Field[] fields = cls.getDeclaredFields(); for (Field field : fields) String fieldName = SFunctionParse.convertField(cls, field.getName()); select(fieldName); return this; /** * 添加查询字段 * * @param fieldKey * @return */ public FilterRuleBuilder select(String fieldKey) fieldKeys.add(fieldKey); return this; /** * 添加多个查询字段 * * @param fieldKeys * @return */ public FilterRuleBuilder select(String... fieldKeys) for (String fieldKey : fieldKeys) select(fieldKey); return this; /** * 多字段排序 * * @param fieldNames * @return */ public FilterRuleBuilder orderBy(boolean isDesc, String... fieldNames) // 不为空加逻辑关系 if (orderBuilder.length() != 0) orderBuilder.append(","); for (String fieldName : fieldNames) if (isDesc) orderBuilder.append(String.format("%s DESC,", fieldName)); else orderBuilder.append(String.format("%s ASC,", fieldName)); // 删除最后一个字符 orderBuilder.deleteCharAt(orderBuilder.length() - 1); return this; /** * 正序排序 * * @param fieldName * @return */ public FilterRuleBuilder orderByAsc(String fieldName) // 不为空加逻辑关系 if (orderBuilder.length() != 0) orderBuilder.append(","); orderBuilder.append(String.format("%s ASC", fieldName)); return this; /** * 倒序排序 * * @param fieldName * @return */ public FilterRuleBuilder orderByDesc(String fieldName) // 不为空加逻辑关系 if (orderBuilder.length() != 0) orderBuilder.append(","); orderBuilder.append(String.format("%s DESC", fieldName)); return this; /** * 等于构造 * * @param fieldName * @param value * @return */ public FilterRuleBuilder eq(String fieldName, Object value) // 不为空加逻辑关系,或者前面为左括号不加 if (filterStrBuilder.length() != 0 && filterStrBuilder.charAt(filterStrBuilder.length() - 1) != '(') filterStrBuilder.append(logic); // 字母或数字要加引号 if (value instanceof String || value instanceof Date) filterStrBuilder.append(String.format("(%s = '%s')", fieldName, value)); else filterStrBuilder.append(String.format("(%s = %s)", fieldName, value)); return this; /** * 不等于构造 * * @param fieldName * @param value * @return */ public FilterRuleBuilder ne(String fieldName, Object value) // 不为空加逻辑关系,或者前面为左括号不加 if (filterStrBuilder.length() != 0 && filterStrBuilder.charAt(filterStrBuilder.length() - 1) != '(') filterStrBuilder.append(logic); // 字母或数字要加引号 if (value instanceof String || value instanceof Date) filterStrBuilder.append(String.format("(%s <> '%s')", fieldName, value)); else filterStrBuilder.append(String.format("(%s <> %s)", fieldName, value)); return this; /** * 小于构造 * * @param fieldName * @param value * @return */ public FilterRuleBuilder lt(String fieldName, Object value) // 不为空加逻辑关系,或者前面为左括号不加 if (filterStrBuilder.length() != 0 && filterStrBuilder.charAt(filterStrBuilder.length() - 1) != '(') filterStrBuilder.append(logic); // 字母或数字要加引号 if (value instanceof String || value instanceof Date) filterStrBuilder.append(String.format("(%s < '%s')", fieldName, value)); else filterStrBuilder.append(String.format("(%s < %s)", fieldName, value)); return this; /** * 大于构造 * * @param fieldName * @param value * @return */ public FilterRuleBuilder gt(String fieldName, Object value) // 不为空加逻辑关系,或者前面为左括号不加 if (filterStrBuilder.length() != 0 && filterStrBuilder.charAt(filterStrBuilder.length() - 1) != '(') filterStrBuilder.append(logic); // 字母或数字要加引号 if (value instanceof String || value instanceof Date) filterStrBuilder.append(String.format("(%s > '%s')", fieldName, value)); else filterStrBuilder.append(String.format("(%s > %s)", fieldName, value)); return this; /** * 小于等于构造 * * @param fieldName * @param value * @return */ public FilterRuleBuilder le(String fieldName, Object value) // 不为空加逻辑关系,或者前面为左括号不加 if (filterStrBuilder.length() != 0 && filterStrBuilder.charAt(filterStrBuilder.length() - 1) != '(') filterStrBuilder.append(logic); // 字母或数字要加引号 if (value instanceof String || value instanceof Date) filterStrBuilder.append(String.format("(%s <= '%s')", fieldName, value)); else filterStrBuilder.append(String.format("(%s <= %s)", fieldName, value)); return this; /** * 大于等于构造 * * @param fieldName * @param value * @return */ public FilterRuleBuilder ge(String fieldName, Object value) // 不为空加逻辑关系,或者前面为左括号不加 if (filterStrBuilder.length() != 0 && filterStrBuilder.charAt(filterStrBuilder.length() - 1) != '(') filterStrBuilder.append(logic); // 字母或数字要加引号 if (value instanceof String || value instanceof Date) filterStrBuilder.append(String.format("(%s >= '%s')", fieldName, value)); else filterStrBuilder.append(String.format("(%s >= %s)",
以上是关于java SDK对接金蝶数据包装类(仅查询)的主要内容,如果未能解决你的问题,请参考以下文章