JDBC是什么?
1、Java DataBase Connectivity(java语言连接数据库)
2、JDBC的本质是什么?
JDBC是SUN公司制定的一套接口(interface)
java.sql.*;(这个软件包下有很多接口)
接口都有调用者和实现者
面向接口调用,面向接口实现类,这都属于面向接口编程
为什么要面向接口编程?
解耦合:降低程序的耦合度,提高程序的扩展力
多态机制就是非常典型的:面向抽象编程。(不要面向具体编程)
建议:
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数据库也有自己的原理
..
每一个数据库产品都有自己独特的实现原理
(以上图片摘自网络,仅供自己学习笔记学习使用)
我们面向JDBC编程,JDBC在分别去连接各个数据库。所有的数据库驱动都以jar包的形式存在,jar包当中有很多.class文件,这些class文件就是对JDBC的实现
驱动不是SUN公司提供的,是各大数据库厂家负责提供的,下载驱动jar包需要去数据库官网下载。
3.JDBC开发前的准备工作,先从官网下载对应的jar包,然后将其配置到classpath里去
classpath=.;路径
以上的配置是针对于文本编辑器的方式开发,使用IDEA工具的时候,不需要配置以上的环境变 量。
IDEA有自己的配置方式,
4.JDBC编程六步(重要)
第一步:注册驱动(告诉Java程序,即将要连接的是哪个品牌的数据库)
第二步:获取连接(表示JVM的进程和数据库进程之间的通道打开了,属于进程间的通信,用完关通道)
第三步:获取数据库操作对象(专门执行的sql语句的对象)
第四步:执行SQL语句(DQL DML)
第五步:处理查询结果集(只有当第四步执行的是select语句的时候,才有的第五步处理查询结果)
第六步:释放资源(使用完资源之后一定要关闭资源,java程序进程和sql进程之间进程通信,必须要释放资源)
url
/*
* url:统一资源定位符
* url包括几部分:
* 协议
* IP
* PROT
* 资源名
* 例如:http://182.61.200.7:80/index.html 可以访问百度
* indext.hmtl是资源名
* */
package jdbc.test;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import com.mysql.jdbc.Connection;
public class JdbcTest {
public static void main(String[] args) {
Statement createStatement = null;
Connection conn = null;
try {
//1.注册驱动 java.sql.DriverManager
//static void registerDriver(Driver driver) 这里面Driver是一个接口,具体是由个数据库厂家实现,开发人员负责调用
//注册与给定的驱动程序 DriverManager 。
Class c1 = Class.forName("com.mysql.jdbc.Driver"); //通不过反射机制来创建,可以去耦合
Driver driver = (Driver) c1.newInstance();
DriverManager.registerDriver(driver);
//2.获取连接
/*
* url:统一资源定位符
* url包括几部分:
* 协议
* IP
* PROT
* 资源名
* http://182.61.200.7:80/index.html 可以访问百度
*
* */
/*jdbc:mysql://127.0.0.1:3306/bjpowernode
* jdbc:mysql :协议,协议是提前定好了的,连接mysql的协议
* 127.0.0.1:3306 :ip地址
* 3306:端口号
* bjpowernode:资源名
* */
String url = "jdbc:mysql://127.0.0.1:3306/bjpowernode";
String user = "root";
String password = "wen";
conn = (Connection) DriverManager.getConnection(url,user,password);
//conn ---> com.mysql.jdbc.JDBC4Connection@3c130745
//通过分析可知道这是一个多态,返回来的实际类名是Connection的子类com.mysql.jdbc.JDBC4Connection,在我们的实际应用中,不同的数据库厂家都去实现这个Connection接口,就去耦合,不用关心具体是哪个厂家了
System.out.println("数据库连接对象"+conn);
//3.获取数据库操作对象
//Connection下的createStatement()方法
//创建一个Statement对象,用于将SQL语句发送到数据库
createStatement = conn.createStatement();
//拿到执行对象后,再执行SQL语句
//4.执行SQL语句
String sql = "insert into dept(deptno,dname,loc) values(50,'人事部','北京')";
//专门执行DML语句的(insert delete upadate)
//返回值是“影响数据库中的记录条数” 操作了几条数据,就返回几条数据
int count = createStatement.executeUpdate(sql);
System.out.println(count);
//
}catch (Exception e) {
// TODO: handle exception
System.out.println("注册时出现错误");
e.printStackTrace();
}finally {
//释放资源
//为了包装一定释放,再finally中释放,并遵循从小到大,关闭分别进行try catch
if(createStatement != null) {
try {
createStatement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
通过反射机制直接注册驱动
package jdbc.test;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.Statement;
import com.mysql.jdbc.Connection;
public class JdbcTest02 {
static Connection connection = null;
static Statement createStatement = null;
public static void main(String[] args) throws Exception {
//注册驱动
//反射机制,Class.forName的执行,会让反射的类的静态代码块执行
//在Driver的静态代码块里,已经完成了驱动的注册
//不需要接收返回值,只需要完成注册驱动的注册
Class.forName("com.mysql.jdbc.Driver");
//建立连接
connection = (Connection) DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/bjpowernode","root","wen");
System.out.println("连接成功");
//获取操作对象
createStatement = connection.createStatement();
//执行SQL语句
//JDBC中SQL语句不用写分号
String DML= "delete from emp2 where bir = 1";
int count = createStatement.executeUpdate(DML);
System.out.println(count == 1 ?"成功":"失败");
//释放资源
if(connection!=null)
{
connection.close();
}
if(createStatement!=null) {
createStatement.close();
}
}
}
处理查询结果集
处理结果的接口ResultSet
executeQuery专门执行DQL语句,方法返回一个ResultSet对象(处理查询结果集)
ResultSet 里的方法next(),如果当该行有数据时返回true,没有数据时返回false
ResultSet里的方法getString(int num),取出num列的元素,均以字符串的形式取出,不论原数据是何种类型
注意:JDBC中的下标从1开始了,不再从0开始
例:ResultSet r1 = s1.executeQuery(sql);
r1.next(); //先将光标下移
r1.getString(1);
也可以直接跟上列名,如getString(“列名”),这里的列名需要是数据库里面对应的列名
除了可以以String类型取出,也可以以特定的数据类型取出,当然有特定的方法,比如getInt(列名或者列编号),取出整型的