Java高级:数据库访问优化

系列文章目录

Java高级部分 JDBC编程


文章目录


前言

   通过我之前发的数据库连接,数据库连接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不空,关闭rs
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        // 如果pstmt不空,关闭pstmt
        if (pstmt != null) {
            try {
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        // 如果conn不空,关闭conn
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 执行SQL语句,可以进行查询Select SQL
     */
    public ResultSet executeQuery(String preparedSql, Object[] param) {
        // 处理SQL,执行SQL
        try {
            // 得到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,执行SQL
        try {
            // 得到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();
		}
	}

}


总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值