• JDBC(一)


    视频链接:https://www.bilibili.com/video/BV1Bt41137iB?vd_source=9545770e4a2968c05878ffac8589ec6c
    视频选集:P1— P13

    1.JDBC基础概念

    • JDBC:Java DataBase connectivity ( Java语言连接数据库)
    • java.sql.*;(这个软件包下有很多接口)
    • 本质:JDBC是SUN公司制定的一套接口(interface)【接口都有调用者和实现者】
    • 面向接口调用、面向接口写实现类,这都属于面向接口编程

    问题:为什么要面向接口编程?
    答:解耦合:降低程序的耦合度,提高程序的扩展力。多态机制就是非常典型的:面向抽象编程。【不要面向具体编程】

    建议:
    	Animal a = new Cat() ;
    	Animal a = new Dog () ;
    	//喂养的方法
    	public void feed(Animal a){ //面向父类型编程
    	
    	}
    
    不建议:
    	Dog d = new Dog ();
    	Cat c = new Cat () ;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    问题:为什么SUN制定一套JDBC接口呢?
    答:因为每一个数据库的底层实现原理都不一样。oracle数据库有自己的原理,MySQL数据库也有自己的原理,MS sql server数据库也有自己的原理。【每一个数据库产品都有自己独特的实现原理】

    在这里插入图片描述

    2.编写程序模拟JDBC本质

    本质:一套接口
    在这里插入图片描述
    SUN:

    //SUN公司负责制定这套JDBc接口。
    public interface JDBC{
    	//连接数据库的方法
    	void getConnection () ;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    MySQL的数据库厂家负责编写JDBC接口的实现类:

    public class MySQL implements JDBC{
    	public void getConnection () {
    		//具体这里的代码怎么写,对于我们Java程序员来说没关系
    		//这段代码涉及到mysql底层数据库的实现原理
    		System.out.println ("连接MySQL数据库成功!") ;
    	}
    }
    
    //实现类被称为驱动(MySQL驱动)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Oracle的数据库厂家负责编写JDBC接口的实现类:

    public class Oracle implements JDBC{
    	public void getConnection () {
    		System.out.println ("连接Oracle数据库成功!") ;
    	}
    }
    
    //实现类被称为驱动(Oracle驱动)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    SqlServer的数据库厂家负责编写JDBC接口的实现类:

    public class SqlServer implements JDBC{
    	public void getConnection () {
    		System.out.println ("连接SqlServer数据库成功!") ;
    	}
    }
    
    //实现类被称为驱动(SqlServer驱动)
    //xxx.jar当中有很多.class,都是对JDBc接口进行的实现。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    Java程序员:

    第一种情况:

    //不需要关心具体是哪个品牌的数据库,只需要面向JDBC接口写代码
    //面向接口编程,面向抽象编程,不要面向具体编程
    
    public class JavaProgrammer
    {
    	public static void main (String[] args) throws Exception{
    			JDBC jdbc = new MySQL() ;
    			JDBC jdbc = new SqlServer () ;
    
    			//以下代码都是面向接口调用方法,不需要修改
    			jdbc.getConnection () ;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    第二种情况:

    public class JavaProgrammer
    {
    	public static void main (String[] args) throws Exception{
    			//创建对象可以通过反射机制
    			Class c = Class.forName ( "MySQL") ;
    			JDBC jdbc = (JDBC) c.newInstance () ;
    
    			//以下代码都是面向接口调用方法,不需要修改
    			jdbc.getConnection () ;
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    第三种情况:
    创建配置文件
    在这里插入图片描述

    import java.util.*;
    public class JavaProgrammer
    {
    	public static void main (String[] args) throws Exception{
    			//创建对象可以通过反射机制
    			ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
    			String className = bundle.getString ( "className") ;
    			Class c = Class.forName (className) ;
    			JDBC jdbc = (JDBC) c.newInstance () ;
    
    			//以下代码都是面向接口调用方法,不需要修改
    			jdbc.getConnection () ;
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3.JDBC开发前准备工作

    先从官网下载对应的驱动jar包,然后将其配置到环境变量classpath当中。

    下载:
    在这里插入图片描述
    配置到环境变量中:
    在这里插入图片描述

    注意:以上的配置是针对于文本编辑器的方式开发,使用IDEA工具的时候,不需要配置以上的环境变量。【IDEA有自己的配置方式】

    4.JDBC编程六步概述

    • 第一步:注册驱动(作用:告诉Java程序,即将要连接的是哪个品牌的数据库)
    • 第二步:获取连接(表示JVM的进程和数据库进程之间的通道打开了,这属于进程之间的通信,重量级的,使用完之后一定要关闭通道)
    • 第三步:获取数据库操作对象(专门执行sql语句的对象)
    • 第四步:执行SQL语句(DQL DML…)
    • 第五步:处理查询结果集(只有当第四步执行的是select语句的时候,才有这第五步处理查询结果集。)
    • 第六步:释放资源(使用完资源之后一定要关闭资源。Java和数据库属于进程间的通信,开启之后一定要关闭)

    5.JDBC编程代码实现

    import java.sql.Driver;
    import java.sql.DriverManager ;
    import java.sql.SQLException;
    import java.sql.Connection ;
    import java.sql.Statement;
    
    public class JDBCTest01{
    	public static void main (String [] args)(
    		Connection conn = null;
    		Statement stmt = null;
    		try {
    			//1、注册驱动
    			Driver driver = new com.mysql.jdbc.Driver(); //多态,父类型引用指向子类型对象
    			// Driver driver = new oracle.jdbc.driver.OracleDriver(); // Oracle的驱动
    			DriverManager.registerDriver(driver) ;
    
    			//2、获取连接
    			String url = "jdbc:mysq1://127.0.0.1:3306/bjpowernode";
    			String user = "root" ;
    			String password = "333";
    			conn = DriverManager.getConnection (url,user,password) ;
    			System.out.println ("数据库连接对象 =+ conn) ;// com.mysql.jdbc.JDBC4Connection@41cf53f9
    
    			//3、获取数据库操作对象
    			stmt = conn.createStatement () ;
    
    			//4、执行sql
    			String sql = "insert into dept (deptno,dname,loc) values (50,'人事部','北京')";
    			//专门执行DML语句的(insert delete update)
    			//返回值是"影响数据库中的记录条数"
    			int count = stmt.executeUpdate (sql) ;
    			System.out.println (count == 1 ? "保存成功” : "保存失败") ;
    
    			//5、处理查询结果集【由于是插入语句,在这里没有】
    			
    		}catch (SQLException e) {
    			e.printStackTrace () ;
    		}finally{
    			//6、释放资源
    			//为了保证资源一定释放,在finally语句块中关闭资源
    			//并且要遵循从小到大依次关闭
    			//分别对其try. . catch
    			try {
    				if (stmt != nu11) {
    					stmt.close() ;
    				}
    			}catch (SQLException e) {
    				e.printStackTrace () ;
    			}
    			try {
    				if (conn != nu11) {
    					conn.close() ;
    				}
    			}catch (SQLException e) {
    				e.printStackTrace () ;
    			}
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    url :统一资源定位符(网络中某个资源的绝对路径) 比如:https: //www . baidu. com/ 这就是URL
    
    url包括哪几部分? 
    		协议、IP、PORT、资源名
    
    http://182.61.200.7:80/ index.html
    	http://      通信协议
    	182.61.200.7 服务器IP地址
    	80           服务器上软件的端口
    	index.html   是服务器上某个资源名
    
    jdbc:mysql://127.0.0.1:3306/bjpowernode
    	jdbc:mysql://	协议
    	127.0.0.1 		IP地址
    	3306 			mysql数据库端口号
    	bjpowernode		具体的数据库实例名
    
    注意:localhost和127.0.0.1都是本机IP地址
    通信协议是通信之前就提前定好的数据传送格式。【数据包具体怎么传数据,格式提前定好的。】
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    6.JDBC执行删除与更新

    JDBC中的sql语句不需要提供分号结尾

    import java.sql.*;
    
    public class JDBCTest02{
    	public static void main (String [] args)(
    		Connection conn = null;
    		Statement stmt = null;
    		try {
    			//1、注册驱动
    			DriverManager.registerDriver(new com.mysql.jdbc.Driver()) ;
    
    			//2、获取连接
    			conn = DriverManager.getConnection ("jdbc:mysq1://127.0.0.1:3306/bjpowernode","root","333") ;
    
    			//3、获取数据库操作对象
    			stmt = conn.createStatement () ;
    
    			//4、执行sql
    			//删除
    			String sql = "delete from dept where deptno = 40";
    			//更新
    			String sql = "update dept set dname = '销售部',loc ='天津' where deptno = 20";
    			int count = stmt. executeUpdate (sql) ;
    			System.out.println (count == 1 ? "保存成功” : "保存失败") ;
    
    		}catch (SQLException e) {
    			e.printStackTrace () ;
    		}finally{
    			//6、释放资源
    			//为了保证资源一定释放,在finally语句块中关闭资源
    			//并且要遵循从小到大依次关闭
    			//分别对其try. . catch
    			try {
    				if (stmt != nu11) {
    					stmt.close() ;
    				}
    			}catch (SQLException e) {
    				e.printStackTrace () ;
    			}
    			try {
    				if (conn != nu11) {
    					conn.close() ;
    				}
    			}catch (SQLException e) {
    				e.printStackTrace () ;
    			}
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    7.类加载的方式注册驱动【常用】

    import java.sql.*;
    
    public class JDBCTest03{
    	public static void main (String [] args)(
    		try {
    			//1、注册驱动
    			//这是注册驱动的第一种写法
    			DriverManager.registerDriver(new com.mysql.jdbc.Driver()) ;
    
    			//这是注册驱动的第二种写法 反射机制 常用【因为参数是一个字符串,字符串可以写到xxx.properties文件中】
    			//以下方法不需要接收返回值,因为只想用它的类加载动作
    			Class.forName ( "com.mysql.jdbc.Driver") ;
    			//2、获取连接
    			Connection conn = DriverManager.getConnection ("jdbc:mysq1://127.0.0.1:3306/bjpowernode","root","333") ;
    
    		}catch (SQLException e) {
    			e.printStackTrace () ;
    		} catch (ClassNotFoundException e) {
    			e. printStackTrace () ;
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    8.从属性资源文件中读取连接数据库信息

    实际开发中不建议把连接数据库的信息写死到java程序中

    添加配置文件

    在这里插入图片描述

    import java.sql.*;
    import java.util.*;
    
    public class JDBCTest04{
    	public static void main (String [] args)(
    		//使用资源绑定器绑定属性配置文件
    		ResourceBundle bundle = ResourceBundle.getBundle ("jdbc") ;//[jdbc.properties的后缀.properties可不加]
    		String driver = bundle.getString ("driver") ;
    		String url = bundle.getString ("url") ;
    		String user = bundle.getString ("user") ;
    		String password = bundle.getString ("password") ;
    		
    		Connection conn = null;
    		Statement stmt = null;
    		try {
    			//1、注册驱动
    			String driver = "com.mysql.jdbc.Driver"
    			Class.forName (driver) ;
    
    			//2、获取连接
    			String url = "jdbc:mysq1://127.0.0.1:3306/bjpowernode";
    			String user = "root" ;
    			String password = "333";
    			conn = DriverManager.getConnection (url,user,password) ;
    
    			//3、获取数据库操作对象
    			stmt = conn.createStatement () ;
    
    			//4、执行sql
    			//更新
    			String sql = "update dept set dname = '销售部',loc ='天津' where deptno = 20";
    			int count = stmt. executeUpdate (sql) ;
    			System.out.println (count == 1 ? "修改成功” : "修改失败") ;
    
    		}catch (Exception e) {
    			e.printStackTrace () ;
    		}finally{
    			try {
    				if (stmt != nu11) {
    					stmt.close() ;
    				}
    			}catch (SQLException e) {
    				e.printStackTrace () ;
    			}
    			try {
    				if (conn != nu11) {
    					conn.close() ;
    				}
    			}catch (SQLException e) {
    				e.printStackTrace () ;
    			}
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    9.处理查询结果集

    executeUpdate (insert/ delete/update) 返回int
    executeQuery (select) 返回Resultset
    遍历结果集:
    在这里插入图片描述

    import java.sql.*;
    
    public class JDBCTest04{
    	public static void main (String[] args)(
    		Connection conn = null;
    		Statement stmt = null;
    		ResultSet rs = null;
    		
    		try {
    			//1、注册驱动
    			DriverManager.registerDriver(new com.mysql.jdbc.Driver()) ;
    
    			//2、获取连接
    			conn = DriverManager.getConnection ("jdbc:mysq1://127.0.0.1:3306/bjpowernode","root","333") ;
    
    			//3、获取数据库操作对象
    			stmt = conn.createStatement () ;
    
    			//4、执行sql
    			String sql = "select empno,ename,sal from emp";
    			rs = stmt.executeQuery(sql); //专门执行DQL语句的方法。
    			
    			//5、处理查询结果集
    			while(rs.next()){
    				//光标指向的行有数据
    				//取数据
    				// getstring() 方法的特点是:不管数据库中的数据类型是什么,都以string的形式取出
    				//以下程序的1 2 3 说的第几列
    				//第一种表达方式
    				String empno = rs.getString(1) ;// JDBC中所有下标从1开始。不是从0开始。
    				String ename = rs.getString(2) ;
    				String sal = rs.getString(3) ;
    
    				//第二种表达方式
    				String empno = rs.getString ("empno") ;
    				//string empno = rs.getstring("a"); //重点注意:列名称不是表中的列名称,是查询结果集的列名称。
    				String ename = rs.getString ("ename") ;
    				String sal = rs.getString("sal") ;
    				
    				//除了可以以String类型取出之外,还可以以特定的类型取出。也可以以第二种表达式取列
    				//int empno = rs.getInt(1) ;
    				//String ename = rs.getString(2) ;
    				//double sal = rs.getDouble(3) ;
    				//System.out.println (empno + "," + ename + "," + (sal + 100)) ;
    
    				System. out .println (empno + "," + ename + "," + sal) ;
    			}
    
    		}catch (SQLException e) {
    			e.printStackTrace () ;
    		}finally{
    			//6、释放资源
    			try {
    				if (rs != nu11) {
    					rs.close() ;
    				}
    			}catch (SQLException e) {
    				e.printStackTrace () ;
    			}
    			try {
    				if (stmt != nu11) {
    					stmt.close() ;
    				}
    			}catch (SQLException e) {
    				e.printStackTrace () ;
    			}
    			try {
    				if (conn != nu11) {
    					conn.close() ;
    				}
    			}catch (SQLException e) {
    				e.printStackTrace () ;
    			}
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76

    10.使用IDEA开发JDBC代码配置驱动

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    选择JAVA模块

    导入数据库:
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    导入效果:
    在这里插入图片描述

  • 相关阅读:
    通信原理学习笔记6-1:数字解调——基础解调链路、匹配滤波器和AWGN信道最佳接收机
    STM32之HAL开发——FSMC控制带控制器LCD(8080时序)
    Java面试题:Java中垃圾回收机制是如何工作的?请描述几种常见的垃圾回收算法
    推荐系统的基本概念
    Linux基础命令之tar解压缩详解
    DRM全解析 —— CRTC详解(4)
    AIoT 在线工程实训平台案例——智能家居2
    Day28——复原IP地址、子集、子集||
    中国与外国互免签证协定一览表(更新至2022年7月8日)
    Python和Java应该如何选择?该怎么学?
  • 原文地址:https://blog.csdn.net/weixin_49883619/article/details/126949045