# ecology_utils **Repository Path**: dodocs/ecology_utils ## Basic Information - **Project Name**: ecology_utils - **Description**: ecology工具合集 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2022-01-11 - **Last Updated**: 2025-04-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # READMEN Utils工具包使用手册及查询 文档说明常用方法,其他工具方法自行查看。 ## 目录结构 utils │ ApiResult.java ==> 自定义接口返回对象封装 │ LabelHtmlUtils.java ==> 多语言获取对应语言的标签相关 │ MybatisUtil.java ==> 集成Mybatis相关 │ Util.java ==> 工具类入口 │ ├─annotation ==> 自定义注解 │ │ DateFormatAn.java │ │ │ └─recordset │ CaseConversion.java │ Delete.java │ Insert.java │ ParamMapper.java │ Select.java │ SqlMapper.java │ SqlString.java │ Update.java │ ├─dao ==> 工具类操作数据库dao层 │ UtilDao.java │ ├─entity ==> 实体类 相关 │ AInputStream.java │ ApiConfigDetailDTO.java │ ApiConfigMainDTO.java │ AZipOutputStream.java │ BaseTree.java │ FnainvoiceinterfaceDTO.java │ LabelHtmlIndex.java │ ListZipEntity.java │ MultiLanguageDTO.java │ ├─excention ==> 自定义异常 │ BindingException.java │ MethodNotFindException.java │ ParseSqlException.java │ TypeNonsupportException.java │ ├─fileUtil ==> 文件工具类相关 │ ProperUtil.java │ WatermarkPoint.java │ WatermarkPointEnum.java │ WritWatermark.java │ ├─function ==> 函数式编程相关 │ FindChildren.java │ VerifyParent.java │ ├─httpUtil ==> 第三方接口请求接口相关 │ │ ExtendedIOUtils.java │ │ HttpArgsType.java │ │ HttpManager.java │ │ ResponeVo.java │ │ │ ├─httpAsync ==> 异步请求相关 │ │ HttpAsyncThread.java │ │ HttpAsyncThreadCallBack.java │ │ │ ├─staticUtil ==> 请求工具静态方法相关 │ │ GlobalStaticCache.java │ │ HttpStaticUtils.java │ │ │ └─util ==> 实例化请求工具相关 │ CloseThread.java │ GlobalCache.java │ HttpUtils.java │ ├─mapUtil ==> map工具相关 │ ParaMap.java │ UtilHashMap.java │ UtilLinkedHashMap.java │ UtilMapFilter.java │ ├─recordset ==> 自定义面向接口操作数据库相关(基于RecordSet封装,类似mybatis接口注解开发) │ BooleanTypeHandler.java │ DataTypeHandler.java │ IntegerTypeHandler.java │ RecordsetUtil.java │ ResultMapper.java │ SqlHandler.java │ StringTypeHandler.java │ TypeHandler.java │ ├─service ==> 工具类service相关 │ UtilService.java │ ├─sqlUtil ==> sql工具相关 │ ├─builderSql │ │ │ BuilderSql.java │ │ │ │ │ └─impl │ │ BuilderSqlImpl.java │ │ │ ├─sqlResult │ │ │ SqlResult.java │ │ │ │ │ └─impl │ │ BatchSqlResultImpl.java │ │ PrepSqlResultImpl.java │ │ │ └─whereUtil │ │ InnerWhere.java │ │ InnerWhereOperator.java │ │ Where.java │ │ WhereOperator.java │ │ │ └─impl │ InnerPrepWhereImpl.java │ InnerPrepWhereOperatorImpl.java │ InnerWhereImpl.java │ InnerWhereOperatorImpl.java │ PrepWhereImpl.java │ PrepWhereOperatorImpl.java │ WhereImpl.java │ WhereOperatorImpl.java │ └─zwl ==> 老大给的工具 └─common │ CusBaseAction.java │ ToolUtil.java │ └─logging Log4JLogger.java Logger.java LoggerFactory.java ## SQL工具相关 > SQL相关工具目前拥有两个,一个位于sqlUtil包下,一个位于recordset包下 ### SQLUtil包 #### 构建SQL 用于自动构建SQL和请求参数的工具,能够将map类型的数据自动构建为相对应的sql语句。但是目前只支持更新,插入,暂不支持删除和查询。 1、使用SQL工具构建更新语句,其中存在方法重构,具体可以查看源码标注 ```java @Test public void builderUpdate(){ // 构建更新参数,将name更新为为update_name,email更新为update_email,其他字段更新类似 Map map = new HashMap<>(); map.put("name","update_name"); map.put("email","update_email"); map.put("phone","update_phone"); // 构建更新条件,比如id = 20 或者age > 30 Where where = Util.createPrepWhereImpl() .whereAnd("id").whereEqual(20) .whereOr("age").greaterThan(30); // 构建SQL PrepSqlResultImpl sqlResult = Util.createSqlBuilder().updateSql( "tableName", map, where ); // 获取完整的SQL对象 System.out.println(sqlResult); RecordSet rs = new RecordSet(); // 执行SQL rs.executeUpdate(sqlResult.getSqlStr(),sqlResult.getArgs()); } ``` 2、构建插入 ```java @Test public void builderInsert(){ // 将以下数据插入到数据库中,比如 inset into name ,email values('update_name','update_email') Map map = new HashMap<>(); map.put("name","update_name"); map.put("email","update_email"); map.put("phone","update_phone"); // 构建SQL PrepSqlResultImpl sqlResult = Util.createSqlBuilder().insertSql( "tableName", map); // 获取完整的SQL对象 System.out.println(sqlResult); RecordSet rs = new RecordSet(); // 执行SQL rs.executeUpdate(sqlResult.getSqlStr(),sqlResult.getArgs()); } ``` 除了可以构建单一SQL之外,还可以构建批量SQL,具体请查看源码以及注释说明! 执行批量SQL时,调用`RecordSet`的`executeBatchSql()`方法。 #### 收集结果集 使用recordSet执行SQL之后,需要使用原生jdbc方式收集执行后的数据,或者使用工具类中的转化方法获取对应类型的数据。 1、将结构收集为实体类或Map对象 ```java @Test public void getRsValue(){ String sql = "select * from table"; RecordSet rs = new RecordSet(); rs.executeQuery(sql); // 将rs结果转化为Map,并不进行下划线转驼峰 // Map result = Util.recordSet2Map(rs, false); // 将rs结果转化为Map,将下划线转为驼峰命名 Map result = Util.recordSet2Map(rs); System.out.println(result); // 将执行结果转为javaBean对象 sql = "select * from fileImage"; rs.executeQuery(sql); // 不进行驼峰转换 // ImageInfo imageInfo = Util.recordeSet2Entity(rs, ImageInfo.class,false); ImageInfo imageInfo = Util.recordeSet2Entity(rs, ImageInfo.class); System.out.println(imageInfo); } ``` 2、将结果收集为List集合 ```java @Test public void getRsValue(){ String sql = "select * from table"; RecordSet rs = new RecordSet(); rs.executeQuery(sql); // 将rs结果转化为Map,并不进行下划线转驼峰 // List> result = Util.recordSet2MapList(rs,false); // 将rs结果转化为Map,将下划线转为驼峰命名 List> result = Util.recordSet2MapList(rs); System.out.println(result); // 将执行结果转为javaBean对象 sql = "select * from fileImage"; rs.executeQuery(sql); // 不进行驼峰转换 // List imageInfos = Util.recordeSet2Array(rs, ImageInfo.class,false); List imageInfos = Util.recordeSet2Array(rs, ImageInfo.class); System.out.println(imageInfos); } ``` 更多操作可以看源代码或者执行打包文档 ### recordset包 该包下的类和SQLUtil包里面的类功能相仿,都是为了简化sql操作而编写的工具,该类模仿mybatis注解式编程,但是目前是没有经过任何的设计和优化的,也没有其他的算法和设计模式(除动态代理)。对数据库的操作可以简化为面向接口编程,通过注解编写SQL和自动收集结果并映射实体类和map等对象。支持查询、删除、更新、插入。 1、查询数据 + 编写数据查询接口文件`IMapperTest.java` ```java //添加注解,标明需要对该类进行sql执行代理 @SqlMapper public interface IMapperTest { // 添加注解,表示改方法属于查询方法,并且返回一个map对象 @Select("select * from table") public Map selectOne(); } ``` + 编写业务类,调用selectOne()方法获取查询结果 ```java @Test public void testSqlUtil(){ // 获取代理对象 IMapperTest mapper = Util.getMapper(IMapperTest.class); // 调用方法并获取返回值 Map result = mapper.selectOne(); System.out.println(result); } // 携带参数 //添加注解,标明需要对该类进行sql执行代理 @SqlMapper public interface IMapperTest { @Select("select * from table where id = #{id}") public Map selectOneById(int id); } @Test public void testSqlUtil(){ // 获取代理对象 IMapperTest mapper = Util.getMapper(IMapperTest.class); // 调用方法并获取返回值 Map result = mapper.selectOneById(10); System.out.println(result); } //携带多个参数 @SqlMapper public interface IMapperTest { // 使用多个参数需要使用@ParamMapper指定别名 @Select("select * from table where id = #{id} and name = #{name}") public Map selectOneByIdAndName(@ParamMapper("id") int id, @ParamMapper("name") String name); } @Test public void testSqlUtil(){ // 获取代理对象 IMapperTest mapper = Util.getMapper(IMapperTest.class); // 调用方法并获取返回值 Map result = mapper.selectOneByIdAndName(10,"aiyh"); System.out.println(result); } // 使用map或javaBean @Data public class License { private String license; private String companyName; private String cVersion; private String expireDate; } @SqlMapper public interface IMapperTest { // 使用多个参数需要使用@ParamMapper指定别名 @Select("select * from table where license = #{license} and companyName = #{companyName}") public Map selectOneByLicens(License license); } @Test public void testSqlUtil(){ // 获取代理对象 IMapperTest mapper = Util.getMapper(IMapperTest.class); // 调用方法并获取返回值 License license = new License(); license.setLicense("license"); license.setCompanyName("companyName"); Map result = mapper.selectOneByLicens(license); System.out.println(result); ``` 返回值可以是数组,其他更新,删除,插入操作类似。 其中#{字段名}为占位符,会被替换为?,${字段名}并不会替换为?,直接替换为字段值,当参数是数组时,并且sql使用的是 id in (\${list})时,数组会自动拼接位1,2,3,4类型的字符串 添加注解`@Select(custom = true)`或其他操作类型(插入,删除,更新)时,`custom=true`表示sql字符串需要为参数传递进来,需要使用`@SqlString`注解标明sql字符串,如 ```java @Select(custom = true) License selectOne(@SqlString String sql); ``` 参数可以正常传递 当方法上添加注解`@CaseConversion(false)`时,表示不会进行下划线转驼峰命名,如 ```java @Select("select * from table where id = #{id} and name like #{nameLike} and age > ${age}" + " and account = #{user.account} or userid = {user.uID}") @CaseConversion(false) Map selectOne(Map map); ``` 其他功能可执行探索,顺便一说,这个功能花了一天半时间完成的,所以代码写的很烂,后面可能会进行维护,也可以大家一起维护。 ## 第三方请求相关工具 开发时,经常会与第三方系统进行集成或者同步数据发送数据等功能,在此工具包中也进行了封装,其中方法分为了静态方法和需要实例化的方法。静态方法可以直接调用,并且所有通过此方法构建的请求都使用同一个全局参数和请求头。实例化调用的只有该对象调用的方法拥有相同的全局参数和 请求头。 使用 ```java @Test public void testRequest(){ // 构建工具实体 HttpUtils httpUtils = new HttpUtils(); // 获取该对象内的全局 请求头,可以对put来添加请求头信息 Map header = httpUtils.getGlobalCache().header; // 全局请求参数 Map paramMap = httpUtils.getGlobalCache().paramMap; // 调用方法 try { HashMap requestParams = new HashMap<>(); HashMap requestHeader = new HashMap<>(); ResponeVo responeVo = httpUtils.apiPost("url", requestParams, requestHeader); // 获取相应结果String类型的 String entityString = responeVo.getEntityString(); // 获取响应结果并转为Map对象 Map entityMap = responeVo.getEntityMap(); // 获取相应状态码 int code = responeVo.getCode(); } catch (IOException e) { e.printStackTrace(); } } ``` 更多方法查看源码及注释,多种用法,支持异步和同步,get、post、put、delate方法,支持发送表单数据,json数据以及上传文件 ## 其他增强工具 查看源码及注释 ### 获取配置文件 解析Properties文件为map对象,需要将Properties文件放到WEB-INF/prop/prop2map文件夹下 ```java @Test public void testReadProp(){ //传入文件名PatentWall,并且传入前缀aiyh.patentWall.search,自动将前缀之后的数据解析为map对象 Map patentWall = Util.readProperties2Map("PatentWall", "aiyh.patentWall.search"); System.out.println(JSON.toJSONString(patentWall)); } ``` 配置文件信息 ```properties aiyh.patentWall.search.dataResource=uf_zlqzsb aiyh.patentWall.search.inputs[0].type=2 aiyh.patentWall.search.inputs[0].dbFieldName=zlqr aiyh.patentWall.search.inputs[0].labelName=专利权人 aiyh.patentWall.search.inputs[0].labelIndex=-1023 aiyh.patentWall.search.inputs[0].searchType=1 aiyh.patentWall.search.inputs[0].value= aiyh.patentWall.search.inputs[1].type=2 aiyh.patentWall.search.inputs[1].dbFieldName=fmrsjr aiyh.patentWall.search.inputs[1].labelName=发明人/设计人 aiyh.patentWall.search.inputs[1].labelIndex=-1023 aiyh.patentWall.search.inputs[1].searchType=1 aiyh.patentWall.search.inputs[1].value= aiyh.patentWall.search.inputs[2].type=2 aiyh.patentWall.search.inputs[2].dbFieldName=zlcpmc aiyh.patentWall.search.inputs[2].labelName=专利产品名称 aiyh.patentWall.search.inputs[2].labelIndex=-1023 aiyh.patentWall.search.inputs[2].searchType=1 aiyh.patentWall.search.inputs[2].value= aiyh.patentWall.search.inputs[3].type=1 aiyh.patentWall.search.inputs[3].dbFieldName=zllx aiyh.patentWall.search.inputs[3].labelName=专利类型 aiyh.patentWall.search.inputs[3].labelIndex=-1023 aiyh.patentWall.search.inputs[3].searchType=1 aiyh.patentWall.search.inputs[3].multiple=true aiyh.patentWall.search.inputs[3].value= aiyh.patentWall.search.inputs[4].type=3 aiyh.patentWall.search.inputs[4].dbFieldName=zlsqrq aiyh.patentWall.search.inputs[4].labelName=专利申请日期 aiyh.patentWall.search.inputs[4].labelIndex=-1023 aiyh.patentWall.search.inputs[4].searchType=1 aiyh.patentWall.search.inputs[4].value= aiyh.patentWall.search.inputs[5].type=1 aiyh.patentWall.search.inputs[5].dbFieldName=zlzt aiyh.patentWall.search.inputs[5].labelName=专利状态 aiyh.patentWall.search.inputs[5].labelIndex=-1023 aiyh.patentWall.search.inputs[5].searchType=1 aiyh.patentWall.search.inputs[5].value= aiyh.patentWall.search.inputs[6].type=1 aiyh.patentWall.search.inputs[6].dbFieldName=sqlx aiyh.patentWall.search.inputs[6].labelName=授权类型 aiyh.patentWall.search.inputs[6].labelIndex=-1023 aiyh.patentWall.search.inputs[6].searchType=1 aiyh.patentWall.search.inputs[6].value= ``` 解析结果 ```json { "inputs": [ { "searchType": "1", "labelIndex": "-1023", "type": "2", "dbFieldName": "zlqr", "labelName": "专利权人", "value": "" }, { "searchType": "1", "labelIndex": "-1023", "type": "2", "dbFieldName": "fmrsjr", "labelName": "发明人/设计人", "value": "" }, { "searchType": "1", "labelIndex": "-1023", "type": "2", "dbFieldName": "zlcpmc", "labelName": "专利产品名称", "value": "" }, { "searchType": "1", "multiple": "true", "labelIndex": "-1023", "type": "1", "dbFieldName": "zllx", "labelName": "专利类型", "value": "" }, { "searchType": "1", "labelIndex": "-1023", "type": "3", "dbFieldName": "zlsqrq", "labelName": "专利申请日期", "value": "" }, { "searchType": "1", "labelIndex": "-1023", "type": "1", "dbFieldName": "zlzt", "labelName": "专利状态", "value": "" }, { "searchType": "1", "labelIndex": "-1023", "type": "1", "dbFieldName": "sqlx", "labelName": "授权类型", "value": "" } ], "dataResource": "uf_zlqzsb" } ```