第一节 JDBC(Java数据库连接)
一.什么是JDBC?
JDBC(Java Data Base Connectivity, Java数据库连接)
是一种用于执行SQL语句的Java API,为多种关系数据库提供统一访问
它由一组用Java语言编写的类和接口组成(由sun公司提供的)(这些类和接口是由数据库公司来实现的,谁来实现它,就连接谁的数据库)
2.有了JDBC,程序员只需用JDBC API写一个程序,就可访问所有数据库。
(使用JDBC是跨数据库平台)
3.Sun公司、数据库厂商、程序员三方关系:
◆ SUN公司是规范制定者,制定了规范JDBC(连接数据库规范) 一类三接口
①DriverManager类 作用:管理各种不同的JDBC驱动(不同数据库jar包归它管理)
②Connection接口 作用:(修路的,实际上还是TCP,一方是数据库服务器,javaApplication是客户端,如果进行通信的话,第一件事情就是建立连接。)
③Statement接口和PreparedStatement接口 作用:(就是用于发送sql语句的,也就是把sql语句发送带数据库服务器去执行。数据库执行完语句有结果吗?有,增、删、改的结果是int,查询的结果是表。)
④ResultSet接口 (结果集) 作用:(在增删改的时候用不到,只是在查询的时候能用到,因为查询的时候是结果集)
◆ 数据库厂商微软、甲骨文等分别提供实现JDBC接口的驱动jar包(数据库管理系统生产厂商把类和接口进行实现了,实现了之后,程序员得用,那么怎么把这些实现类给程序员呢?是以jar包的形式。例:Orical实现接口,提供jar包,用于连接Orical数据库)
◆ 程序员学习JDBC规范来应用这些jar包里的类。
常用的框架Hibernate、MyBatis底层都是JDBC,都是对JDBC的封装
二、JDBC怎么使用?
JDBC的操作步骤 :
① 加载一个Driver驱动
②创建数据库连接(Connection)
③创建SQL命令发送器Statement
④通过Statement发送SQL命令并得到结果
⑤处理结果(insert ,update,delete的结果为int ,select的结果为ResultSet)
⑥关闭数据库资源
◆ResultSet
◆ Statement
◆Connection
新建一个project命名为java502---->在这个项目下新建一个Model命名为day1_jdbc---->在这个模块下新建一个directory命名为lib,把jar包复制到这个文件夹下面,这个时候这个jar包是不能用的,需要做一件事儿:鼠标放在这个jar上–右键–单击Add as library ,然后会弹出来一个框,选择ok即可。如下图所示则jar可以用了。
"连接mysql数据库"
package com.bjsxt.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class TestInsert {
public static void main(String[] args)throws Exception {
//(1)加载驱动,[找到jar才能知道连谁] --导入jar包
Class.forName("com.mysql.jdbc.Driver"); //com.mysql.jdbc是包的名称 Driver是类的名称
//(2)因为mysql 服务器上有可多数据库了,请问你连的是哪个?
String url="jdbc:mysql://127.0.0.1:3306/myschool";//连的是服务器上的哪个数据库
String userName="root";
String pwd="root";
//(3)获取连接对象
Connection connection = DriverManager.getConnection(url, userName, pwd);
//(4)准备sql语句
String sql="insert into dept values (99,'test','上海')";
//(5)使用sql语句发送器发送sql到数据库服务器执行,并带回结果
Statement statement = connection.createStatement();
int i = statement.executeUpdate(sql);
System.out.println(i>0?"插入成功":"失败");
//(6)关闭连接
statement.close();
connection.close();
}
}
说明: //(2)因为mysql 服务器上有可多数据库了,请问你连的是哪个?
java程序是数据库的客户端,既然是服务器的客户端,那么在socket编程中必须给IP、端口,找到服务器后,服务器中数据库那么多还得告诉我连哪一个数据库,所以url=“jdbc:mysql://127.0.0.1:3306/myschool”.
总结:
1)DriverManager 这个类中有一个静态方法 getConnection(String url,String user,String pwd) 用于获取连接对象
2)Connection接口有一个方法 createStatement() 用于获取SQL语句发送器对象
3)Statement接口有一两个方法 executeUpdate(String sql)用于执行insert ,update,delete的sql语句,返回值为int类型
executeQuery(String sql)用于执行select语句的,返回结果为ResultSet
连oracle数据库
package com.bjsxt.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class TestInsert2 {
public static void main(String[] args)throws Exception {
//(1)加载驱动,[找到jar才能知道连谁] --导入jar包
Class.forName("oracle.jdbc.driver.OracleDriver");
//(2)因为mysql 服务器上有可多数据库了,请问你连的是哪个?
String url="jdbc:oracle:thin:@192.168.151.241:1521:xe";//连的是服务器上的哪个数据库
String userName="scott";
String pwd="tiger";
//(3)获取连接对象
Connection connection = DriverManager.getConnection(url, userName, pwd);
//(4)准备sql语句
String sql="insert into dept values (79,'test','上海')";
//(5)使用sql语句发送器发送sql到数据库服务器执行,并带回结果
Statement statement = connection.createStatement();
int i = statement.executeUpdate(sql);
System.out.println(i>0?"插入成功":"失败");
//(6)关闭连接
statement.close();
connection.close();
}
}
说明:
◆Oracle: 永远要关心一个名叫“监听”的事儿 ,监听能决定你今天能连上数据库,明天不好说。
◆MySQL :永远要关心的是中文“乱码”
jdbc:mysql://localhost:3306/MySchool?useUnicode=true&characterEncoding=utf8
三、JDBC的封装
1.实现修改和删除
因为发现修改,删除和新增,除了sql语句不同,剩下操作步骤完全相同,所以需要提取DBUtil
(1)提取获取连接的方法
(2)提取增,删,改的通用方法
(3)提取关闭全部的方法
package com.bjsxt.util;
import java.sql.*;
public class DBUtil {
private static final String DRIVER="com.mysql.jdbc.Driver";
private static final String URL="jdbc:mysql://127.0.0.1:3306/myschool";
private static final String USERNAME="root";
private static final String PWD="root";
//获取连接对象
public static Connection getConn(){
Connection connection = null;
try {
Class.forName(DRIVER);
connection = DriverManager.getConnection(URL, USERNAME, PWD);
} catch (Exception e) {
e.printStackTrace();
}
return connection;
}
//增,删,改除了sql语句不同,剩下都一样,提取增,删,改的通用方法,可变的做参数,不变的作方法体
public static int executeDML(String sql){
//(1)获取连接对象
Connection conn = getConn();
Statement statement=null;
int result=0;
//(2)创建sql语句发送器,发送sql语句
try {
statement = conn.createStatement();
result= statement.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
}finally {
//关闭
closeAll(null,statement,conn);
}
return result;
}
//封装关闭全部的方法
public static void closeAll(ResultSet resultSet,Statement statement,Connection connection){
if (resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(statement!=null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
测试
package com.bjsxt.test;
import com.bjsxt.util.DBUtil;
public class Test {
public static void main