JDBC从入门到精通
课程地址:
https://www.bilibili.com/video/BV1Bt41137iB?spm_id_from=333.999.0.0
P1 JDBC课程的目录结构介绍
P2 对JDBC本质的理解
1、JDBC:Java DataBase Connecttivity(Java语言链接数据库)
2、JDBC本质:
JDBC是SUN公司指定的一套接口(interface)
接口都有调用者和实现者
面向接口调用、面向接口写实现类,这都属于面向接口编程。
为什么要面向接口编程:
解耦合:降低程序的耦合度,提供程序的扩展力
多态机制就是非常典型的:面向对象编程。(不要面向具体编程)
建议:
Animal a=new Cat();
Animal a=new Dog();
喂养的方法:
public void feed(Animal a){ //面向父类型编程。
}
不建议:
Dog d=new Dog();
Cat c=new Cat();
思考:为什么SUN指定一套JDBC接口:
因为每一个数据库的底层实现原理都不一样。
Oracle数据库有自己的原理。
MySQL数据库有自己的原理。
。。。
每一个数据库产品都有自己独特的实现原理。
案例文件信息:
SqlServer.java
/* SqlServer的数据库厂家负责编写JDBC接口的实现类: */ public class SqlServer implements JDBC{ public void getConnection(){ //这段代码涉及到SqlServer底层数据库的实现原理。 System.out.println("连接SqlServer数据库成功!"); } } //实现类被称为驱动。(SqlServer驱动)
Oracle.java
/* Oracle的数据库厂家负责编写JDBC接口的实现类: */ public class Oracle implements JDBC{ public void getConnection(){ //这段代码涉及到Oracle底层数据库的实现原理。 System.out.println("连接Oracle数据库成功!"); } } //实现类被称为驱动。(Oracle驱动)
MySQL.java
/* MySQL的数据库厂家负责编写JDBC接口的实现类: */ public class MySQL implements JDBC{ public void getConnection(){ //这段代码涉及到mySQL底层数据库的实现原理。 System.out.println("连接MySQL数据库成功!"); } } //实现类被称为驱动。(mysql驱动)
JDBC.java
/* SUN公司负责指定这套JDBC接口。 */ public interface JDBC{ /* 连接数据库的方法: */ void getConnection(); }
jdbc.properties
1 | className=SqlServer |
JavaProgrammer.java
/* Java程序员角色: 不需要关心具体是那个品牌的数据库,只需要面向JDB接口写代码。 面向接口编程,面向抽象编程,不要面向具体编程。 */ import java.util.*; public class JavaProgrammer{ public static void main(String[] args) throws Exception{ //JDBC jdbc= new MySQL(); //JDBC jdbc= new SqlServer(); //创建对象可以通过反射机制 ResourceBundle bundle=ResourceBundle.getBundle("jdbc"); String className=bundle.getString("className"); Class c = Class.forName(className); JDBC jdbc=(JDBC)c.newInstance(); //以下代码就是面向接口调用方法,不需要修改: jdbc.getConnection(); } }
P3 编写程序模拟JDBC本质
JDBC的本质是什么:一套接口
P4 将驱动jar配置到环境变量classpath中
3.JDBC开发前的准备工作:
先从官网下载对应的驱动jar包,然后将其配置到环境变量classpath当中。
P5 JDBC编程六步的概述
P6 注册驱动和获取链接
import java.sql.Driver; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Connection; public class JDBCTest01{ public static void main(String[] args){ try{ //1、注册驱动: Driver driver=new com.mysql.jdbc.Driver();//多态,父类型引用指向子类型对象。 DriverManager.registerDriver(driver); //2.获取链接: /* 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/test jdbc:mysql 协议 127.0.0.1 IP地址 3306 mysql数据库端口号 test具体的数据库实例名 说明:localhost和127.0.0.1都是本机IP地址。 什么事通信协议,有什么用: 通信协议是通信之前就订好的数据传送格式。 数据包具体怎么传数据,格式提前订好的。 */ String url="jdbc:mysql://127.0.0.1:3306/test"; String user="root"; String password="root"; Connection conn=DriverManager.getConnection(url,user,password); System.out.println("数据库链接对象="+conn); }catch(SQLException e){ e.printStackTrace(); } } }
P8 执行删除与更新
/* JDBC完成delete update */ 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:mysql://localhost:3306/test","root","root"); //3.获取操作数据库的操作对象 stmt=conn.createStatement(); //4.执行SQL语句 //String sql="delete from dept where deptno='40'"; //JDBC中的sql语句不需要提供分号结尾 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.释放资源 if(stmt!=null){ try{ stmt.close(); }catch(SQLException e){ e.printStackTrace(); } } if(conn!=null){ try{ conn.close(); }catch(SQLException e){ e.printStackTrace(); } } } } }
P9 类加载的方式注册驱动
/* 注册驱动的另一种方式(这种方式常用) */ 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:mysql://localhost:3306/test","root","root"); System.out.println(conn); }catch(SQLException e){ e.printStackTrace(); }catch(ClassNotFoundException e){ e.printStackTrace(); } } }
P10 从属性资源文件中读取连接数据库信息
jdbc.properties
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/test user=root password=root
/* JDBC完成delete update */ import java.sql.*; import java.util.*; public class JDBCTest04{ public static void main(String[] args){ ResourceBundle bundle=ResourceBundle.getBundle("jdbc"); System.out.println("bundle001"); System.out.println(bundle); System.out.println("bundle002"); String driver=bundle.getString("driver"); System.out.println(driver); String url=bundle.getString("url"); String user=bundle.getString("user"); String password=bundle.getString("password"); Connection conn=null; Statement stmt=null; try{ //1.注册驱动 Class.forName(driver); //2.获取链接 conn=DriverManager.getConnection(url,user,password); //3.获取操作数据库的操作对象 stmt=conn.createStatement(); //4.执行SQL语句 //String sql="delete from dept where deptno='40'"; //JDBC中的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{ //6.释放资源 if(stmt!=null){ try{ stmt.close(); }catch(SQLException e){ e.printStackTrace(); } } if(conn!=null){ try{ conn.close(); }catch(SQLException e){ e.printStackTrace(); } } } } }
P11 处理查询结果集
/* 处理查询结果集:[遍历结果集] */ import java.sql.*; public class JDBCTest05{ public static void main(String[] args){ Connection conn=null; Statement stmt=null; ResultSet rs=null; try{ //1.注册驱动 Class.forName("com.mysql.jdbc.Driver"); //2.获取连接 conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","root"); //3.获取数据库操作对象 stmt=conn.createStatement(); //4.执行sql //String sql="select empno,ename,sal from emp"; String sql="select empno as a,ename,sal from emp"; rs=stmt.executeQuery(sql); //专门执行DQL语句: //5.处理查询结果集: /*boolean flag1=rs.next(); System.out.println(flag1); if(flag1){ //光标指向的行有数据: //取数据: //getString() 方法的特点是:不管数据库中的数据类型是什么,都以String的形式取出。 String empno=rs.getString(1); String ename=rs.getString(2); String sal=rs.getString(3); System.out.println(empno+","+ename+","+sal); } flag1=rs.next(); System.out.println(flag1); if(flag1){ //以下程序的1 2 3 说的是第几列: String empno=rs.getString(1); String ename=rs.getString(2); String sal=rs.getString(3); System.out.println(empno+","+ename+","+sal); }*/ while(rs.next()){ /*String empno=rs.getString(1); String ename=rs.getString(2); String sal=rs.getString(3); System.out.println(empno+","+ename+","+sal); */ /*String empno=rs.getString("a"); String ename=rs.getString("ename"); String sal=rs.getString("sal"); System.out.println(empno+","+ename+","+sal); */ int empno=rs.getInt("a"); String ename=rs.getString("ename"); double sal=rs.getDouble("sal"); System.out.println(empno+","+ename+","+(sal+200)); } }catch(Exception e){ e.printStackTrace(); }finally{ //6.释放资源: if(rs!=null){ try{ rs.close(); }catch(Exception e){ e.printStackTrace(); } } if(stmt!=null){ try{ stmt.close(); }catch(Exception e){ e.printStackTrace(); } } if(conn!=null){ try{ conn.close(); }catch(Exception e){ e.printStackTrace(); } } } } }
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
2020-05-07 Android Studio 3.5 plugin中找不到Flutter插件