当前位置: 首页 > news >正文

Java实现ORM第一个api-FindAll

经过几天的业余开发,今天终于到ORM对业务api本身的实现了,首先实现第一个查询的api

老的C#定义如下
在这里插入图片描述

因为Java的泛型不纯,所以无法用只带泛型的方式实现api,对查询类的api做了调整,第一个参数要求传入实体对象
在这里插入图片描述

首先补充基础方法

反射工具类,用来给实体设置属性值

package LIS.Core.Util;import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.net.URL;
import java.net.URLClassLoader;//反射工具类
public class ReflectUtil {//设置对象指定属性名字的值public static void SetObjValue(Object obj,String name,Object val){try {Class c = obj.getClass();//得到列信息Field declaredField = c.getDeclaredField(name);//布尔的处理if(declaredField.getType()==Boolean.class) {if(val.toString()=="1"){val=Boolean.TRUE;}else if(val.toString()=="0"){val=Boolean.FALSE;}else{val=Boolean.TRUE;}}//布尔的处理else if(declaredField.getType()==boolean.class) {if(val.toString()=="1"){val=true;}else if(val.toString()=="0"){val=false;}else{val=true;}}//布尔的处理else if(declaredField.getType()==int.class) {if(val==null){val=0;}}declaredField.set(obj, val);}catch (Exception ex){ex.printStackTrace();}}/// <summary>/// 用类型全名和程序集全名获得类型/// </summary>/// <param name="typeName">类型全名</param>/// <param name="assemblyName">程序集名</param>/// <returns></returns>public static Class GetType(String typeName, String assemblyName){try {//得到根路径Class<?> clazz = ReflectUtil.class;ClassLoader classLoader = clazz.getClassLoader();URL resourceURL1 = classLoader.getResource("");String bashePath = resourceURL1.getFile();//组装成jar包路径String jarPath=bashePath+assemblyName+".jar";File file = new File(jarPath);if (!file.exists()) {throw new Exception("未能找到"+jarPath+"的文件");}//反射得到类型//自己生成jar包路径URL url = file.toURI().toURL();URL[] urls = new URL[]{url};//加载程序集URLClassLoader loader = new URLClassLoader(urls);//加载类Class c = loader.loadClass(typeName);if(c!=null){return  c;}else{throw new Exception("未能构建类型"+typeName);}}catch (Exception ex){ex.printStackTrace();}return  null;}
}

HashTable转参数列表工具类,把老的HashTable传参数转换为内部ParaDto

package LIS.Core.Util;
import LIS.Core.Dto.ParamDto;
import java.util.List;
import java.util.HashMap;
import java.util.*;import java.util.Hashtable;public class HashToParam {//哈希表得到参数列表public static List<ParamDto> GetParam(Hashtable hs){List<ParamDto> retList=new ArrayList<ParamDto>();Enumeration keys = hs.keys();while(keys.hasMoreElements()) {String str = (String) keys.nextElement();ParamDto dto=new ParamDto();dto.Key=str;dto.Value=hs.get(str);retList.add(dto);}return retList;}
}

参数实体,传sql参数用

package LIS.Core.Dto;
//ORM参数对象
public class ParamDto {/// <summary>/// 关键字段名称/// </summary>public Object Key;/// <summary>/// 关键字段值/// </summary>public Object Value;///构造函数public ParamDto(){}//构造函数public ParamDto(Object key, Object value){this.Key = key;this.Value = value;}
}

ORM的FindAll实现

package LIS.DAL.ORM.EntityManager;import LIS.Core.Context.ObjectContainer;import java.lang.reflect.Type;
import java.sql.*;
import java.util.List;
import java.util.*;
import LIS.Core.Dto.*;public class EntityManagerImpl implements LIS.DAL.ORM.EntityManager.IEntityManager {/// <summary>/// 存会话信息/// </summary>LIS.Model.Bussiness.Sessions Session=null;/// <summary>/// 开启事务,该方法初始化一个新的事务/// </summary>public void BeginTransaction(){}/// <summary>/// 数据查询/// </summary>/// <typeparam name="T">实体类型</typeparam>/// <param name="model">传入一个空的或者非空的实体对象</param>/// <param name="param">参数哈希表,数据库列名称和值的键值对</param>/// <param name="orderField">排序字段,如RowID ASC,Name DESC</param>/// <param name="pageSize">页面大小。为-1,无条件查询所有数据</param>/// <param name="pageIndex">页码。为-1,无条件查询所有数据</param>/// <returns>对象集合</returns>public <T> List<T> FindAll(T model,Hashtable param, String orderField, int pageSize, int pageIndex){List<T> retList = new ArrayList<T>();//建立连接Connection conn = null;//commandPreparedStatement stmt = null;try {Class c = model.getClass();//转换参数List<ParamDto> para=LIS.Core.Util.HashToParam.GetParam(param);//得到数据库驱动工厂LIS.DAL.ORM.DBUtility.IDbFactory factory= LIS.Core.Context.ObjectContainer.GetTypeObject("LisMianDbFactory");//得到表信息LIS.DAL.ORM.Common.TableInfo tableInfo = LIS.DAL.ORM.Common.ModelToSqlUtil.GetTypeInfo(model);//得到sql语句String sql = LIS.DAL.ORM.Common.ModelToSqlUtil.GetSelectSqlByTableInfo(factory, tableInfo, para, null, null, orderField, false);//连接串,最后的是数据库名称String url = factory.GetConnectionString();//用户String user = factory.GetUserName();//密码String password = factory.GetUserPass();//加载驱动factory.LoadDriver();//数据库连接conn = DriverManager.getConnection(url,user,password);stmt = conn.prepareStatement(sql);//设置数据参数LIS.DAL.ORM.DBUtility.DBParaUtil.SetDBPara(stmt,para);//执行sql得到结果集ResultSet rs = stmt.executeQuery();// 处理查询结果while (rs.next()) {//一行数据T oneRow = (T) c.newInstance();//循环读取列数据放入实体中for(int j=0;j<tableInfo.ColList.size();j++){String ColName=tableInfo.ColList.get(j).Name;Object val=rs.getObject(ColName);//设置属性值LIS.Core.Util.ReflectUtil.SetObjValue(oneRow,ColName,val);}retList.add(oneRow);}// 关闭 ResultSet、Statement 和 Connection 对象rs.close();}catch (Exception ex){ex.printStackTrace();}finally {// 关闭资源try {if (stmt != null){stmt.close();}}catch (Exception se2) {}try {if (conn != null){conn.close();}}catch (Exception se2) {}}return retList;}/// <summary>/// 查询测试/// </summary>public void DBSelectTest(){LIS.DAL.ORM.DBUtility.IDbFactory factory= LIS.Core.Context.ObjectContainer.GetTypeObject("LisMianDbFactory");//连接串,最后的是数据库名称String url = factory.GetConnectionString();//用户String user = factory.GetUserName();//密码String password = factory.GetUserPass();//建立连接Connection conn = null;//commandPreparedStatement stmt = null;try {//加载驱动factory.LoadDriver();conn = DriverManager.getConnection(url,user,password);//编译和执行SQL语句,传输SQL参数查询1997-2000行String sql = "SELECT * FROM dbo.SYS_Form where \"RowID\">? and \"RowID\"<?;";stmt = conn.prepareStatement(sql);stmt.setInt(1,1997);stmt.setInt(2,2000);//结果集ResultSet rs = stmt.executeQuery();// 处理查询结果while (rs.next()) {//取列数据int RowID = rs.getInt("RowID");String CName = rs.getString("CName");String Path = rs.getString("Path");//输出System.out.println(RowID + "\t" + CName + "\t" + Path);}// 关闭 ResultSet、Statement 和 Connection 对象rs.close();}catch (Exception ex) {// 处理 JDBC 异常ex.printStackTrace();}finally {// 关闭资源try {if (stmt != null){stmt.close();}}catch (Exception se2) {}try {if (conn != null){conn.close();}}catch (Exception se2) {}}}/*** Query data object by primary key ID, mainly used for writing business logic with SQL.* The difference between this method and GetById is that it has an internal caching mechanism.* @param <T> Entity type* @param id Object RowID* @return Data object*/public <T> T dolerGet(Object id) {T model=null;model.getClass();//Class<?> type = T.class;//String typeName = type.getSimpleName();//System.out.println(typeName);return null;}///测试SQL生成public <T> void  InsertSqlTest1(){try {T model=null;Class c=model.getClass();model=(T)c.newInstance();LIS.DAL.ORM.Common.TableInfo tableInfo = LIS.DAL.ORM.Common.ModelToSqlUtil.GetTypeInfo(model);LIS.DAL.ORM.DBUtility.IDbFactory factory = LIS.Core.Context.ObjectContainer.GetTypeObject("LisMianDbFactory");String sql = LIS.DAL.ORM.Common.ModelToSqlUtil.GetSelectSqlByTableInfo(factory, tableInfo, null, null, null, "", true);System.out.println(sql);}catch (Exception ex){ex.printStackTrace();}}///测试SQL生成public <T> void  InsertSqlTest(T model){try {//Type type = EntityManagerImpl.class.getClass().getGenericSuperclass();//Class c = type.getClass();//System.out.println(c.getName());//System.out.println(model.getClass().getName());LIS.DAL.ORM.Common.TableInfo tableInfo = LIS.DAL.ORM.Common.ModelToSqlUtil.GetTypeInfo(model);LIS.DAL.ORM.DBUtility.IDbFactory factory = LIS.Core.Context.ObjectContainer.GetTypeObject("LisMianDbFactory");String sql = LIS.DAL.ORM.Common.ModelToSqlUtil.GetSelectSqlByTableInfo(factory, tableInfo, null, null, null, "", true);System.out.println(sql);}catch (Exception ex){ex.printStackTrace();}}/// <summary>/// 保存对象/// </summary>/// <typeparam name="T">实体类型</typeparam>/// <param name="entity">实体对象</param>/// <returns>影响行数</returns>public <T> int Save(T entity){return  0;}
}

实体转Sql的工具类

package LIS.DAL.ORM.Common;
import LIS.Core.CustomAttributes.*;
import LIS.Core.Dto.*;
import LIS.Core.Dto.ParamDto;
import java.util.*;
import java.util.List;
import LIS.DAL.ORM.Common.TableInfo;
import LIS.DAL.ORM.DBUtility.IDbFactory;import java.lang.annotation.Annotation;
import java.lang.reflect.*;
import LIS.DAL.ORM.Common.ColumnInfo;
import LIS.DAL.ORM.Common.TableInfo;
import LIS.Core.Util.ReflectUtil;
import LIS.Core.CustomAttributes.TableAttribute;//通过实体类型得到SQL的工具类
public class ModelToSqlUtil {//通过实体对象得到表信息public static TableInfo GetTypeInfo(Object model) {if (model == null) {return null;}try {//返回的对象TableInfo tableInfo = new TableInfo();Class c = model.getClass();//得到表特性Annotation[] annoList = c.getAnnotations();if (annoList != null && annoList.length > 0) {for (int i = 0; i < annoList.length; i++) {//表特性if (annoList[i] instanceof TableAttribute) {tableInfo.TableInfo = (TableAttribute) annoList[i];}//唯一特性else {tableInfo.UniqueList.add((UniqueAttribute) annoList[i]);}}}//得到列信息Field[] declaredFields = c.getDeclaredFields();for (int i = 0; i < declaredFields.length; i++) {LIS.DAL.ORM.Common.ColumnInfo col = new LIS.DAL.ORM.Common.ColumnInfo();FrekeyAttribute fk = declaredFields[i].getAnnotation(FrekeyAttribute.class);col.FkInfo = fk;col.Name = declaredFields[i].getName();col.ColType = declaredFields[i].getType();col.Value = declaredFields[i].get(model);tableInfo.ColList.add(col);}return tableInfo;} catch (Exception ex) {ex.printStackTrace();}return null;}//通过表信息和参数列表组装查询SQL//factory:驱动工厂//tableInfo:表信息//para:参数//operList:参数对应的操作符列表//linkList:多个参数之间连接的操作符 and or这种//orderBySql:Order By的SQL语句//IsFk:是否组装外键查询的SQLpublic static String GetSelectSqlByTableInfo(IDbFactory factory,TableInfo tableInfo, List<ParamDto> para,List<String> operList,List<String> linkList, String orderBySql,Boolean IsFk){StringBuilder sb=new StringBuilder();sb.append("select ");//是否含有序号列boolean HasSequence=false;boolean HasSeqNum=false;//组装查询列for(int i=0;i<tableInfo.ColList.size();i++){//存列名String columnName = tableInfo.ColList.get(i).Name;if(columnName=="Sequence"){HasSequence=true;}else if(columnName=="SeqNum"){HasSeqNum=true;}//组装查询列if(i==0){sb.append(factory.DealPropertyName(columnName));}else{sb.append(","+factory.DealPropertyName(columnName));}//组装外键查询信息if(IsFk==true&&tableInfo.ColList.get(i).FkInfo!=null) {FrekeyAttribute fkAttr=tableInfo.ColList.get(i).FkInfo;String refTableName=factory.DealTableName(GetTableName(ReflectUtil.GetType("LIS.Model.Entity." + fkAttr.Name(), "LIS.Model")));sb.append("," + "(select " + factory.DealPropertyName(fkAttr.AssociaField()) + " from " + refTableName + " where ti." + factory.DealPropertyName(columnName) + "=" + refTableName + "." + factory.DealPropertyName(fkAttr.RefColumnName()) + ") as " + factory.DealPropertyName(columnName + "_" + fkAttr.Name() + "_" + fkAttr.AssociaField()));//如果有拉取字段1,查询拉取字段if (fkAttr.AssociaField1() != ""){sb.append("," + "(select " + factory.DealPropertyName(fkAttr.AssociaField1()) + " from " + refTableName + " where ti." + factory.DealPropertyName(columnName) + "=" + refTableName + "." + factory.DealPropertyName(fkAttr.RefColumnName()) + ") as " + factory.DealPropertyName(columnName + "_" + fkAttr.Name() + "_" + fkAttr.AssociaField1()));}//如果有拉取字段2,查询拉取字段if (fkAttr.AssociaField2() != ""){sb.append("," + "(select " + factory.DealPropertyName(fkAttr.AssociaField2()) + " from " + refTableName + " where ti." + factory.DealPropertyName(columnName) + "=" + refTableName + "." + factory.DealPropertyName(fkAttr.RefColumnName()) + ") as " + factory.DealPropertyName(columnName + "_" + fkAttr.Name() + "_" + fkAttr.AssociaField2()));}}}sb.append(" from " + factory.DealTableName(tableInfo.TableInfo.Name()) + " ti ");//组装查询参数if(para!=null&&para.size()>0){sb.append(" where ");for(int i=0;i<para.size();i++){String oper="=";if(operList!=null&&operList.size()>i){oper=operList.get(i);}String link="and";if(operList!=null&&operList.size()>i-1){link=operList.get(i-1);}if(i==0) {sb.append(factory.DealPropertyName(para.get(i).Key.toString()) + oper + factory.DealSqlPara(para.get(i).Key.toString()));}else{sb.append(" "+link+" "+factory.DealPropertyName(para.get(i).Key.toString()) + oper + factory.DealSqlPara(para.get(i).Key.toString()));}}}//存组装的排序sqlString strSort = "";//如果传入了排序字段,组装排序语句if (orderBySql != null && orderBySql.length() > 0){//用来存处理的排序串String dealStr = "";//先分割多个排序条件String[] strList = orderBySql.split(",");for (int m = 0; m < strList.length; m++){//分开多个排序条件if (m > 0){dealStr += ",";}//分开字段名称和升降序String[] strSubList = strList[m].split(" ");//处理字段名称dealStr += factory.DealPropertyName(strSubList[0]);//组装处理的串for (int n = 1; n < strSubList.length; n++){dealStr += " " + strSubList[n];}}//组装排序串strSort = " Order By " + dealStr;}else{if (HasSequence){strSort = " Order By " + factory.DealPropertyName("Sequence") + " ASC";}else if (HasSeqNum){strSort = " Order By " + factory.DealPropertyName("SeqNum") + " ASC";}else{strSort = "";}}sb.append(strSort);return sb.toString();}//通过实体类型得到实体表名称private static String GetTableName(Class c){//存表名String strTableName = "";//得到表特性TableAttribute tableInfo = null;//得到表特性Annotation[] annoList = c.getAnnotations();if (annoList != null && annoList.length > 0) {for (int i = 0; i < annoList.length; i++) {//表特性if (annoList[i] instanceof TableAttribute) {tableInfo = (TableAttribute) annoList[i];strTableName=tableInfo.Name();break;}}}return strTableName;}
}

数据库驱动工厂,增加得到用户名和密码的方法接口

package LIS.DAL.ORM.DBUtility;//数据驱动层接口,ORM基于此加载驱动和执行SQL
public interface IDbFactory {//得到数据库类型String GetStrDbType();//得到数据库连接串String GetConnectionString();//得到数据库用户名String GetUserName();//得到数据库密码String GetUserPass();//得到返回查询的RowID的SQL语句String GetReturnRowIDSql();//处理表名称,用来适配不同数据库间的属性命名差异String DealTableName(String tableName);//处理属性名字String DealPropertyName(String propertyName);//DealSqlParaString DealSqlPara(String propertyName);//加载驱动void LoadDriver();
}

调用测试,这里引入了阿里的对象转JSON库,fastjson

package com.company;
//import org.apache.commons.configuration.ConfigurationException;
//import org.apache.commons.configuration.PropertiesConfiguration;
import LIS.Model.Entity.SYSForm;
import LIS.Model.Entity.SYSUser;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.*;
import java.net.URL;
import java.util.List;
import java.util.HashMap;
import java.util.*;
import com.alibaba.fastjson.*;public class Main {public static void main(String[] args) {//用容器的配置xml初始化容器LIS.Core.Context.ObjectContainer.InitIoc();//ORM通过容器取数据库驱动工厂LIS.DAL.ORM.EntityManager.EntityManagerImpl orm=new LIS.DAL.ORM.EntityManager.EntityManagerImpl();//执行查询测试orm.DBSelectTest();//测试通过实体得到SQL语句orm.InsertSqlTest(new SYSForm());orm.InsertSqlTest(new SYSUser());//调用ORM的FindAll测试Hashtable hs=new Hashtable();hs.put("Code","QC");List<SYSForm> formList=orm.FindAll(new SYSForm(),hs,"RowID desc",-1,-1);Object json=JSONObject.toJSON(formList);System.out.println("查询的LIST数据:"+json.toString());}
}

测试结果
在这里插入图片描述

把依赖的不稳定搞定后就快多了,轻松加愉快,哈哈。不过发现泛型不如C#强,方法不支持默认参数,尤其是方法不支持默认参数这个真不像一个现代语言,总体使用语法特性方面和工程依赖方面和IDE体验和C#比差多了,末日黄花喽,官方闭源,语法古老

相关文章:

Java实现ORM第一个api-FindAll

经过几天的业余开发&#xff0c;今天终于到ORM对业务api本身的实现了&#xff0c;首先实现第一个查询的api 老的C#定义如下 因为Java的泛型不纯&#xff0c;所以无法用只带泛型的方式实现api&#xff0c;对查询类的api做了调整&#xff0c;第一个参数要求传入实体对象 首先…...

HFSS笔记——求解器和求解分析

文章目录 1、求解器2、求解类型3、自适应网格剖分4、求解频率选择4.1 求解设置项的含义4.2 扫频类型 1、求解器 自从ANSYS将HFSS收购后&#xff0c;其所有的求解器都集成在一起了&#xff0c;点击Project&#xff0c;会显示所有的求解器类型。 其中&#xff0c; HFSS design&…...

jenkins配置gitlab凭据

下载Credentials Binding插件&#xff08;默认是已经安装了&#xff09; 在凭据配置里添加凭据类型 点击保存 Username with password&#xff1a; 用户名和密码 SSH Username with private 在凭据管理里面添加gitlab账号和密码 点击全局 点击添加凭据&#xff08;版本不同…...

0基础学习PyFlink——用户自定义函数之UDTF

大纲 表值函数完整代码 在《0基础学习PyFlink——用户自定义函数之UDF》中&#xff0c;我们讲解了UDF。本节我们将讲解表值函数——UDTF 表值函数 我们对比下UDF和UDTF def udf(f: Union[Callable, ScalarFunction, Type] None,input_types: Union[List[DataType], DataTy…...

【Java 进阶篇】Java Request 原理详解

在网络应用开发中&#xff0c;HTTP请求是一项常见而关键的任务。当我们使用Java编写网络应用时&#xff0c;了解HTTP请求的工作原理变得至关重要。本文将详细介绍Java中HTTP请求的原理&#xff0c;包括请求的结构、发送请求的方法以及处理请求的过程。 HTTP请求的基本结构 HT…...

13 结构性模式-装饰器模式

1 装饰器模式介绍 在软件设计中,装饰器模式是一种用于替代继承的技术,它通过一种无须定义子类的方式给对象动态的增加职责,使用对象之间的关联关系取代类之间的继承关系. 2 装饰器模式原理 //抽象构件类 public abstract class Component{public abstract void operation(); }…...

支持向量机(SVM)

一. 什么是SVM 1. 简介 SVM&#xff0c;曾经是一个特别火爆的概念。它的中文名&#xff1a;支持向量机&#xff08;Support Vector Machine, 简称SVM&#xff09;。因为它红极一时&#xff0c;所以关于它的资料特别多&#xff0c;而且杂乱。虽然如此&#xff0c;只要把握住SV…...

Rabbitmq----分布式场景下的应用

服务异步通信-分布式场景下的应用 如果单机模式忘记也可以看看这个快速回顾rabbitmq,在做学习 消息队列在使用过程中&#xff0c;面临着很多实际问题需要思考&#xff1a; 1.消息可靠性 消息从发送&#xff0c;到消费者接收&#xff0c;会经理多个过程&#xff1a; 其中的每一…...

springboot + redis实现签到与统计功能

在很多项目中都会有签到与统计功能&#xff0c;最容易想到的方案是创建一个签到表来记录每个用户的签到记录&#xff0c;比如设计一个mysql数据库表&#xff1a; CREATE TABLE tb_sign id bigint(20) unsigned NOT NULL AUTOINCREMENT COMMENT 主键, user_id bigint(20) unsig…...

Redis | 数据结构(02)SDS

一、键值对数据库是怎么实现的&#xff1f; 在开始讲数据结构之前&#xff0c;先给介绍下 Redis 是怎样实现键值对&#xff08;key-value&#xff09;数据库的。 Redis 的键值对中的 key 就是字符串对象&#xff0c;而 value 可以是字符串对象&#xff0c;也可以是集合数据类型…...

Linux C语言开发-D7D8运算符

算术运算符&#xff1a;-*/%&#xff0c;浮点数可以参与除法运算&#xff0c;但不能参与取余运算 a%b&#xff1a;表示取模或取余 关系运算符&#xff1a;<,>,>,<,,! 逻辑运算符:!,&&,|| &&,||逻辑运算符是从左到右&#xff0c;依次运算&#…...

redis 配置主从复制,哨兵模式案例

哨兵(Sentinel)模式 1 . 什么是哨兵模式&#xff1f; 反客为主的自动版&#xff0c;能够自动监控master是否发生故障&#xff0c;如果故障了会根据投票数从slave中挑选一个 作为master&#xff0c;其他的slave会自动转向同步新的master&#xff0c;实现故障自动转义 2 . 原理…...

Python---练习:使用for循环实现用户名+密码认证

案例&#xff1a; 用for循环实现用户登录 ① 输入用户名和密码 ② 判断用户名和密码是否正确&#xff08;usernamelaowang&#xff0c;passwordlw123&#xff09; ③ 登录仅有三次机会&#xff0c;超过3次会报错 思考&#xff1a; 用户登陆情况有3种: ① 用户名错误(此时…...

react中使用jquery 语法

react中使用jquery 语法 npm install jquery引入 import $ from ‘jquery’ import React from react; import ./css/App.css import { Button } from antd; import $ from jquerylet slider_img [https://cdn.jsdelivr.net/gh/xaoxuu/cdn-wallpaper/abstract/41F215B9-261F…...

服务器中了360后缀勒索病毒怎么解决,勒索病毒解密,数据恢复

近期&#xff0c;网络上的各种病毒都比较猖獗&#xff0c;而其中较为明显的就是360后缀勒索病毒&#xff0c;从这个月开始云天数据恢复中心接到很多企业的求助&#xff0c;企业的服务器遭到了360后缀勒索病毒的攻击&#xff0c;通过给用户的服务器检测与加密病毒的分析&#xf…...

使用字节流读取文件中的数据的几种方式

public class FileReader02_ {public static void main(String[] args) {}Testpublic void m1() {String filePath "e:\\hello.txt";FileReader fileReader null;int date0;try {fileReader new FileReader(filePath);//循环读取 使用readwhile ((datefileReader.…...

Android WMS——概述(一)

Android 中的 WMS 指的是 Window Manager Service(窗口管理服务)。WMS 是 Android 系统中的核心服务,主要分为四大部分,分别是窗口管理,窗口动画,输入系统中转站和 Surface 管理 。负责管理应用程序窗口的创建、移动、调整大小和显示等操作。 一、功能简介 WMS 的职责可…...

Node编写获取用户信息接口

目录 前言 初始化路由模块 使用postman发送get获取用户信息请求 初始化路由处理函数模块 获取用户基本信息 前言 在前两篇文章中已经介绍了如何编写用户注册接口以及用户登录接口&#xff0c;这篇文章介绍如何获取用户信息&#xff0c;本篇文章建立在Node编写用户登录接口…...

【从0到1设计一个网关】自研网关的设计要点以及架构设计

文章目录 请求的流程架构设计设计要点项目架构流程设计源码地址: 源码地址 请求的流程 一个HTTP请求发送到网关并完成整个生命周期通常包括以下步骤: 客户端请求: 请求始于客户端,客户端通过HTTP请求(例如GET、POST等)发送请求到API网关的入口点。 API网关接收: API…...

论文-分布式-分布式计算|容错-分布式控制下的自稳定系统

参考文献Self-stabilizing systems in spite of distributed control可以把松散耦合的 循环序列过程 间的同步任务&#xff0c;看成是要保持一个这样的不变性&#xff1a;“系统要处于一种合法状态”因此每个进程在运行每一个可能会改变不变性的步骤之前都要先检查一下是可以执…...

37、三种事件处理方式优先级---------事件系统

三种事件处理方式优先级我们学习了三种是事件处理方式 1重写event函数 2重写具体的事件函数 3重写事件过滤器并安装 那么这三种方式&#xff0c;调用的顺序会怎么样呢&#xff1f; 我们还是在MainWindow中创建一个按钮&#xff0c;然后用三种方式捕获这个按钮的点击事件&#x…...

Windows下OpenClaw安装指南:一键对接Phi-3-mini-128k-instruct模型

Windows下OpenClaw安装指南&#xff1a;一键对接Phi-3-mini-128k-instruct模型 1. 为什么选择OpenClawPhi-3-mini组合&#xff1f; 去年我在尝试自动化办公流程时&#xff0c;发现市面上的RPA工具要么太笨重&#xff0c;要么需要复杂的编程。直到遇到OpenClaw这个开源智能体框…...

避开Arduino PID编程的3个常见坑:为什么你的控制总是不稳?

Arduino PID控制实战&#xff1a;避开3个致命陷阱实现精准调节 当你在深夜盯着反复震荡的电机转速曲线&#xff0c;或是加热棒温度始终无法稳定的数据时&#xff0c;是否怀疑过自己复制的PID代码有问题&#xff1f;这不是你的错觉——大多数Arduino PID控制问题都源于三个容易被…...

轻松掌握gallery多渠道打包:为不同应用商店构建专属本地AI平台版本

轻松掌握gallery多渠道打包&#xff1a;为不同应用商店构建专属本地AI平台版本 【免费下载链接】gallery A gallery that showcases on-device ML/GenAI use cases and allows people to try and use models locally. 项目地址: https://gitcode.com/GitHub_Trending/gallery…...

你的ESP32项目还缺个BGM?手把手教你做个可切换歌单的迷你音乐播放器

为ESP32项目打造智能音乐模块&#xff1a;从蜂鸣器驱动到歌单管理系统 当你的智能家居设备在清晨用一段舒缓旋律唤醒你&#xff0c;或是机器人完成指令时播放一段俏皮的提示音&#xff0c;这种交互体验会瞬间提升产品的温度。ESP32作为一款功能强大的物联网芯片&#xff0c;完全…...

OpenClaw效率对比:Qwen2.5-VL-7B与传统OCR工具在文档处理中的表现

OpenClaw效率对比&#xff1a;Qwen2.5-VL-7B与传统OCR工具在文档处理中的表现 1. 测试背景与动机 最近在整理公司历史项目文档时&#xff0c;遇到了一个棘手的问题&#xff1a;大量扫描版PDF和图片格式的技术文档需要数字化处理。这些文档包含代码片段、手写注释和复杂表格&a…...

代理商客户归管+赊欠账明细查询,易特进销存商贸版一键解决

做商贸生意的朋友&#xff0c;大概率会遇到这样的难题&#xff1a;发展了代理商拓展市场&#xff0c;代理商的客户却需要公司统一管理&#xff0c;既要明确客户归属&#xff0c;又要精准统计赊欠账目。比如代理商张三&#xff0c;总共欠公司1万元&#xff0c;查账时想清晰看到他…...

深入解析epoll:高并发网络编程核心技术

1. 理解高并发场景下的网络通信挑战在现代网络服务中&#xff0c;处理大量并发连接是一个常见需求。想象一个即时通讯服务器需要同时维持上百万用户的TCP连接&#xff0c;但实际活跃用户&#xff08;正在收发消息的&#xff09;可能只有几百个。传统做法如select/poll需要每次将…...

OpenClaw+千问3.5-9B:个性化新闻摘要与推送系统

OpenClaw千问3.5-9B&#xff1a;个性化新闻摘要与推送系统 1. 为什么需要个人新闻助手&#xff1f; 每天早上打开新闻App&#xff0c;总会被各种无关信息轰炸——明星八卦、标题党、重复推送...作为一个技术从业者&#xff0c;我真正需要的是垂直领域的高质量内容。尝试过RSS…...

LLM wiki:karpathy 公开构建个人本地知识库详细方法「超强提示词」

来源&#xff1a;AI寒武纪 前两天我写文章介绍了Andrej Karpathy构建个人本地知识库的工作流方法&#xff0c;目前这个思路已经火爆全网 Karpathy最新硬核分享&#xff1a;用大模型和Obsidian打造个人本地知识库 不过有朋友抱怨AK是在炫技&#xff0c;没有操作性&#xff0c;不…...