在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.mzph.cn/news/789924.shtml

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

相关文章

数据挖掘|贝叶斯分类器及其Python实现

分类分析|贝叶斯分类器及其Python实现 0. 分类分析概述1. Logistics回归模型2. 贝叶斯分类器2.1 贝叶斯定理2.2 朴素贝叶斯分类器2.2.1 高斯朴素贝叶斯分类器2.2.2 多项式朴素贝叶斯分类器 2.3 朴素贝叶斯分类的主要优点2.4 朴素贝叶斯分类的主要缺点 3. 贝叶斯分类器在生产中的…

SD-WAN降低网络运维难度的三大关键技术

企业网络作为现代企业不可或缺的基础设施&#xff0c;承担着连接全球的重要任务。随着全球化和数字化转型的加速推进&#xff0c;企业面临着越来越多的网络挑战和压力。传统的网络组网方式已经不能满足企业规模扩大、分支机构增多、上云服务等需求&#xff0c;导致了网络性能下…

双机 Cartogtapher 建图文件配置

双机cartogtapher建图 最近在做硕士毕设的最后一个实验&#xff0c;其中涉及到多机建图&#xff0c;经过调研最终采用cartographer建图算法&#xff0c;其中配置多机建图的文件有些麻烦&#xff0c;特此博客以记录 非常感谢我的同门 ”叶少“ 山上的稻草人-CSDN博客的帮助&am…

部署项目遇到的各种问题总结

文章目录 前言一、后端问题 jar包运行出现错误宝塔面板使用jdk17二、数据库问题 版本问题三、前端问题 连不上后端总结 前言 在做完项目之后&#xff0c;为了让别人访问到自己的网站&#xff0c;就需要部署前端后端以及数据库&#xff0c;但是在部署的过程中出现了各种问题和困…

VUE——概述

vue是前端框架&#xff0c;基于MVVM思想。 引入 从官网下载vue文件 <script src"js/vue.js"></script> 定义vue对象 new Vue({el: "#x",//vue接管区域&#xff0c;#表示选择器&#xff0c;x是id名字data: {message: "y"} })案例…

GICv3学习

中断分组 GICD_CTLR&#xff1a;配置是否支持group0、安全group1、非安全group1中断&#xff1b; 怎么配置中断在哪个组&#xff1b; 怎么知道中断是安全的还是非安全的&#xff1b; GICD_IGROUPR&#xff1a; 配置中断分组、中断是安全还是非安全&#xff1b; 4.4 软件产生中…

【SpringTask】快速入门

一、Spring Task 1.1 概述 介绍&#xff1a;(是什么&#xff1f; Spring Task 是Spring框架提供的任务调度工具&#xff0c;就是个定时任务框架 作用&#xff1a;(干啥的? 按照约定的时间 --》定时自动执行某段JAVA代码&#xff08;将某段逻辑功能实现&#xff09; 应用场景…

3.java openCV4.x 入门-数据类型(CvType)与Scalar

专栏简介 &#x1f492;个人主页 &#x1f4f0;专栏目录 点击上方查看更多内容 &#x1f4d6;心灵鸡汤&#x1f4d6;我们唯一拥有的就是今天&#xff0c;唯一能把握的也是今天 &#x1f9ed;文章导航&#x1f9ed; ⬆️ 2.hello openCV ⬇️ 4.待更新 数据类型&#xff…

U盘弹不出?事件查看器

使用完U盘或者硬盘遇到弹不出&#xff0c;是直接拔掉还是关机再拔&#xff1f; no no no 看这&#xff01; 1、开始菜单&#xff0c;或者叫“windows” 2.右键&#xff0c;点击按键“V”; 3.看到了事件查看器&#xff1b; 是PDF阅读器在占用文件&#xff1b; 关闭就正常了&…

yolov8姿态识别与绘制

YOLOv8姿态检测是一种基于深度学习的计算机视觉技术&#xff0c;用于识别图像或视频中人体的姿态。作为YOLO系列算法的最新版本&#xff0c;YOLOv8在姿态检测任务上展现出了卓越的性能和效率。以下将详细介绍YOLOv8姿态检测的原理、特点、应用以及训练过程。 一、YOLOv8姿态检…

进制转换器(C语言)

目录 1问题&#xff1a; 输入任意进制的数值&#xff0c;可以转换成任意进制的数值&#xff08;2到36进制&#xff09;; 2思路&#xff1a; 3代码&#xff1a;&#xff08;需要运用到数据结构栈的知识&#xff09; 4运行结果&#xff1a; 1问题&#xff1a; 输入任意进制的数…

算法知识点汇总

知识点 1. 求二进制中1的个数 int get_count(int x)//返回x的二进制有多少个1 int get_count(int x) {int res 0;while (x){res ;x - x & -x;}return res; }2. 建树&#xff0c;和树的DFS 记得初始化头节点 const int N 1e5 10, M N * 2; int h[N], e[M], ne[M], id…

Golang和Java的对决:从设计理念到工具链的全面比较

文章目录 使用率排名Golang和Java设计理念语法和类型系统并发处理资源消耗生态系统和工具链 结语 使用率排名 据最新的2024年3月 Tiobe 编程语言排行榜&#xff0c;目前 Golang 的使用率排名为第8呈上升趋势&#xff0c;Java 的使用率排名为第4呈下降趋势 2024年3月2023年3月…

用ENIGMA-toolbox作图

之前一直使用ggseg呈现结果&#xff0c;最近想试一试其他绘图工具。ENIGMA-toolbox有所了解&#xff0c;绘图功能看起来门槛不高&#xff0c;所以就试着用它呈现一些结果。Matlab版本的ENIGMA-toolbox直接使用就是SurfStat的功能绘图&#xff0c;Python版本的绘图功能应该是根据…

【Leetcode】top 100 回溯

基础知识补充 回溯中的组合问题&#xff1a; 优化&#xff1a;剪枝&#xff1a;在for循环时需要根据当前状态调整循环次数&#xff08;组合问题&#xff09; 基础操作补充 &#xff01;&#xff01;&#xff01;牢记模板&#xff01;&#xff01;&#xff01; result [] def b…

UE4_破碎插件的蓝图节点_Apply Radius Damage

一、知识点 Apply Radius Damage:破碎组件所带的蓝图节点。 二、使用方法&#xff1a; 1、设置——插件&#xff0c;搜索destruction&#xff0c;找到 Apex Destruction&#xff0c;勾选已启用。重启虚幻编辑器。 2、这样右键操作就有创建可破坏的网格体菜单&#xff0c;将do…

八、从0开始卷出一个新项目之瑞萨RZN2L 3.1.7 debug调试和下载

目录 3.1.7 debug调试和下载 3.1.7.1 官方介绍 3.1.7.2 e2studio debug变量实时监控 3.1.7.3 Iar debug变量实时监控 3.1.7.4 debug经验总结 八、从0开始卷出一个新项目之瑞萨RZN2L 3.1.7 debug调试和下载 3.1.7 debug调试和下载 3.1.7.1 官方介绍 官网&#xff1a; d…

【国信华源2024年首场春季校园招聘面试会举办】

阳春三月&#xff0c;春意盎然&#xff0c;北京国信华源科技有限公司2024年校园招聘活动如期展开。4月2日&#xff0c;成功举办了“国信华源2024年首场春季校园招聘面试会”。 国信华源公司人力资源部热情接待了前来参加面试的同学们&#xff0c;并亲自陪同他们深入探访了企业。…

实操:driver.js 实现产品导览、亮点、上下文帮助

官网 https://driverjs.com/ 依赖 <script src"https://cdn.jsdelivr.net/npm/driver.js1.0.1/dist/driver.js.iife.js"></script> <link rel"stylesheet" href"https://cdn.jsdelivr.net/npm/driver.js1.0.1/dist/driver.css"/…

Apache DolphinScheduler 【安装部署】

前言 今天来学习一下 DolphinScheduler &#xff0c;这是一个任务调度工具&#xff0c;现在用的比较火爆。 1、安装部署 1.0、准备工作 1.0.1、集群规划 dolphinscheduler 比较吃内存&#xff0c;所以尽量给 master 节点多分配一点内存&#xff0c;桌面和虚拟机里能关的应用…