目录
一、概念
1、基本概念
JDBC(Java DataBase Connectivity)Java数据库连接是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API)。定义了用来访问数据库的标准Java类库java.sql,javax.sql使用这些类库可以以一种标准的方法、方便地访问数据库资源。
2、本质
没有jdbc技术的话
每个数据库的底层实现细节是不一样的,所以一套Java代码是不可以去操作所有数据库的,因此就需要给每一类数据库都写一套代码,这样做十分麻烦
因此sun公司提供了 JDBC数据库连接技术,如下所示
官方定义的一套可以操作所有关系型数据库的规则
也就是接口 各个厂商去实现这套接口,提供数据库驱动jar包
我们可以使用JDBC来编程,真正执行的代码是驱动jar包中的实现类
3、好处
各个厂商使用相同的接口,Java代码不需要针对不同的数据库分别开发
可随时替换底层数据库,访问数据库的Java代码基本不变
Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,这样就使得程序员无需对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程。
二、基本过程介绍
写Java代码将SQL语句发送到数据库中,并执行,对数据库进行操作,并返回结果到程序执行结果中
基本过程如下:
为什么要导入jar包?
这里面提供了SQLServer的实现类:com.microsoft.sqlserver.jdbc.SQLServerDriver 但是JDBC规范定义驱动接口在java.sql.Driver,也就是说操作数据库的所有方法都要在这个包下查找。
导入jar包的方法(intelij IDEA为例) :
1、在当前项目根目录下建立一个“lib”文件夹;
2、把下载好的jar包复制到该文件夹中;
3、选中该jar包,右键,执行“Add as Library”才能真正导入该jar包。
SQLServer的jar包下载路径:下载 - JDBC Driver for SQL Server | Microsoft Learn
基本代码过程如下:
//1.加载并注册驱动
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//2.获取连接
String url ="jdbc:sqlserver://localhost:1433;databaseName=jwgl;"; //固定写法
String username = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, username, password);
//3.定义SQL
String sql = "update student set sage=20 where sname='刘晨'";
//4.获取执行SQL的对象 Statement
Statement stmt = conn.createStatement();
//5.执行sql
int count = stmt.executeUpdate(sql);//受影响的行数
//6.处理结果
System.out.println(count);
//7.释放资源
stmt.close();
conn.close();
三、基础API介绍
1、DriverManager
DriverManager(驱动管理类)
作用:注册驱动和获取数据库连接
DriverManager类中的方法均为静态的,可以用类名.方法名()的方式直接调用
在上述一系列方法中,主要要了解两个方法:
static void registerDriver(Driver driver);//向DriverManager注册给定的驱动程序
static connection getConnection(String url,String user,String passwd);//试图建立到给定数据库URL的连接
a、注册驱动
static void registerDriver(Driver driver);//向DriverManager注册给定的驱动程序
在基本代码过程中,第一步是加载并注册驱动:
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
但在此句代码中并未体现出registerDriver方法
首先,Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段 ,Class.forName(xxx.xx.xx)返回的是一个类
也就是说,通过Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");这句代码将SQLServerDriver类加载到内存中
其次,java.sql.Driver 接口是所有JDBC驱动程序需要实现的接口。
这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现。
在程序中不需要直接去访问实现了 Driver接口的类,而是由驱动程序管理器类java.sql.DriverManager去调用这些Driver实现。
Oracle的驱动:oracle.jdbc.driver.OracleDriver
mySql的驱动: com.mysql.jdbc.Driver
SQLServer的驱动:com.microsoft.sqlserver.jdbc.SQLServerDriver
最后,通常不用显式调用 DriverManager 类的 registerDriver() 方法来注册驱动程序类的实例,因为 Driver 接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用 DriverManager.registerDriver()方法来注册自身的一个实例。
SQLServerDriver类的部分源代码截图
SQLServerDriver类实例化了Driver类
下图是SQLServerDriver类内的register方法,此方法是静态方法。
在此静态方法中,调用了DriverManager类中的registerDriver方法
b、获取数据库连接
static connection getConnection(String url,String user,String passwd);//试图建立到给定数据库URL的连接
该函数的返回值是Connection,因此可以创建一个Connection类型的对象来接收此函数的返回值:Connection conn = DriverManager.getConnection(url, username, password);
参数之url
URL(连接路径) 用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL 选择正确的驱动程序,从而建立到数据库的连接。
JDBC URL的标准由三部分组成,各部分间用冒号分隔。
协议:子协议:子名称
协议:JDBC URL中的协议总是jdbc
子协议:子协议用于标识一个数据库驱动程序
子名称:一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为了定位数据库提供足够的信息。包含主机名(数据库对应服务端的ip地址),端口号,数据库名
SQLServer的连接URL编写方式:
jdbc:sqlserver://主机名称:sqlserver服务端口号;DataBaseName=数据库名称
例子:String url=”jdbc:sqlserver://localhost:1433;DataBaseName=jwgl”;
localhost代表本主机
1433是端口号
参数之user、passwd
也就是在SQLServer登陆界面的登录名和密码
2、Connection
Connection(数据库连接对象)
作用: 获取执行SQL的对象和管理事务
a、获取执行SQL的对象
Statement createStatement(); //创建一个Statement对象来将SQL语句发送到数据库中
调用createStatement()方法,返回一个Statement对象
因此可以创建一个Statement对象来接收该方法的返回值
Statement stmt=conn.createStatement();
b、管理事务
SQLServer管理事务:
开启事务:BEGIN;
提交事务:COMMIT;
回滚事务:ROLLBACK;
JDBC事务管理:Connection接口中定义了三个对应的方法
开启事务:setAutoConnection(boolean autoCommit); true为自动提交事务,false为手动提交事务,即开启事务
提交事务:commit();
回滚事务:rollback();
3、Statement
作用:JDBC中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。
SQL语法:
DDL:数据定义语言,用来定义数据库的对象(数据库,表,字段);
DML:数据操作语言,用来对数据库表中的数据进行增删改;
DQL:数据查询语言,用来查询数据库中表的记录
执行SQL语句
int executeUpdate(sql):执行DML、DDL语句
返回值: DML语句影响的行数 DDL语句执行成功后也可能返回0
ResultSet executeQuery(sql):执行DQL语句
返回值:ResultSet结果集对象
4、ResultSet
ResultSet(结果集对象)
作用:封装了DQL查询语句的结果
获取查询结果
boolean next();
返回值: true:有效行,当前行有数据 false:无效行,当前行没有数据
xxx getXxx(参数);获取数据
xxx:数据类型,比如:int getInt(参数); String getString(参数);
参数(两种): int:列的编号,从1开始
String:列的名称
例如:此处有一个课程表
获取学分(函数有两种写法)
int getInt(4);//获取第四列的数据
int getInt(credit); //获取学分这一列的数据
具体使用
游标向下移动一行,并判断该行是否有数据:next()
获取数据:getXxx(参数)
//循环判断游标是否到了表格末尾
while(rs.next()){
rs.getXxx(参数);//获取数据
}
四、小案例
SQL Server--jwgl数据库(该数据库中有三个表)
student(学生表)
course(课程表)
sc(选课表)
1、更新
将student表中刘晨的年龄改为20
public class JDBCDemo {
public static void main(String[] args) throws Exception {
//1.注册驱动
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");//会出现类找不到异常,直接抛出
//2.获取连接
String url = "jdbc:sqlserver://localhost:1433;DataBaseName=jwgl";//固定写法
String username = "root";
String password = "123456";
Connection conn= DriverManager.getConnection(url, username, password);
//3.定义SQL
String sql = "update student set sage=20 where sname='刘晨'";
//4.获取执行SQL的对象 Statement
Statement stmt = conn.createStatement();
//5.执行sql
int count = stmt.executeUpdate(sql);//受影响的行数
//6.处理结果
System.out.println(count);//输出受影响的行数1
//7.释放资源
stmt.close();
conn.close();
}
}
若想在程序执行结果中显示修改是否成功,还可以这样写:
public class JDBCDemo {
public static void main(String[] args) throws Exception {
//1.注册驱动
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");//会出现类找不到异常,直接抛出
//2.获取连接
String url = "jdbc:sqlserver://localhost:1433;DataBaseName=jwgl";//固定写法
String username = "root";
String password = "123456";
Connection conn= DriverManager.getConnection(url, username, password);
//3.定义SQL
String sql = "update student set sage=20 where sname='刘晨'";
//4.获取执行SQL的对象 Statement
Statement stmt = conn.createStatement();
//5.执行sql
int count = stmt.executeUpdate(sql);//受影响的行数
//6.处理结果
//System.out.println(count);
if(count >0){
System.out.println("修改成功!");
}else{
System.out.println("修改失败!");
}
//7.释放资源
stmt.close();
conn.close();
}
}
2、查询
查询sc表中的内容
/*ResultSet DQL查询语句
查询sc表
*/
public class JDBCDemo1 {
public static void main(String[] args) throws Exception {
//1.注册驱动
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");//会出现类找不到异常,直接抛出
//2.获取连接
String username = "root";
String password = "123456";
String url = "jdbc:sqlserver://localhost:1433;databaseName=jwgl"; //固定写法
Connection conn = DriverManager.getConnection(url, username, password);
//3.定义SQL
String sql = "select * from sc";
//4.获取执行SQL的对象 Statement
Statement stmt = conn.createStatement();
//5.执行sql
ResultSet rs= stmt.executeQuery(sql);
//6.处理结果
while(rs.next()){
int sno=rs.getInt("sno");
int cno=rs.getInt("cno");
float grade=rs.getInt("grade");
System.out.println(sno);
System.out.println(cno);
System.out.println(grade);
System.out.println("-----------------------------");
}
//7.释放资源
rs.close();
stmt.close();
conn.close();
}
}