在Java中对SQL进行常规操作的通用方法
SQL通用方法
- 一、常规方法增删改查
- 二、具体优化步骤
- 1.准备工作
- 2.getcon()方法,获取数据库连接对象
- 3.closeAll()方法,关闭所有资源
- 4.通用的增删改方法
- 5.通用的查询方法
- 6.动态查询语句
- 总结
一、常规方法增删改查
在常规方法中,我们在Java中对数据库中的表做增删改查操作的时候会发现,代码的答题都大致相同,应该可以将代码优化成一个通用的方法,首先我们要知道增删改要使用到Connection和PreparedStatement两个对象,而查找需要再加一个ResultSet对象,从这里出发我们开始写出一个通用的增删改方法,一个查询方法
二、具体优化步骤
1.准备工作
我们在优化前,需要将一个重复使用的数据写进属性文件中,以便多次使用,提高代码重用率
在src下新建一个包,叫做config,在config包中新建一个文件,jdbc.properties,

写上常规方法中需要用到的几个数据
2.getcon()方法,获取数据库连接对象
getCon方法,获取数据库连接对象,代码如下
//获得数据库连接对象public Connection getcon() {Properties pro = null;FileReader fr = null;Connection con = null;try {pro = new Properties(); //类加载器//相对地址转换成绝对地址String str = DBHelper.class.getClassLoader().getResource("config/jdbc.properties").getPath();fr = new FileReader(str); //读取属性文件中的数据pro.load(fr); } catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}try {Class.forName(pro.getProperty("mysql.classname"));String username = pro.getProperty("mysql.username");String password = pro.getProperty("mysql.password");String url = pro.getProperty("mysql.url");con = DriverManager.getConnection(url, username, password);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}return con; //返回值为Connection类型,在通用方法中调用这个getcon方法,拿到数据库连接对象后继续操作}
3.closeAll()方法,关闭所有资源
代码如下
public void closeAll(Connection con, PreparedStatement ps, ResultSet rs){try {if (rs != null) {rs.close();}if (ps != null) {ps.close();}if (con != null) {con.close();}} catch (SQLException e) {e.printStackTrace();}}
有了这个方法,在我们执行完通用方法之后就不再需要写很多行代码去关闭资源了
4.通用的增删改方法
//通用的增删改方法public int update(String sql,Object...objects){int i = 0;Connection con = null;PreparedStatement ps = null;try {con = getCon();//调用getcon,获得数据库连接对象ps = con.prepareStatement(sql);//向传入的sql语句中的问号赋值for (int j = 0; j < objects.length; j++) {ps.setObject(j + 1, objects[j]);}i = ps.executeUpdate();//执行sql语句并获得结果} catch (SQLException e) {e.printStackTrace();}finally {closeAll(con,ps,null);}return i;//返回执行后的结果以供下一步差异化操作}
5.通用的查询方法
public ArrayList query(String sql,Class cla,Object...objs){ArrayList list = null;Connection con = null;PreparedStatement ps = null;ResultSet rs = null;try {con = getcon();ps = con.prepareStatement(sql);for (int i = 0; i < objs.length; i++) {ps.setObject(i + 1, objs[i]);//给sql语句中的问号赋值}rs = ps.executeQuery();//执行sql语句进行查找while (rs.next()) {//遍历查找到符合条件的对象Object o = cla.newInstance();//通过反射得到一个新的对象Field[] declaredFields = cla.getDeclaredFields();//利用反射获取对象成员的所有属性放到数组中for (Field f : declaredFields) {//利用强烈for循环遍历数组f.setAccessible(true);//暴力破解权限f.set(o, rs.getObject(f.getName()));//对新的对象的每一个属性赋值,赋的是查找到的对象的值}list.add(o);//将新的对象添加到集合中,开始对下一个符合条件的对象进行操作}} catch (IllegalAccessException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}finally {closeAll(con,ps,rs);}return list;//等对所有符合条件的对象都操作完,把这个集合返回出去,等待下一步使用}
6.动态查询语句
我们要知道不同功能的操作的原因是sql语句不同,而查找的sql语句偏偏是一个不能修改的String类型的,我们很难附加一些缩小范围的查询条件,所以动态查询需要用到可变数组,以下代码是在数据层实现类中书写的
以DVD项目做例子,DVD有六个属性,分别是下面代码体现的这些,我们通过传参,传进来一个DVD对象,这个时候我们先写一个可变数组where后面 1 = 1是恒成立的意思,无论后面加不加,加什么都会执行,接下来我们对dvd的各个属性进行判断,如果不为空,那么就代表需要根据这条属性来判断,我们就在sql语句中加上该条件,接着我们在集合中添加这条属性。最后我们再调用通用的查询方法,进行一个动态查询,其实到这里还没结束,需要在控制层再写一次差异化,如果输入一个什么东西,或者下拉勾选需要查询的属性,比如下面第二段演示的代码:
public ArrayList<DVD1> selectDVDs(DVD1 dvd) {StringBuilder sql = new StringBuilder("select * from dvd where 1 = 1");ArrayList list = new ArrayList();if (dvd.getId() != null){sql.append("and id = ?");list.add(dvd.getId());}if (dvd.getName() != null){sql.append("and name = ?");list.add(dvd.getName());}if (dvd.getState() != null){sql.append("and state = ?");list.add(dvd.getState());}if (dvd.getLendDate() != null){sql.append("and lendDate = ?");list.add(dvd.getLendDate());}if (dvd.getMoney() != null){sql.append("and money = ?");list.add(dvd.getMoney());}if (dvd.getCount() != null){sql.append("and count = ?");list.add(dvd.getCount());}return db.query(sql.toString(),DVD1.class,list.toArray());}
public void see(){DVD dvd=new DVD();System.out.println("请输入查看DVD的编号:(输入N,不按照此条件查询)");String id = input.next();if (!"N".equals(id))dvd.setId(Integer.parseInt(id));System.out.println("请输入查看DVD的名称:(输入N,不按照此条件查询)");String name = input.next();if (!"N".equals(name))dvd.setName(name);System.out.println("请输入查看DVD的状态:(输入N,不按照此条件查询)");String state = input.next();if (!"N".equals(state))dvd.setState(state);System.out.println("请输入查看DVD的日租金:(输入N,不按照此条件查询)");String money = input.next();if (!"N".equals(money))dvd.setMoney(Double.parseDouble(money));System.out.println("请输入查看DVD的借出日期:(输入N,不按照此条件查询)");String date = input.next();if (!"N".equals(date))dvd.setLendDate(date);System.out.println("请输入查看DVD的出借次数:(输入N,不按照此条件查询)");String count = input.next();if (!"N".equals(count))dvd.setCount(Integer.parseInt(count));ArrayList<DVD> dvds = dvdService.findDVDs(dvd);System.out.println("序号\t\t名字\t\t状态\t\t日租金\t\t借出日期\t\t出借次数");for (DVD d : dvds) {System.out.println(d.toString());}}
这样我们就实现了对某一张表进行一个动态查询的操作
总结
以上就是sql语句的通用方法,真~通用,感觉对你有益的话点个收藏吧,防止用的时候找不到!!!
相关文章:
在Java中对SQL进行常规操作的通用方法
SQL通用方法 一、常规方法增删改查二、具体优化步骤1.准备工作2.getcon()方法,获取数据库连接对象3.closeAll()方法,关闭所有资源4.通用的增删改方法5.通用的查询方法6.动态查询语句 总结 一、常规方法增删改查 在常规方法中,我们在Java中对…...
JavaSE day16笔记 - string
第十六天课堂笔记 学习任务 Comparable接口★★★★ 接口 : 功能的封装 > 一组操作规范 一个抽象方法 -> 某一个功能的封装多个抽象方法 -> 一组操作规范 接口与抽象类的区别 1本质不同 接口是功能的封装 , 具有什么功能 > 对象能干什么抽象类是事物本质的抽象 &…...
java将文件转成流文件返回给前端
环境:jdk1.8,springboot2.5.3,项目端口号:9100 1.待转换的文件 一、路径 二、文件内容 2.controller中代码 package com.example.pdf.controller;import com.example.pdf.service.GetFileStreamService; import org.springframework.web.b…...
使用Node.js常用命令提高开发效率
Node.js是一个基于Chrome V8引擎的JavaScript运行时环境,广泛用于构建服务器端应用程序和命令行工具。Node.js提供了丰富的命令和工具,可以帮助开发者更高效地开发应用程序。在日常开发中,除了Node.js本身的核心功能外,npm&#x…...
百度资源平台链接提交
百度资源平台是百度搜索引擎提供的一个重要工具,用于帮助网站主将自己的网站链接提交给百度搜索引擎,以便更快地被收录和展示在搜索结果中。以下将就百度资源平台链接提交的概念、操作方法以及其对网站收录和曝光的影响进行探讨: 什么是百度资…...
力扣爆刷第108天之CodeTop100五连刷26-30
力扣爆刷第108天之CodeTop100五连刷26-30 文章目录 力扣爆刷第108天之CodeTop100五连刷26-30一、15. 字符串相加二、300. 最长递增子序列三、42. 接雨水四、43. 重排链表五、142. 环形链表 II 一、15. 字符串相加 题目链接:https://leetcode.cn/problems/add-strin…...
Android裁剪图片为波浪形或者曲线形的ImageView
如果需要做一个自定义的波浪效果的进度条,裁剪图片,对ImageView的图片进行裁剪,比如下面2张图,如何实现? 先看下面的效果,看到其实只需要对第一张高亮的图片进行处理即可,灰色状态的作为背景图。…...
Linux课程____shell脚本应用
:一、认识shell 常用解释器 Bash , ksh , csh 登陆后默认使用shell,一般为/bin/bash,不同的指令,运行的环境也不同 二、 编写简单脚本并使用 # vim /frist.sh //编写脚本文件,简单内容 #!/bin/bash …...
设计模式12--组合模式
定义 案例一 案例二 优缺点...
【微服务】软件架构的演变之路
目录 单体式架构的时代单体式架构(Monolithic)优点缺点适用场景单体式架构面临诸多问题1.宽带提速,网民增多2.Web2.0时代的特点问题描述优化方向 集群优点缺点适用场景搭建集群后面临诸多问题用户请求问题用户的登录信息数据查询 改进后的架构 垂直架构优点缺点 分布…...
安全算法 - 加密算法
加密算法是一种在信息安全领域中广泛应用的算法,能够将数据进行加密转换,以保证数据的保密性和安全性。 它具有保密性、对称加密和非对称加密、密钥管理、数据完整性和认证等重要特点和应用。 加密算法可以分为对称加密和非对称加密两种类型࿱…...
安全算法 - 国密算法
国密算法是中国自主研发的密码算法体系,包括对称加密算法、非对称加密算法和哈希算法。其中,国密算法采用SM4作为对称加密算法,SM2作为非对称加密算法,以及SM3作为哈希算法。国密算法在信息安全领域具有重要意义和广泛应用&#x…...
蓝桥杯2014年第十三届省赛真题-武功秘籍
一、题目 武功秘籍 小明到X山洞探险,捡到一本有破损的武功秘籍(2000多页!当然是伪造的)。他注意到:书的第10页和第11页在同一张纸上,但第11页和第12页不在同一张纸上。 小明只想练习该书的第81页到第92页的…...
Could not initialize class java.awt.Font
项目场景: 项目场景:java项目在web端导出Excel、Word、PDF等文档 问题描述 在Windows系统中开发以及运行文件导出正常,单机部署到Linux中或者使用docker部署后,导出报错。 异常: eleasing transactional SqlSession…...
Mysql or与in的区别
创建一个表格 内涵一千万条数据 这张表中,只有id有建立索引,且其余都没有 测试1:使用or的情况下,根据主键进行查询 可以看到根据主键id进行or查询 花费了30-114毫秒,后面30多毫秒可能是因为Mysql的Buffer Pool缓冲池的…...
STM32——USART
一、通信 1.1通信是什么; 通信是将一个设备的数据发送到另一个设备中,从而实现硬件的扩展; 1.2通信的目的是什么; 实现硬件的扩展-在STM32中集成了很多功能,例如PWM输出,AD采集,定时器等&am…...
WebCopilot:一款功能强大的子域名枚举和安全漏洞扫描工具
关于WebCopilot WebCopilot是一款功能强大的子域名枚举和安全漏洞扫描工具,该工具能够枚举目标域名下的子域名,并使用不同的开源工具检测目标存在的安全漏洞。 工具运行机制 WebCopilot首先会使用assetsfinder、submaster、subfinder、accumt、finddom…...
HarmonyOS实战开发-如何实现一个支持加减乘除混合运算的计算器。
介绍 本篇Codelab基于基础组件、容器组件,实现一个支持加减乘除混合运算的计算器。 说明: 由于数字都是双精度浮点数,在计算机中是二进制存储数据的,因此小数和非安全整数(超过整数的安全范围[-Math.pow(2, 53)&#…...
每日OJ题_子序列dp⑥_力扣873. 最长的斐波那契子序列的长度
目录 力扣873. 最长的斐波那契子序列的长度 解析代码 力扣873. 最长的斐波那契子序列的长度 873. 最长的斐波那契子序列的长度 难度 中等 如果序列 X_1, X_2, ..., X_n 满足下列条件,就说它是 斐波那契式 的: n > 3对于所有 i 2 < n&#x…...
病毒循环Viral Loop是什么?为何能实现指数增长
一、什么是病毒循环(Viral Loop)? 病毒循环(Viral Loop)是一种机制,它推动连续的推荐以实现持续增长。 它会促使你现有的客户推荐其他人,去认识你的品牌,然后让这些新客户进一步告诉…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
