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

Java高级:数据库访问优化

系列文章目录

Java高级部分 JDBC编程


文章目录

  • 系列文章目录
  • 前言
  • 一、编写属性文件:
  • 二、编写DBUtil工具类:
  • 三、使用DBUtil工具类:
  • 总结


前言

   通过我之前发的数据库连接,数据库连接https://blog.csdn.net/2301_81776550/article/details/147314012?spm=1001.2014.3001.5501能够发现问题:在访问数据库时,执行步骤都是相同的,不同的是每次执行的SQL语句。因此,为了简化数据库访问操作,减少代码冗余,提高效率,需要将访问数据库时通用的基本代码进行封装,即程序员自己编写一个数据库访问工具类DBUtils,用于提供访问数据库时所用到的连接,查询,更新和关闭等操作的基本方法,其他类通过调用DBUtils工具类来实现数据库的访问。所以下面我们来讲讲这个类是怎么写的。


提示:以下是本篇文章正文内容,下面案例可供参考

一、编写属性文件:

   为了便于后期维护,在编写DBUtil工具类之前,通常将连接数据库的参数信息保存在属性文件中。

    内容:

driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/MY_STU?useSSL=false
user = root
pwd = 123456

    而为了读取属性文件中的配置信息,需要编写一个Config配置类,在该类中通过java.util.properties类的get()方法来获取指定的“键”所对应的“值”。

         内容:

package util;import java.io.FileInputStream;
import java.util.Properties;//配置类
public class Config {private static Properties p = null;static {try {p = new Properties();// 加载配置文件//p.load(new FileInputStream("config/oracle.properties"));p.load(new FileInputStream("config/mySql.properties"));} catch (Exception e) {e.printStackTrace();}}// 获取键对应的值public static String getValue(String key) {return p.get(key).toString();}
}

   

二、编写DBUtil工具类:

    

      在上面的一些属性信息配置完毕后,下面我们就要开始编写此工具类了。

          

package DButils_;import util.Config;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class DBUtil {Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;/*** 得到数据库连接*/public Connection getConnection() throws ClassNotFoundException,SQLException, InstantiationException, IllegalAccessException {// 通过Config获取Oracle数据库配置信息String driver = Config.getValue("driver");String url = Config.getValue("url");String user = Config.getValue("user");String pwd = Config.getValue("pwd");try {// 指定驱动程序Class.forName(driver);// 建立数据库连结conn = DriverManager.getConnection(url, user, pwd);return conn;} catch (Exception e) {// 如果连接过程出现异常,抛出异常信息throw new SQLException("驱动错误或连接失败!");}}/*** 释放资源*/public void closeAll() {// 如果rs不空,关闭rsif (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}// 如果pstmt不空,关闭pstmtif (pstmt != null) {try {pstmt.close();} catch (SQLException e) {e.printStackTrace();}}// 如果conn不空,关闭connif (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}/*** 执行SQL语句,可以进行查询Select SQL*/public ResultSet executeQuery(String preparedSql, Object[] param) {// 处理SQL,执行SQLtry {// 得到PreparedStatement对象pstmt = conn.prepareStatement(preparedSql);if (param != null) {for (int i = 0; i < param.length; i++) {// 为预编译sql设置参数pstmt.setObject(i + 1, param[i]);}}// 执行SQL语句rs = pstmt.executeQuery();} catch (SQLException e) {// 处理SQLException异常e.printStackTrace();}return rs;}/*** 执行SQL语句,可以进行增、删、改的操作SQL,不能执行查询*/public int executeUpdate(String preparedSql, Object[] param) {int num = 0;// 处理SQL,执行SQLtry {// 得到PreparedStatement对象pstmt = conn.prepareStatement(preparedSql);if (param != null) {for (int i = 0; i < param.length; i++) {// 为预编译sql设置参数pstmt.setObject(i + 1, param[i]);}}// 执行SQL语句num = pstmt.executeUpdate();} catch (SQLException e) {// 处理SQLException异常e.printStackTrace();}return num;}
}

   三、使用DBUtil工具类:

      下面代码使用DBUtil类对Userdetails表实现数据的增,删,改,查等操作。

           

import java.sql.ResultSet;import com.qst.chapter02.db.DBUtil;public class DBDemo {public static void main(String[] args) {String selectSql = "SELECT id,username,password,sex FROM userdetails";String insertSql = "INSERT INTO userdetails(id,username,password,sex) VALUES(?,?,?,?)";String updateSql = "UPDATE userdetails SET password=? WHERE username=?";String deleteSql = "DELETE FROM userdetails WHERE username=?";// 创建DBUtil对象DBUtil db = new DBUtil();try {// 连接数据库db.getConnection();// 查询并显示原来的数据ResultSet rs = db.executeQuery("SELECT id,username,password,sex FROM userdetails", null);System.out.println("---------原来的数据---------");while (rs.next()) {System.out.println("行 " + rs.getRow() + ":" + rs.getInt(1)+ "\t" + rs.getString(2) + "\t"+ rs.getString(3) + "\t"+ (rs.getInt(4) == 1 ? "男" : "女"));}System.out.println("-------------------------");// 执行添加int count = db.executeUpdate(insertSql, new String[] { "9", "Rose","123456", "0" });System.out.println("添加" + count + "行!");// 执行修改count = db.executeUpdate(updateSql, new String[] { "686868","Tom" });System.out.println("修改" + count + "行!");// 执行删除count = db.executeUpdate(deleteSql, new String[] { "lisi" });System.out.println("删除" + count + "行!");// 查询并显示更新后的数据rs = db.executeQuery(selectSql, null);System.out.println("---------更新后的数据---------");while (rs.next()) {System.out.println("行 " + rs.getRow() + ":" + rs.getInt(1)+ "\t" + rs.getString(2) + "\t"+ rs.getString(3) + "\t"+ (rs.getInt(4) == 1 ? "男" : "女"));}System.out.println("-------------------------");} catch (Exception e) {// 关闭连接db.closeAll();e.printStackTrace();}}}


总结

     以上就是今天要讲的内容,本文就是简单的让大家认识一下这个我们自己编写的工具类,而且这个工具类也是用封装的思想,就是对于重复操作的我们可以将其封装起来,减少代码冗余,下面会持续更新的,谢谢大家。

相关文章:

  • 网络安全零基础培训 L1-7 Web基础和CSS渲染
  • JVM考古现场(二十五):逆熵者·时间晶体的永恒之战(进阶篇)
  • 【Project】基于spark-App端口懂车帝数据采集与可视化
  • Vue 3中如何封装API请求:提升开发效率的最佳实践
  • Geek强大的电脑卸载软件工具,免费下载
  • Winform实现条码打印
  • Vue生命周期详细解析
  • AI语音助手自定义角色百度大模型 【全新AI开发套件掌上AI+4w字教程+零基础上手】
  • Android SDK 下载及配置 --- app笔记
  • 【分布式锁通关指南 09】源码剖析redisson之公平锁的实现
  • [KVM] KVM挂起状态恢复失败与KVM存储池迁移
  • Spring JDBC 的开发步骤(注解方式)
  • 私有知识库 Coco AI 实战(三):摄入 Elasticsearch 官方文档
  • Go语言学习笔记(一)
  • 【论文阅读】Dual-branch Cross-Patch Attention Learning for Group Affect Recognition
  • 代理模式:控制对象访问的中间层设计
  • 论文阅读 | 大模型工具调用控制的策略优化
  • Spark与Hadoop之间的联系与区别
  • 使用nodeJs的express+axios+cors做代理
  • 配置MambaIRv2: Attentive State Space Restoration的环境
  • 科普|结石疼痛背后的危机信号:疼痛消失≠警报解除
  • 宫崎骏电影《幽灵公主》4K修复版定档五一
  • 载人登月总体进展顺利
  • 对话上海外贸企业:关税战虽起,中国供应商却难以被取代
  • 上海一小学百名学生齐聚图书馆:纸质书的浪漫AI无法取代
  • 外交部:制裁在涉港问题上表现恶劣的美方人士是对等反制