在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语句的通用方法,真~通用,感觉对你有益的话点个收藏吧,防止用的时候找不到!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/299180.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库排错记录

目录 一、 规范二、 优化查询1) 通过执行计划 三、 排查故障1) 网络断连2) 超时登录已断开3) 死锁4) 实例错误 一、 规范 尽量不要用select *&#xff0c;select 语句最好加上with(nolock)数据量大的表必须要有主键&#xff0c;可以是自增ID查询语句的条件里面的字段&#xff…

勒索病毒最新变种.rmallox勒索病毒来袭,如何恢复受感染的数据?

导言&#xff1a; 随着信息技术的飞速发展&#xff0c;网络安全问题日益突出&#xff0c;其中勒索病毒便是近年来备受关注的网络安全威胁之一。在众多勒索病毒中&#xff0c;.rmallox勒索病毒以其独特的传播方式和强大的加密能力&#xff0c;给广大用户带来了极大的困扰。本文…

11-pyspark的RDD的变换与动作算子总结

目录 前言 变换算子动作算子 前言 一般来说&#xff0c;RDD包括两个操作算子&#xff1a; 变换&#xff08;Transformations&#xff09;&#xff1a;变换算子的特点是懒执行&#xff0c;变换操作并不会立刻执行&#xff0c;而是需要等到有动作&#xff08;Actions&#xff09;…

索引的概念

索引的概念    1.索引是一种可选的与表相关的数据库对象&#xff0c;用于提高数据的查询效率。    2.索引是一种有序的数据结构。    3.如果一个表没有创建索引&#xff0c;则对该表进行查询时需要进行全表扫描&#xff1b;如果创建了索引&#xff0c;则在有条件查询时…

thinkphp6入门(21)-- 如何删除图片、文件

假设文件的位置在 /*** 删除文件* $file_name avatar/20240208/d71d108bc1086b498df5191f9f925db3.jpg*/ function deleteFile($file_name) {// 要删除的文件路径$file app()->getRootPath() . public/uploads/ . $file_name; $result [];if (is_file($file)) {if (unlin…

C刊级 | Matlab实现GWO-BiTCN-BiGRU-Attention灰狼算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测

C刊级 | Matlab实现GWO-BiTCN-BiGRU-Attention灰狼算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测 目录 C刊级 | Matlab实现GWO-BiTCN-BiGRU-Attention灰狼算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测效果一览基本介绍程序设计参考…

【IEEE STD 1801】——Introduction

Introduction 本标准的目的是提供便携、低功耗的设计规范&#xff0c;这些规范可以在整个电子系统设计、分析、验证和实现流程中与各种商业产品一起使用。 当电子设计自动化(EDA)行业在20世纪80年代开始创建用于指定、仿真和实现数字电子电路的功能规范的标准时&#xff0c;主…

Midjourney艺术家分享|By Moebius

Moebius&#xff0c;本名让吉拉德&#xff08;Jean Giraud&#xff09;&#xff0c;是一位极具影响力的法国漫画家和插画师&#xff0c;以其独特的科幻和幻想风格而闻名于世。他的艺术作品不仅在漫画领域内受到高度评价&#xff0c;也为电影、时尚和广告等多个领域提供了灵感。…

练习 16 Web [极客大挑战 2019]LoveSQL

extractvalue(1,concat(‘~’, (‘your sql’) ) )报错注入&#xff0c;注意爆破字段的时候表名有可能是table_name不是table_schema 有登录输入框 常规尝试一下 常规的万能密码&#xff0c;返回了一个“admin的密码”&#xff1a; Hello admin&#xff01; Your password is…

2023年港澳台联考中的招生大户武汉大学

导读 随着小米集团雷军近期的热度不断上升&#xff0c;很多家长开始关注到武汉大学这样一所历史悠久的亚洲知名大学。小米集团的董事长雷军就是毕业于武汉大学的校友。今天我们一起来看一下&#xff0c;2023年港澳台联招中的武汉大学&#xff01; 学校简介 武汉大学是一所位于湖…

Redis(性能管理、主从复制、哨兵模式)概述及部署

目录 一、性能管理 1、查看Redis内存使用 2、内存碎片率 3、跟踪内存碎片率 4、内存使用率 5、内回收key 二、Redis集群有三种模式 三、Redis主从复制 1、主从复制的概念 2、主从复制的作用 3、主从复制的流程 4、搭建Redis主从复制 1.环境准备 2.安装Redis&#…

SV学习笔记(六)

文章目录 覆盖率类型写在前面代码覆盖率断言覆盖率功能覆盖率漏洞率曲线 功能覆盖策略收集信息而非数据只测量需要的内容验证的完备性 覆盖组写在前面在类里定义covergroup 数据采样写在前面coverpoint和binbin的创建和应用命名coverpoint和bin条件覆盖率翻转覆盖率wildcard覆盖…

Linux——线程控制

目录 前言 一、线程创建 1.创建线程 2.线程传递结构体 3.创建多线程 4.收到信号的线程 二、线程终止 三、线程等待 四、线程分离 五、取消线程 六、线程库管理的原理 七、站在语言角度理解pthread库 八、线程的局部存储 前言 前面我们学习了线程概念和线程创建&…

C语言实现快速排序算法

1. 什么是快速排序算法 快速排序的核心思想是通过分治法&#xff08;Divide and Conquer&#xff09;来实现排序。 算法的基本步骤是: 1. 选择一个基准值&#xff08;通常是数组中的某个元素&#xff09;&#xff0c;将数组分成两部分&#xff0c;使得左边的部分所有元素都小于…

C和C++内存管理

目录&#xff1a; 一&#xff1a;C和C内存分布 二&#xff1a;C动态内存管理方式 三&#xff1a;C动态内存管理方式 四&#xff1a;operator new与operator delete函数 五&#xff1a;new和delete的实现原理 六&#xff1a;定位new表达式(placement-new) 七&#xff1…

ubuntu-server部署hive-part2-安装hadoop

参照 https://blog.csdn.net/qq_41946216/article/details/134345137 操作系统版本&#xff1a;ubuntu-server-22.04.3 虚拟机&#xff1a;virtualbox7.0 安装hadoop ​​​​​​下载上传 下载地址 https://archive.apache.org/dist/hadoop/common/hadoop-3.3.4/ 以root用…

用C/C++加Easyx实现俄罗斯方块游戏(爆肝4万字,完全免费)

前言 相信大家一定玩过俄罗斯方块这款小游戏&#xff0c;简单容易上手是老少皆宜的小游戏&#xff0c;今天大家就跟着我来实现这个小游戏吧&#xff01;让自己学的C语言有用武之地。 为了让俄罗斯方块的开发更为简单些&#xff0c;图像更为丰富&#xff0c;在这里就利用了Easyx…

设计模式总结-原型设计模式

原型设计模式 模式动机模式定义模式结构模式分析深拷贝和浅拷贝原型模式实例与解析实例一&#xff1a;邮件复制&#xff08;浅克隆&#xff09;实例二&#xff1a;邮件复制&#xff08;深克隆&#xff09; 模式动机 在面向对象系统中&#xff0c;使用原型模式来复制一个对象自…

vue使用iview导航栏Menu activeName不生效

activeName不生效 一、问题一、解决方案&#xff0c; 一、问题 根据ivew官网的提示&#xff0c;设置了active-name和open-names以后&#xff0c;发现不管是设置静态是数据还是设置动态的数据&#xff0c;都不生效 一、解决方案&#xff0c; 在设置动态名称的时候&#xff0c…

Centos7环境下安装MySQL8详细教程

1、下载mysql安装包 下载哪个版本&#xff0c;首先需要确定一下系统的glibc版本&#xff0c;使用如下命令&#xff1a; rpm -qa | grep glibc ​​​​​​​ 2、检查是否安装过mysql ps:因为以前用yum安装过&#xff0c;所以先用yum卸载。如果不是此方式或者没安装过则跳过…