制作数据库框架
一 利用前端条件组装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(华邦)的 W25Qxx 系列 SPI FLASH 是比较常用的芯片,这篇文章将演示单片机中通过SPI使用该芯片的操作过程。 本文使用沁恒官方的开发板 (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.定义 贪心算法(greedy algorithm ,又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是…...
WebRTC拥塞控制原理之一基本介绍
1 基本原理 WebRTC的拥塞控制模块使用的是基于TCP的拥塞控制算法。它是根据网络带宽和延迟等信息来自适应地调整传输速率的。 具体来说,该模块采用的是基于RFC 3550中的延迟抖动调整算法的改进版本。该算法实施的基本原理是在传输的过程中定期探测网络的质量和延迟…...
选择 .NET 的 n 个理由
自从我们启动快速发展的 .NET 开源和跨平台项目以来,.NET 发生了很大变化。我们重新思考并完善了该平台,添加了专为性能和安全性而设计的新低级功能,以及以生产力为中心的高级功能。Span<T>、硬件内在函数和可为空的引用类型都是示例。…...
spark第三章:工程化代码
系列文章目录 spark第一章:环境安装 spark第二章:sparkcore实例 spark第三章:工程化代码 文章目录系列文章目录前言一、三层架构二、拆分WordCount1.三层拆分2.代码抽取总结前言 我们上一次博客,完成了一些案例的练习࿰…...
Vue实战【封装一个简单的列表组件,实现增删改查】
文章目录🌟前言🌟table组件封装🌟父组件(展示表格的页面)🌟控制台查看父子组件通信是否成功🌟Vue2父子组件传递参数🌟写在最后🌟JSON包里写函数,关注博主不迷…...
微前端(无界)
前言:微前端已经是一个非常成熟的领域了,但开发者不管采用哪个现有方案,在适配成本、样式隔离、运行性能、页面白屏、子应用通信、子应用保活、多应用激活、vite 框架支持、应用共享等用户核心诉求都或存在问题,或无法提供支持。本…...
强烈推荐:0基础入门网安必备《网络安全知识图谱》
蚁景网安学院一直专注于网安实战技能培养,提供全方位的网安安全学习解决方案。我们集聚专业网安技术大佬资源,倾力打造了这本更全面更系统的“网络安全知识图谱”,让大家在网络安全学习路上不迷茫。 在这份网安技能地图册里,我们对…...
网络技术与应用概论(上)——“计算机网络”
各位CSDN的uu们你们好呀,今天,小雅兰的内容依旧是计算机网络的一些知识点噢,下面,让我们进入计算机网络的世界吧 网络内涵 网络特征 网络定义 互联网发展过程 从ARPA网络到Internet 从低速互联网到高速互联网 从数据结构到统一网…...
JAVASE/封装、继承、多态
博客制作不易,欢迎各位点赞👍收藏⭐关注前言在学习面向对象编程语言时,封装、继承、多态则是我们必须学习和使用的三大特征。本文通过举例,说明了该三大特征的基本权限特点。一、访问限定符范围private默认权限protectedpublic同一…...
SpringBoot ElasticSearch 【SpringBoot系列16】
SpringCloud 大型系列课程正在制作中,欢迎大家关注与提意见。 程序员每天的CV 与 板砖,也要知其所以然,本系列课程可以帮助初学者学习 SpringBooot 项目开发 与 SpringCloud 微服务系列项目开发 elasticsearch是一款非常强大的开源搜索引擎&a…...
Virtual box磁盘大小调整操作
Virtual box磁盘大小调整操作环境说明思路操作1、挂载要压缩的硬盘到 ~/data2、填充 0 文件3、删除 全是0空文件4、虚拟机关机5、在windows环境下用VBoxManage.exe 进行压缩硬盘加大环境说明 主机 windows 虚拟机 ubuntu 分配了 80G 的硬盘,现在已经占用 80 G 了。…...
MySQL注入秘籍【上篇】
MySQL注入秘籍【上篇】1.数据库敏感信息常用语句2.联合(UNION)查询注入3.报错注入原理常见报错注入函数1.数据库敏感信息常用语句 获取数据库版本信息 select version(); select innodb_version;获取当前用户 select user();获取当前数据库 select database();数…...
简单三步解决动态规划难题,记好这三步,动态规划就不难
目录一、简单的一维DP剑指 Offer 10- I. 斐波那契数列1、三板斧解决问题2、优雅的解决问题剑指 Offer 63 股票的最大利润1、三板斧解决问题2、优雅的解决问题二、进阶的二维DP剑指offer47 礼物的最大价值1、三板斧解决问题2、优雅的解决问题编辑距离1、三板斧解决问题2、优雅的…...
算法进阶指南打卡
文章目录 基本算法 位运算递推与递归前缀和与差分二分排序倍增贪心总结与练习基本数据结构 栈队列链表与邻接表Hash字符串Tire二叉堆总结与练习搜索 树与图的遍历深度优先搜索剪枝迭代加深广度优先搜索广度变形A*IDA*总结与练习数学知识 质数约数同余矩阵乘法高斯消元与线性空…...
Chapter6.2:其他根轨迹及综合实例分析
该系列博客主要讲述Matlab软件在自动控制方面的应用,如无自动控制理论基础,请先学习自动控制系列博文,该系列博客不再详细讲解自动控制理论知识。 自动控制理论基础相关链接:https://blog.csdn.net/qq_39032096/category_10287468…...
3. 无重复字符的最长子串——滑动窗口
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为无…...
ChatGPT研究分享:机器第一次开始理解人类世界
0、为什么会对ChatGPT感兴趣一开始,我对ChatGPT是没什么关注的,无非就是有更大的数据集,完成了更大规模的计算,所以能够回答更多的问题。但后来了解到几个案例,开始觉得这个事情并不简单。我先分别列举出来,…...
可换皮肤的Qt登录界面
⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支持一下呗。👍⭐️❤️ 可换皮肤的Qt登录界面 QSS的学习笔记 快…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
