JDBC简介
介绍
JDBC :java database Connectivity java与数据库的连接 JDBC市 java官方提供的一套使用java语言链接操纵数据的API,主要是java.sql包
学习下面的内容首先要学习CoreJava和MySql
三方责任
1.在java程序中访问数据库
2.方案:
1.程序员手动实现java连接各种数据库,它需要开发人员关注连接的细节,而且换项目还需要重新写连接封装成jar包(不现实不可行)
2.JAVA官方实现java连接各种数据库 所有链接需要JAVA官方实现,对于JAVA官方一个数据库对应一个连接(不可行)
3.数据库厂商实现JAVA连接各自数据库 数据库厂商开发驱动 提供自己数据库和java真正连接的类库也就是jar包,<==驱动开发者,对于应用程序开发者对于代码的可读性有难题
JAVA官方出现:指定标准(接口interface) 厂商实现标准
应用程序开发者从此不需要关注具体怎么实现连接,只需要使用驱动,离不开驱动,但不用真正关注它
3.1 JAVA制定的API java.sql包
1.java.sql.Driver:[I]驱动
--该接口是获得连接的标准 每一个驱动程序 都是先该接口及其中的connect方法
2.java.sql.DriverManager:[C] 驱动管理器
--底层管理驱动 对外提供获得连接的方法
--当外部需要连接时 外部调DriverManager
--Connection con =DriverManager.getConnection(url,username,password);
3.java.sql.Connection [I] 连接
--Connection对象可以创建SQL执行器
--Statement sta =con.createStatement();
--PrepareStatment pst = con.prepareStatement();
4.java.sql.Statement[I] Sql语句执行器
--Statement sta =con.createStatement();
--String sql ="select * from student"
5.java.sql.ResultSet[I] 结果集 存数据库里返回的内容
--ResultSet rs = sta.executeQuery(sql);
--另外还有增删 execute
--更改executeUpdate()
3.2 javax.sql API (dataSourse)
第一个JDBC程序
笔者这里用的idea 先去官网上下载mysql的jar包到本地,打开idea
1.首先设置工作区 先在本地建一个文件夹 idea打开
设置main入口
然后apply 确定 工作区就设置完毕了
2.导入jar包
选择刚才下载的jar包打上勾 apply 确定
ok可以放飞自我了
首先mysql里面有我建的学生表 给大家看一下
打开java程序开始写就可以了
import java.sql.*;
public class FirstJDBC {
public static void main(String[] args) throws Exception {
//注册驱动,导入jar包
Class.forName("com.mysql.jdbc.Driver");
//获得桥梁
String url = "jdbc:mysql://127.0.0.1:3306/你的数据库名称";
String user = "root";
String pwd = "你的密码";
Connection con = DriverManager.getConnection(url, user, pwd);
//造车sql语句执行器
Statement sta = con.createStatement();
String sql = "select * from student";
//加载查询语句 获得结果集
ResultSet rs = sta.executeQuery(sql);
//迭代器
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
//String code =rs.getString("code");
System.out.println(id + "\t" + name + "\t");
}
rs.close();
sta.close();
con.close();
}
}
ctrl +shift +F10运行看一下 刚才的数据库里的表是否已经展示出来了
JDBC流程的细节
细节一 注册驱动
以下涉及源码分析~~
Class.forName("com.mysql.jdbc.Driver");//加载这个Driver
当这一句话执行的时候,告诉计算机加载一个类,我们打开官方下载的jar包,反编译一下进入到源码找到Driver这个类会看到这么一个静态代码块👇,也就是说类加载时会执行DriverManager.registerDriver(new Driver());这么一句
static{
try{
DriverManager.registerDriver(new Driver());//这里传了一个Driver的对象
}catch (SQLException E)
{
throw new RuntimeException("Can't registe driver!");
}
}
再进入导DriverManager.registerDriver()这个方法中看看
DriverManager{
public static registerDriver(java.sql.Driver driver){
registerDriver(driver, null);
}
有朋友会问这个函数要求传一个接口,而我们怎么给他一个Driver对象呢?
A:Driver这个类实现了.java.sql.Driver这个接口,也就相当于他需要一个Object,而我们传一个String是完全没有问题的 典型的JAVA多态思想
而真正干活的则是DriverManager类中 registerDriver(driver, null)这个函数,而继续往下挖,看看 registerDriver(driver, null);这个函数到底干了点啥
registerDriver(Driver driver,DriverAction action ){
public static synchronized void registerDriver(java.sql.Driver driver,
DriverAction da)
throws SQLException {
/* Register the driver if it has not already been added to our list */
if(driver != null) {
//把驱动对象扔到 存放驱动的集合中。
registeredDrivers.addIfAbsent(new DriverInfo(driver, da));
} else {
// This is for compatibility with the original DriverManager
throw new NullPointerException();
}
println("registerDriver: " + driver);
}
}
}
DriverInfo就是Driver的一个包装类,没啥里面没啥东西就重写了以下tostring(),hashcode()这些方法,本质就一句话registeredDrivers.addIfAbsent(new DriverInfo(driver, da));而往上找找就能看见CopyOnWriteArrayList registeredDrivers =new CopyOnWriteArrayList ()显而易见这是个集合
也就是说这一整套下来就一个事,把一个driver对象扔进一个集合里
那么到这Class.forName(“com.mysql.jdbc.Driver”)这一句也就完了
细节二 Connection 只要连数据库就需要四个参数 driver url user pwd
三个参数
String url="jdbc:mysql://127.0.0.1:3306/XX";//你的数据库名称
String user ="root";
String password ="你的密码";
DriverManager.getCoinnection(url,user,password);
两个参数
import java.uitl.properties:Properties;//导包
import java.io.*;
建立配置文件
String url="jdbc:mysql://127.0.0.1:3306/XX";
Properties info = new Properties();
info.load(new FileInputStream(new File("confige.properties")));//load()方法读配置文件
Connection con =DriverManager.getConnection(url,info);
我们分析一下源码看怎么实现的,这里我们最最最关键的一句话是DriverManager.getCoinnection(url,user,password);
那我们进入DriverManager类看看这个方法
我圈起来的这个地方就很清晰了,它用了个for循环遍历刚才存driver对象的集合,用driver自己的connect方法去获得Connection对象,传入的info和url也是从这个时候发挥作用的
细节三 Statement (车)
1.使用JDBC 创建一张表 users(id,name,pwd)
2.添加10条数据
3.查询数据
核心代码👇,用"桥"区配置一部"车"
Statement sta = con.createStatement();//桥.createStatement()
String sql ="你的sql语句";
sta.execute(sql);
上代码:
import java.io.FileInputStream;
import java.sql.*;
import java.util.Properties;
import java.io.*;
public class Exec1 {
public static void main(String[] args)throws Exception {
//createTable();
//insertData();
queryData();
}
//建表 的方法
static void createTable()throws Exception{
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://127.0.0.1:3306/你的数据库";
String user="root";
String password ="你的密码";
//造桥
Connection con =DriverManager.getConnection(url,user,password);
//用桥适配出啥样的车
Statement sta = con.createStatement();
String sql ="create table user(id int primary key auto_increment,name varchar(20));";
//车执行sql语句
sta.execute(sql);//不太明确使用哪个执行的方法可以使用这个 万能方法 任意sql都可以执行 返回Boolean 执行select语句返回true 其余返回false
sta.close();
con.close();
}
//添加数据的方法
static void insertData()throws Exception{
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://127.0.0.1:3306/你的数据库";
String user ="root";
String password="你的密码";
Connection con = DriverManager.getConnection(url,user,password);
Statement sta = con.createStatement();
String sql ="insert into user (name)values ('小明'),('小张'),('小林'),('小王'),('小管'),('小青'),('小傻'),('小狗'),('et001'),('et002');";
sta.executeUpdate(sql);//返回int 影响行数
sta.close();
con.close();
}
//查询数据的方法 这里我用的读取配置文件的方法 主要是让大家练习两种方式 当然前面连接那部分最单独封装成一个函数,这里主要是多写几遍让大家熟悉整个流程
static void queryData()throws Exception{
Class.forName("com.mysql.jdbc.Driver");
String url ="jdbc:mysql://127.0.0.1:3306/你的数据库";
Properties info = new Properties();
info.load(new FileInputStream(new File("confige.properties")));
Connection con =DriverManager.getConnection(url,info);
Statement sta =con.createStatement();
String sql ="select * from user";
ResultSet rs =sta.executeQuery(sql);//返回结果集
while(rs.next()){
String name =rs.getString("name");
int id = rs.getInt("id");
System.out.println(name+" "+id);
}
rs.close();
sta.close();
con.close();
}
}
另外
//关于execute的返回值
sta.execute(sql);//返回一个Boolean类型 当sql是查询语句时为true
sta.executeUpDate(sql);//返回一个int数 代表影响表的的行数
sta.executeQuery(sql);//返回一个查询到的结果集
sta.executeBat(sql);//批处理对于一批数据的更新和添加效率很高 返回影响行数(int)
执行结果👇
细节四 ResultSet:
ResultSet代表数据库查询返回的记录,通常有一个指针最初位于第一行之前和迭代器一个熊样 所以我们刚上来往往都
while(rs.next()){
//getString or getInt...
rs.getXXXX("查询字段列表中的别名");
rs.getXXXX(int); //查询字段列表中的索引值从1开始,注意时查询字段列表而不是字段
}
总结
JDBC的流程就讲完了,希望大家有收获,有不对的地方欢迎大家指正