【从删库到跑路】JDBC系列——JDBC编程六步

001-编写程序模拟JDBC本质

1、什么是JDBC?

Java DataBase Connectivity
在java语言中编写sql语句,对mysql数据库中的数据进行CRUD操作。

2、JDBC相关的类库在哪里?

java.sql.*;

3、JDBC本质上是一堆什么呢?

java.sql. * ;
这个包下都是JDBC的接口,SUN公司制定的!
JDBC是体现"接口作用"的非常经典的例子。
JDBC降低了耦合度,提高了扩展力。
对于java程序员来说,不需要关心数据库是哪个品牌。只要面向JDBc接口编程就行!

JDBC整个程序的结构当中有三波人????

  1. 第一波:sUN公司,负责制定JDBc接口。这些接口已经写好了,在java.sql.;

  2. 第二波:java.sql.*下面的所有接口都要有实现类,这些实现类是数据库厂家编写的。

    我们连接的是mysql数据库,mysql数据库厂家的实现类在哪里呢?
    mysql-connector-java-5.1.23-bin.jar
    jar包中很多.class字节码文件,这是mysql数据库厂家写的接口实现!

    注意:如果连接的是oracle数据库,你需要从网上下载oracle的jar包。

    mysql-connector-java-5.1.23-bin.jar
    这个jar包有一个专业的术语,大家记住就行:mysql的驱动。
    如果是oracle的jar,被称为oracle的驱动。

  3. 第三波:我们java程序员,面向JDBc接口写代码就行!

4、JDBC开发之前的准备工作?

  • mysql的驱动jar包,需要配置到classpath当中吗?
    mysql-connector-java-5.1.23-bin.jar里是字节码,是class文件。

  • Java虚拟机的类加载器会去加载class文件,类加载器怎么能够找到这些class文件呢?
    classpath没有配置的情况下,默认从当前路径下加载class。
    classpath如果配置死了,例如:classpath-D:\abc,则表示固定只从d:\abc目录下找class
    classpath=. ;D: \course\04-JDBC\resources \MySql Connector Java 5.1.23\mysql-connector-java-5.1.23-bin.jar

  • . ”代表什么?
    当前路径。

  • 以上的classpath什么意思?

    ​ 类加载器从当前路径下加载class,如果当前路径下没找到,则去D:\course\04-JDBC\resources\MySql Connector Java 5.1.23\mysql-connector-java-5.1.23-bin.jar找class文件。

  • jar包需要解压吗?
    不需要解压,java虚拟机的类加载器有这个能力找到class文件。

//这就是我们了。我们面向JDBC接口调用方法连接数据库
//我们不需要关心底层是mysql还是oraole,还是DB2,还是sybase.
//我们都不需要关心,因为JDBC接口的出现让程序降低了耦合度!!!
//我们Java程序员写一套JDBc程序,可以连接你任何一个品牌的数据库。
public class JavaProgranmer{
	public static void main(string[] args)(
		//面向JDBC接口写代码
		//JDBC jdibo = now Oraole() ;
		JDBC jdbe = new MySQL() ;
		//连接数据库
		//调用方法的时候,面向JDBC接口调用,JDBC接口中有什么方法就调什么方法。
		jdbc.getConnection();
		//...以下几百行代码都是面向jdbo接口调用的,不需要修改!
		//...
        }
}

002-JDBC编程六步

1、JDBC编程六步

  1. 注册驱动
    (通知java程序我们即将要连接的是哪个品牌的数据库)
  2. 获取数据库连接
    (java进程和mysgl进程,两个进程之间的通道开启了)
    (java进程可能在北京,mysql进程在上海)
  3. 获取数据库操作对象
    这个对象很重要,用这个对象执行SQL的。
  4. 执行SQL语句
    执行CRUD操作
  5. 处理查询结果集
    如果第四步是select语句,才有这个第五步
  6. 释放资源
    关闭所有的资源(因为JDBC毕竟是进程之间的通信,占用很多资源的,需要关闭!)
import java.sql.DriverManager;
import java.sql.Driver;
import java.sql.SQLException;
	
public class JDBCTest01{
	public static void main(String[] args){
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
		try{
			//1、注册驱动
			//com.mysql.jdbc.Driver是mysql数据库厂家写的,实现了java.sql.Driver接口。
			//如果是oracle数据库的话,类名就不一样了:oracle.jdbc.driver.oracleDriver
		   	Driver driver = new com.mysql.jdbc.Driver() ;//mysql的
             DriverManager.registerDriver (driver) ;
			// Draver driver = new oracle.jdbo.driver.OracleDriver();//oracle的
            
            //2、获取数据库连接
            String url = "jdbc:mysql://localhost:3306/bjpowernode";
            String user = "root";
            String password = "123456";
            conn = DriverManager.getConnection (url,user,password) ;
            //输出连接对象的内存地址
            // com.mysql.jdbo.JDBC4Connection02aaf7cc2
            // com.mysql.jdbc.JDBc4Connection类实现了java.sql.Connection接口。
            //实际上我们后续的开发不需要关心底层具体是哪个对象,因为面向接口编程。
            //System.out.println(conn);

            //3、获取数据库操作对象
            stmt = conn.createstatement() ;
            //System.out.println(stmt);
            
            //通过一个连接对象connection是可以创建多个statement对象的
            //statement stmt2 = conn.createstatement();
            //System.out.println(stmt2);
            
            //4、执行SQL语句
            // insert delete update
            /*		insert
            string insertsql="insert into dept(deptno,dname,loc)values(50,'销售部','北京')";
            // Statement接口中的executeUpdate方法专门来执行DML语句的。
            //该方法的返回值表示:影响了数据库表中的总记录条数!
            int count = stmt.executeUpdate (insertSql);
            System.out.println(count); // 1
            */
            /*		updata
            string updatesql="update dept set dname='人事部',loc='天津' where deptno=50";
            int count = stmt.executeUpdate (updateSql) ;
            System.out.println(count); // 1
            */
            //       delete
            String deleteSql = "delete from dept where deptno = 50";
            int count = stmt.executeUpdate (deleteSql);
            System.out.println(count);
            
            //		执行查询语句
            //JFBC当中的sql语句不需要以";"结尾
            String sql = "select empno,ename,sal from emp order by sal deso"";
            // 执行查询语句是这个方法:executeQuery
            // Resultset就是查询结果集对象,查询的结果都在这个对象当中。
            rs = stmt.executeQuery (sql);
            //5、处理查询结果集
            //目前没什么好处理的,直接把结果集中的数据遍历输出吧。
            
      	    //调用ResultSet接口中相应的方法来遍历结果集
            boolean has=rs.next();//光标向前移动一位
            while(re.next){
                //条件成立表示光标指向的行有记录
                //取当前行的第1个值
                String empno=rs.getstring(1)//注意:getstring()这个方法是不管底层数据
                //取当前行的第2个值
                String ename = rs.getString(2);
                //取当前行的第3个信~
                String sal = rs.getstring(3);
                System.out.println (empno + "," + ename + "," + sal);
                //也可以用特定类型取出
                
                //根据查询结果的列名可以取吗?
                //以后这种方式是常用的,健壮
                int empno = rs.getInt("empno");
                String ename = rs.getString("ename");
                double sal = rs.getDouble("sal");
                System.out.println (empno + "," + ename + "," + (sal + 100));

            }
		}catch(SQLException e){
			e.printStackTrace();
        }finally{
             // 释放资源
             // 6、先关闭ResultSet,先释放statement,再释放connection
             //分别进行try..catch处理
             //放到finally中关闭
			if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vJANSlc1-1654356983496)(…/…/…/Pictures/%E7%AE%97%E6%B3%95/P8/image-20220604230813779.png)]

2、URL统―资源定位符

    任何一个URL都包括:协议+IP地址+端口号port+资源名
    	http://192.168.100.2:8888/abc

协议:
是一个提前规定好的数据传输格式。通信协议有很多:http、https.
在传送数据之前,提前先商量好数据传送的格式。
这样对方接收到数据之后,就会按照这个格式去解析,拿到有价值的数据。
IP地址:
网络当中定位某台计算机的。
PORT端口号:
定位这台计算机上某个服务的。
资源名:
这个服务下的某个资源。

 /*

        jdbc:mysql://		这是java程序和mysql通信的协议。      
        localhost			这是本机IP地址,本机IP地址还可以写成:127.0.0.1    
        3306				mysql数据库端口号
        bjpowernode			mysql数据库的名称
        
        jdbc:mysq1://192.168.111.123:3306/abc
        
        如果是oracle数据库的话:
        	oracle: jdbc:thin:0localhost:1521:bjpowernode
        	oracle:jdbc:thin:0		  这是oracle和java的通信协议
            localhost				  这是本机IP地址。     
            1521					  oracle默认端口
            bjpowernode				  oracle中数据库的名字
        
        1ocalhost和127.0.0.1都是本机IP地址。死记硬背。
*/

3、注册驱动的第二种方式:类加载注册

package com.bjpowernode.jdbc;
/*
注册驱动的第二种方式:类加载注册

mysql的厂家写的类:
class com.mysql.jdbc.Dniver {
	static {
		try {
			java.sql.DriverManager.registerDriver(new Driver());
		} catch (SQLException E) {
			throw new RuntimeException("Can't register driver!");
		}
	}
}
*/
public class JDBCTest04 {
	public static void main(String[] args) {
		try {
			//1、注册驱动
            Class.forName("com.mysq1.jdbc.Driver");
            //2、获取连接
            conn = 	DriverManager.getConnection("jdbc:mysq1://127.0.0.1:3306/bjpowernode","root","123456");
			//3、获取数据库对象
            stmt = conn.createStatement();
            //4、执行SQL
            String sql = "select e.ename,d.dname from emp e join dept d on e.deptno = d.deptno";
            rs = stmt.executeQuery(sql);
            //5、处理查询结果集
            while(rs.next()){
                String ename = rs.getString("ename");
                String dname = rs.getString("dname");
                System.out.println(ename+","+dname);

            }
		} catch (ClassNotFoundException e){
			e.printStackTrace();
        } finally {
            //6、释放资源
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

4、读取属性配置文件

思想:
将连接数据库的可变化的4条信息写到配置文件中。
以后想连接其他数据库的时候,可以直接修改配置文件,不用修改java程序。
四个信息是什么?
driver
url
user
password

src下新建一个Package名叫“resources”,新建一个fille叫"db.properties"

在这里插入图片描述

#######mysql connectivity configuration###############
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/bjpowernode
user=root
password=123456

#######oracle connectivity configuration###############
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:bjpowernode
user=scott
password=tiger

在这里插入图片描述

在这里插入图片描述

//资源绑定器
ResourceBundle bundle = ResourceBundle.getBundle("resources/db");
//通过属性配置文件拿到信息
String driver = bundle.getString( key: "driver");
String url = bundle.getString( key: "url");
String user = bundle.getString( key:"user");
String password = bundle.getString( key: "password");

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

胖虎不秃头

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

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

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

打赏作者

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

抵扣说明:

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

余额充值