JDBC学习篇(四)

本文介绍了使用ResourceBundle以键值对形式读取配置文件内容来管理数据库连接信息的方法,包括配置文件的位置、内容格式及优点。通过这种方式,可以方便地修改数据库配置,提高代码的可移植性。然而,SQL注入问题仍然存在,且未封装成工具类。文章详细阐述了从导入jar包、创建配置文件、读取配置、注册驱动、建立连接到执行SQL语句的全过程,并提供了DQL和DML操作的示例代码。
摘要由CSDN通过智能技术生成

JDBC学习篇(四)

JDBC的一种进阶版本2思路

1 内容

1.1 通过ResourceBundle对象以键值对的形式的读取配置文件的内容
1.2 读取的配置文件需要满足以下几个条件:
a 配置文件必须在src文件夹下面
b 通过getBundle方法传入的参数只能为配置文件的名称,不要加上properties后缀名
c 且配置文件的内容是以key=value这种方式去书写其内容的
1.3 优点
1.3.1 便于修改

因为变更数据库厂商或者数据库账户密码,只需要改动配置文件就行、

1.3.2 可移植性好(配置文件)

因为默认会去src文件下找对应的配置文件,避免的路径不存在的问题(src文件夹一般都有)

1.4 缺点

SQL注入问题依然没有解决,因为你依然使用的是Statement实现类的对象去执行SQL语句的

没有封装成工具类(该类仅仅是工具的作用,不允许被实例化,类似java,util.Math)

2 核心思路

2.1 导入jar包

之前写的导入jar包文件的博客内容

2.2 准备工作
/*因为调用方法的时候会抛出编译时异常,在try代码块里面定义的话
除了try代码块之外的其他地方都用不了,这样定义的话显然是不可以的
因此我们需要把在后面需要实例化的对象都在try代码块的前面进行声明
*/
//声明连接对象
Connection conn=null;
//声明数据库操作对象
Statement st=null;
//声明结果集对象
ResultSet rs=null;
2.3 创建并读取配置文件(.properties结尾的)里面的信息
2.3.1 创建配置文件,其中配置文件信息里面需要含有driver、url、root、pwd信息
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/zlz_temp?characterEncoding=utf-8&useSSL=true
user=root
pwd=密码
2.3.2 通过资源管理器对象以键值对的形式将配置文件的信息读取出来
 ResourceBundle rb=ResourceBundle.getBundle("配置文件名称");
/*直接写src下面的配置文件(.properties结尾)的名字就行,不用加上后缀名
它默认找的就是src文件夹下面的配置文件内容
*/
2.3.2 通过getString()方法(仅有这个方法)把刚刚读取到的内容赋值到变量中去
String diver=rb.getString("driver");
String url=rb.getString("url");
String user=rb.getString("user");
String pwd=rb.getString("pwd");
2.4 注册驱动
Class.forname(driver);
//只要用到了.class类,就会让类的代理对象去进行类的加载
//它本质还是在点这个方法的时候进行了类加载,然后执行了com.mysql.jdbc.Driver类中的静态代码块

com.mysql.jdbc.Driver类中的静态代码块源码如下所示

static {
   try {
        DriverManager.registerDriver(new Driver());
   } catch (SQLException var1) {
        throw new RuntimeException("Can't register driver!");
   }
}
2.5 建立连接
conn=DriverManager.getConnection(url,user,pwd);
2.6 创建数据库操作对象
st=conn.createStatement();
2.7 执行sql语句并处理查询结果
String sql="DQL语句/DML语句";
//若sql是DQL语句,需要用ResultSet来接收,通过next()方法和getString方法获取值
ResultSet rs=st.executeQuery(sql);
while(rs.next){
    String 变量名=rs.getString("字段名");
    //也可以通过getString("列的索引");1代表第一列.默认从1开始
    //也可以根据字段对应的数据类型去进行相应类型的获取,re.getInt()也是可以的
    /*通过字段名获取字段名对应的值,一般java的类的取名会和数据库的字段名保持一致
    即变量名和字段名看起来是一样的内容
    */
    ......
}
/*若sql语句是DML语句,需要用int类型接收,因为返回的是受影响的行数
如果受影响行数不为0,则DML操作成功,否则失败
*/
int count=st.executeUpdate(sql);
2.8.释放资源
/*释放资源的代码一般写在finally代码块中
因为无论你的程序是抛出异常还是没有异常,它都进行finally代码块去进行资源的关闭
关闭资源是调用的.close()方法,但是得要这个对象不为空才能去点方法
因为在释放资源前,需要进行非空判断
先关闭里面的资源,即st.close再去执行conn.close()
原理其实很简单,就是联系生活,外面的门和里面的门都要关,你先把外面的门关掉了,此时就没有办法去关闭里面的那条门了,因次就需要先关闭里面的资源,再去关闭外面的资源
*/
if (st != null) {
       try {
           st.close();
       } catch (SQLException throwables) {
           throwables.printStackTrace();
       } finally {
       }
}
if (conn != null) {
        try {
             conn.close();
        } catch (SQLException throwables) {
             throwables.printStackTrace();
        } finally {
        }
}
/*如果是sql语句是DQL语句的话,在st.close()之前需要rs.close()*/

3 实现

3.1 DQL语句
3.1.1 示例代码
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
import java.util.ResourceBundle;

public class JDBCTest {
    public static void main(String[] args) {
        //1.准备工作
        Connection conn=null;
        Statement st=null;
        ResultSet rs=null;
        //2.以键值对的形式读取配置文件的信息(等号左边为键,右边为值)
        ResourceBundle rb=ResourceBundle.getBundle("dbtext");
        //3.依次获取读取的内容,并把它写入到对应的变量中去
        String diver=rb.getString("driver");
        String url=rb.getString("url");
        String user=rb.getString("user");
        String pwd=rb.getString("pwd");
        try {
            //4.注册驱动
            Class.forName(diver);
            //5.获取(建立)连接
            conn=DriverManager.getConnection(url,user,pwd);
            //6.创建数据库操作对象
            st=conn.createStatement();
            //7.执行SQL语句
            String sql="SELECT * FROM emp WHERE ename='KING'";
            rs=st.executeQuery(sql);
            //8.处理结果集(展示结果集)
            System.out.println("查看的员工名称为KING的员工信息如下所示:");
            while(rs.next()){
                System.out.println("员工工号为: "+rs.getInt("empno"));
                System.out.println("员工名称为: "+rs.getString("ename"));
                System.out.println("员工职位为: "+rs.getString("job"));
                System.out.println("员工上级领导工号为: "+rs.getInt("mgr"));
                System.out.println("员工的入职日期为: "+rs.getDate("hiredate"));
                System.out.println("员工的薪水为: "+rs.getDouble("sal"));
                System.out.println("员工的津贴为: "+rs.getDouble("comm"));
                System.out.println("员工的部门编号为: "+rs.getInt("deptno"));
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            //9.释放资源
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (st != null) {
                try {
                    st.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }
    }
}
3.1.2 示例代码运行截图

在这里插入图片描述

3.3 DML语句
3.1.1 示例代码
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
import java.util.ResourceBundle;

public class JDBCTest {
    public static void main(String[] args) {
       //1.准备工作,因为是DML语句,所以无需声明结果集对象
        Connection conn=null;
        Statement st=null;
        //2.通过资源管理器读取配置文件的内容
        ResourceBundle rb=ResourceBundle.getBundle("dbtext");
        //3.把刚刚读取到的内容赋值到相应的变量中去
        String driver=rb.getString("driver");
        String url=rb.getString("url");
        String user=rb.getString("user");
        String pwd=rb.getString("pwd");
        try {
            //4.注册驱动
            Class.forName(driver);
            //5.获取(建立连接)
            conn=DriverManager.getConnection(url,user,pwd);
            //6.创建数据库操作对象
            st=conn.createStatement();
            //7.执行SQL语句
            String sql="update copy_emp SET comm=1000 WHERE ename='SMITH'";
            int count=st.executeUpdate(sql);
            //8.处理结果
            System.out.println(count>0?"更新数据成功":"更新数据失败");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            //9.释放资源
            if (st != null) {
                try {
                    st.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }
    }
}

3.1.2 示例代码运行截图

在这里插入图片描述

3.1.3 数据表原来的数据截图

在这里插入图片描述

3.1.4 数据表更新后的数据截图

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SSS4362

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值