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

制作数据库框架

一  利用前端条件组装sql与查询条件的集合

public void handle() throws Exception{

Map<String,String> requestMap = new HashMap();

String fromdate = requestMap.get("fromdate");

String todate = requestMap.get("todate");

String resultcode = requestMap.get("reultcode");

SimpleDateFormat yyyy1mm1dd = new SimpleDateFormat("yyyy-MM-dd");

List values = new ArrayList();

String sql="select d.* checkpaylog where 1=1 ";

if(!StringUtils.isBlank(fromdate)){

sql+=" and d.tdate>=? ";

values.add(yyyy1mm1dd.parse(fromdate));

}

if(!StringUtils.isBlank(todate)){

sql+=" and d.tdate<=? ";

values.add(yyyy1mm1dd.parse(todate));

}

if(!"-1".equals(resultcode)){

sql+=" and d.resultcode=? ";

values.add(resultcode);

}

Map classMap = getClassMap(Checkpaylog.class);

query(sql, values, classMap, Checkpaylog.class, 0, 30 );

}

二  getClassMap方法是通过反射获取结果类的字段与set方法与方法类型

public Map getClassMap(Class entiy){

Field[] declaredFields = entiy.getClass().getDeclaredFields();

Map map = new HashMap();

for (int i = 0; i <declaredFields.length ; i++) {

//设置是否可以访问,如果不设置将报错

declaredFields[i].setAccessible(true);

String type = declaredFields[i].getType().getName();

String name = declaredFields[i].getName();

String strT = name.substring(0, 1);

String strW = name.substring(1, name.length());

String method_set = "set" + strT.toUpperCase() + strW;

System.out.println("字段名称:"+name);

System.out.println("类型:"+type);

map.put(name.toLowerCase(),name);

map.put(name+"type",type);

map.put(name+"method",method_set);

}

return map;

}

三  query方法是组装sql并执行后解析结果集

public List query(String sql, List pvalues,Map classMap, Class entiy, int start, int limit)throws Exception{

ResourceBundle resource = ResourceBundle.getBundle("config");

String url = resource.getString("jdbc.url");

String user = resource.getString("jdbc.username");

String pwd = resource.getString("jdbc.password");

Class.forName("com.mysql.jdbc.Driver");

Connection con = DriverManager.getConnection(url, user, pwd);

List list = new ArrayList();

if (start == -1 && limit == -1) {

sql=sql;

}else{

sql = sql + "limit " + start+","+limit;

}

PreparedStatement query = null;

ResultSet set = null;

try {

query = con.prepareStatement(sql);

if (pvalues != null) {

for (int i = 0; i < pvalues.size(); i++) {

if (pvalues.get(i) instanceof String) {

query.setString(i+1, (String) pvalues.get(i));

} else if (pvalues.get(i) instanceof Date) {

query.setDate(i+1, new java.sql.Date( ((Date)pvalues.get(i)).getTime()));

} else if (pvalues.get(i) instanceof Timestamp) {

query.setTimestamp(i+1, (Timestamp) pvalues.get(i));

} else if (pvalues.get(i) instanceof Long) {

query.setLong(i+1, (Long) pvalues.get(i));

} else if (pvalues.get(i) instanceof Double) {

query.setDouble(i+1, (Double) pvalues.get(i));

} else {

query.setString(i+1, (String) pvalues.get(i));

}

}

}

set = query.executeQuery();

ResultSetMetaData metadata = set.getMetaData();

int columCount = metadata.getColumnCount();

Map map = null;

while (set.next()) {

map = new HashMap<String, Object>();

Class<? extends Class> entiyClass = entiy.getClass();

for (int i = 1; i <= columCount; i++) {

String key = metadata.getColumnLabel(i).toLowerCase();

String columName = (String) classMap.get(key);

if("".equals(columName)){

break;

}

Object value = set.getObject(i);

if(value==null ){

value =null;

}else if(value instanceof TIMESTAMP){

value = (Timestamp)((TIMESTAMP) value).toJdbc();

}else if (value instanceof java.sql.Date){

if(value.toString().length()>10){

value = set.getTimestamp(i);

}else{

value = set.getDate(i);

}

}else if(value instanceof java.math.BigDecimal){

if(value.toString().indexOf(".")!=-1){

value = String.valueOf(((java.math.BigDecimal) value).doubleValue());

}

}else if (value instanceof java.lang.Long){

value = Long.valueOf(String.valueOf(value));

} else {

value = value.toString();

}

String methodName = (String) classMap.get(key + "method");

Class<?> aClass = (Class<?>) classMap.get(key + "types");

Class instance = entiyClass.getConstructor().newInstance();

Method setGuid = instance.getDeclaredMethod(methodName, aClass);

setGuid.invoke(instance,value);

}

list.add(entiy);

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

if(set!=null){

try {

set.close();

} catch (SQLException e) {

}

}

if(query!=null){

try {

query.close();

} catch (SQLException e) {

}

}

}

return list;

}

四  如果结果集是左连接形成的集合,这时用map来接受结果的方法findMapsBySQL来替换query方法

public List findMapsBySQL(String sql, List pvalues, int start, int limit) throws Exception{

ResourceBundle resource = ResourceBundle.getBundle("config");

String url = resource.getString("jdbc.url");

String user = resource.getString("jdbc.username");

String pwd = resource.getString("jdbc.password");

Class.forName("com.mysql.jdbc.Driver");

Connection con = DriverManager.getConnection(url, user, pwd);

List list = new ArrayList();

if (start == -1 && limit == -1) {

sql=sql;

}else{

sql = sql + "limit " + start+","+limit;

}

PreparedStatement query = null;

ResultSet set = null;

try {

query = con.prepareStatement(sql);

if (pvalues != null) {

for (int i = 0; i < pvalues.size(); i++) {

if (pvalues.get(i) instanceof String) {

query.setString(i+1, (String) pvalues.get(i));

} else if (pvalues.get(i) instanceof Date) {

query.setDate(i+1, new java.sql.Date( ((Date)pvalues.get(i)).getTime()));

} else if (pvalues.get(i) instanceof Timestamp) {

query.setTimestamp(i+1, (Timestamp) pvalues.get(i));

} else if (pvalues.get(i) instanceof Long) {

query.setLong(i+1, (Long) pvalues.get(i));

} else if (pvalues.get(i) instanceof Double) {

query.setDouble(i+1, (Double) pvalues.get(i));

} else {

query.setString(i+1, (String) pvalues.get(i));

}

}

}

set = query.executeQuery();

ResultSetMetaData metadata = set.getMetaData();

int columCount = metadata.getColumnCount();

Map map = null;

while (set.next()) {

map = new HashMap<String, Object>();

for (int i = 1; i <= columCount; i++) {

Object value = set.getObject(i);

if(value==null ){

value =null;

}else if(value instanceof TIMESTAMP){

value = (Timestamp)((TIMESTAMP) value).toJdbc();

}else if (value instanceof java.sql.Date){

if(value.toString().length()>10){

value = set.getTimestamp(i);

}else{

value = set.getDate(i);

}

}else if(value instanceof java.math.BigDecimal){

if(value.toString().indexOf(".")!=-1){

value = String.valueOf(((java.math.BigDecimal) value).doubleValue());

}

}else {

value = value.toString();

}

String key = metadata.getColumnLabel(i).toLowerCase();

map.put(key, value);

}

list.add(map);

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

if(set!=null){

try {

set.close();

} catch (SQLException e) {

}

}

if(query!=null){

try {

query.close();

} catch (SQLException e) {

}

}

}

return list;

}

相关文章:

制作数据库框架

一 利用前端条件组装sql与查询条件的集合public void handle() throws Exception{Map<String,String> requestMap new HashMap();String fromdate requestMap.get("fromdate");String todate requestMap.get("todate");String resultcode reque…...

Winbond W25Qxx SPI FLASH 使用示例(基于沁恒CH32V307单片机)

文章目录目的基础说明使用示例总结目的 Winbond&#xff08;华邦&#xff09;的 W25Qxx 系列 SPI FLASH 是比较常用的芯片&#xff0c;这篇文章将演示单片机中通过SPI使用该芯片的操作过程。 本文使用沁恒官方的开发板 &#xff08;CH32V307-EVT-R1沁恒RISC-V模块MCU赤兔评估…...

贪心算法的原理以及应用

文章目录0、概念0.1.定义0.2.特征0.3.步骤0.4.适用1、与动态规划的联系1.1.区别1.2.联系2、例子3、总结4、引用0、概念 0.1.定义 贪心算法&#xff08;greedy algorithm &#xff0c;又称贪婪算法&#xff09;是指&#xff0c;在对问题求解时&#xff0c;总是做出在当前看来是…...

WebRTC拥塞控制原理之一基本介绍

1 基本原理 WebRTC的拥塞控制模块使用的是基于TCP的拥塞控制算法。它是根据网络带宽和延迟等信息来自适应地调整传输速率的。 具体来说&#xff0c;该模块采用的是基于RFC 3550中的延迟抖动调整算法的改进版本。该算法实施的基本原理是在传输的过程中定期探测网络的质量和延迟…...

选择 .NET 的 n 个理由

自从我们启动快速发展的 .NET 开源和跨平台项目以来&#xff0c;.NET 发生了很大变化。我们重新思考并完善了该平台&#xff0c;添加了专为性能和安全性而设计的新低级功能&#xff0c;以及以生产力为中心的高级功能。Span<T>、硬件内在函数和可为空的引用类型都是示例。…...

spark第三章:工程化代码

系列文章目录 spark第一章&#xff1a;环境安装 spark第二章&#xff1a;sparkcore实例 spark第三章&#xff1a;工程化代码 文章目录系列文章目录前言一、三层架构二、拆分WordCount1.三层拆分2.代码抽取总结前言 我们上一次博客&#xff0c;完成了一些案例的练习&#xff0…...

Vue实战【封装一个简单的列表组件,实现增删改查】

文章目录&#x1f31f;前言&#x1f31f;table组件封装&#x1f31f;父组件&#xff08;展示表格的页面&#xff09;&#x1f31f;控制台查看父子组件通信是否成功&#x1f31f;Vue2父子组件传递参数&#x1f31f;写在最后&#x1f31f;JSON包里写函数&#xff0c;关注博主不迷…...

微前端(无界)

前言&#xff1a;微前端已经是一个非常成熟的领域了&#xff0c;但开发者不管采用哪个现有方案&#xff0c;在适配成本、样式隔离、运行性能、页面白屏、子应用通信、子应用保活、多应用激活、vite 框架支持、应用共享等用户核心诉求都或存在问题&#xff0c;或无法提供支持。本…...

强烈推荐:0基础入门网安必备《网络安全知识图谱》

蚁景网安学院一直专注于网安实战技能培养&#xff0c;提供全方位的网安安全学习解决方案。我们集聚专业网安技术大佬资源&#xff0c;倾力打造了这本更全面更系统的“网络安全知识图谱”&#xff0c;让大家在网络安全学习路上不迷茫。 在这份网安技能地图册里&#xff0c;我们对…...

网络技术与应用概论(上)——“计算机网络”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容依旧是计算机网络的一些知识点噢&#xff0c;下面&#xff0c;让我们进入计算机网络的世界吧 网络内涵 网络特征 网络定义 互联网发展过程 从ARPA网络到Internet 从低速互联网到高速互联网 从数据结构到统一网…...

JAVASE/封装、继承、多态

博客制作不易&#xff0c;欢迎各位点赞&#x1f44d;收藏⭐关注前言在学习面向对象编程语言时&#xff0c;封装、继承、多态则是我们必须学习和使用的三大特征。本文通过举例&#xff0c;说明了该三大特征的基本权限特点。一、访问限定符范围private默认权限protectedpublic同一…...

SpringBoot ElasticSearch 【SpringBoot系列16】

SpringCloud 大型系列课程正在制作中&#xff0c;欢迎大家关注与提意见。 程序员每天的CV 与 板砖&#xff0c;也要知其所以然&#xff0c;本系列课程可以帮助初学者学习 SpringBooot 项目开发 与 SpringCloud 微服务系列项目开发 elasticsearch是一款非常强大的开源搜索引擎&a…...

Virtual box磁盘大小调整操作

Virtual box磁盘大小调整操作环境说明思路操作1、挂载要压缩的硬盘到 ~/data2、填充 0 文件3、删除 全是0空文件4、虚拟机关机5、在windows环境下用VBoxManage.exe 进行压缩硬盘加大环境说明 主机 windows 虚拟机 ubuntu 分配了 80G 的硬盘&#xff0c;现在已经占用 80 G 了。…...

MySQL注入秘籍【上篇】

MySQL注入秘籍【上篇】1.数据库敏感信息常用语句2.联合(UNION)查询注入3.报错注入原理常见报错注入函数1.数据库敏感信息常用语句 获取数据库版本信息 select version(); select innodb_version;获取当前用户 select user();获取当前数据库 select database()&#xff1b;数…...

简单三步解决动态规划难题,记好这三步,动态规划就不难

目录一、简单的一维DP剑指 Offer 10- I. 斐波那契数列1、三板斧解决问题2、优雅的解决问题剑指 Offer 63 股票的最大利润1、三板斧解决问题2、优雅的解决问题二、进阶的二维DP剑指offer47 礼物的最大价值1、三板斧解决问题2、优雅的解决问题编辑距离1、三板斧解决问题2、优雅的…...

算法进阶指南打卡

文章目录 基本算法 位运算递推与递归前缀和与差分二分排序倍增贪心总结与练习基本数据结构 栈队列链表与邻接表Hash字符串Tire二叉堆总结与练习搜索 树与图的遍历深度优先搜索剪枝迭代加深广度优先搜索广度变形A*IDA*总结与练习数学知识 质数约数同余矩阵乘法高斯消元与线性空…...

Chapter6.2:其他根轨迹及综合实例分析

该系列博客主要讲述Matlab软件在自动控制方面的应用&#xff0c;如无自动控制理论基础&#xff0c;请先学习自动控制系列博文&#xff0c;该系列博客不再详细讲解自动控制理论知识。 自动控制理论基础相关链接&#xff1a;https://blog.csdn.net/qq_39032096/category_10287468…...

3. 无重复字符的最长子串——滑动窗口

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。 示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为无…...

ChatGPT研究分享:机器第一次开始理解人类世界

0、为什么会对ChatGPT感兴趣一开始&#xff0c;我对ChatGPT是没什么关注的&#xff0c;无非就是有更大的数据集&#xff0c;完成了更大规模的计算&#xff0c;所以能够回答更多的问题。但后来了解到几个案例&#xff0c;开始觉得这个事情并不简单。我先分别列举出来&#xff0c…...

可换皮肤的Qt登录界面

⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支持一下呗。👍⭐️❤️ 可换皮肤的Qt登录界面 QSS的学习笔记 快…...

**发散创新:策略即代码——用 Rust实现动态权限控制引擎**在现代软件系统中,权限管理早已不是简单的“用

发散创新&#xff1a;策略即代码——用 Rust 实现动态权限控制引擎 在现代软件系统中&#xff0c;权限管理早已不是简单的“用户-角色-资源”映射。越来越多的业务场景要求我们具备灵活、可扩展、易维护的权限决策机制。传统硬编码方式难以应对频繁变更的业务规则&#xff0c;而…...

C语言调用Omni-Vision Sanctuary轻量级推理接口(C API)教程

C语言调用Omni-Vision Sanctuary轻量级推理接口&#xff08;C API&#xff09;教程 1. 引言&#xff1a;为什么选择C API&#xff1f; 在嵌入式设备和资源受限的环境中&#xff0c;Python运行时往往显得过于臃肿。Omni-Vision Sanctuary提供的C语言接口&#xff08;C API&…...

使用Cosmos-Reason1-7B分析网络协议交互逻辑:以TCP三次握手为例

使用Cosmos-Reason1-7B分析网络协议交互逻辑&#xff1a;以TCP三次握手为例 最近在尝试用大模型来理解一些复杂的系统交互逻辑&#xff0c;发现了一个挺有意思的用法。我们团队在测试Cosmos-Reason1-7B时&#xff0c;没有让它写代码或者生成文案&#xff0c;而是给了它一个更“…...

【QT】-- QT操作数据库

前言&#xff1a; Qt是C一个开发框架&#xff0c;具有跨平台特性。这篇是作者大二学习的时候做的笔记&#xff0c;有可能有错误&#xff0c;请各位批评指正。这篇记录QT操作数据库。欢迎大家收藏 关注&#xff0c;作者将会持续更新。 文章目录Qt 操作数据库QSqlDatabase数据库…...

告别“差不多就行”:用Cascade R-CNN解决目标检测中那些“似对非对”的边界框

从边界框“模糊地带”到工业级精度&#xff1a;Cascade R-CNN实战全解析 当你在自动驾驶系统中看到车辆识别框与真实车身存在5个像素的偏移&#xff0c;或在工业质检场景中某个关键缺陷的检测框刚好漏掉了1毫米的裂纹区域&#xff0c;这些“看似正确实则不准”的预测结果&#…...

MDXEditor指令系统详解:如何扩展Markdown语法

MDXEditor指令系统详解&#xff1a;如何扩展Markdown语法 【免费下载链接】editor A rich text editor React component for markdown 项目地址: https://gitcode.com/gh_mirrors/editor/editor MDXEditor是一个功能丰富的React组件&#xff0c;专为Markdown编辑设计&am…...

MediaPipe人脸检测避坑指南:如何优化检测精度与性能(含模型选择建议)

MediaPipe人脸检测实战优化&#xff1a;从参数调优到模型部署的完整指南 人脸检测作为计算机视觉的基础任务&#xff0c;其性能直接影响后续的面部分析效果。MediaPipe提供的轻量级解决方案在移动端和边缘设备上表现出色&#xff0c;但实际应用中常遇到误检、漏检或性能瓶颈问题…...

AD5144A数字电位器I²C驱动库深度解析与工程实践

1. AD5144A数字电位器驱动库深度解析&#xff1a;面向嵌入式工程师的IC控制实践指南AD5144A是ADI公司推出的四通道非易失性数字电位器&#xff0c;属于AD51xx系列中功能完备、应用灵活的代表型号。该器件通过IC接口实现对四个独立通道的精确电阻调节&#xff0c;支持256级&…...

5分钟搞定OpenCV摄像头实时监控(附Jupyter避坑指南)

5分钟搞定OpenCV摄像头实时监控&#xff08;附Jupyter避坑指南&#xff09; 在计算机视觉领域&#xff0c;实时摄像头监控是最基础也最实用的功能之一。无论是安防监控、人脸识别还是简单的视频采集&#xff0c;OpenCV都提供了简洁高效的接口。但对于Python初学者和Jupyter Not…...

C++的std--ranges中的验证编译期

C20引入的std::ranges库彻底改变了范围操作的方式&#xff0c;其中编译期验证机制是其最强大的特性之一。这种机制允许开发者在编译阶段捕获潜在错误&#xff0c;显著提升了代码的健壮性和性能。本文将深入探讨std::ranges中编译期验证的核心机制及其实际应用价值。编译时概念检…...