1、JDBC入门
1.1、 客户端操作MYSQL数据库的方式
(1) 使用第三方客户端来访问MYSQL:MySQL Workbench(官方)、SQLyong、Navicat、SQLWare。。。
(2) 使用MYSQL自带的命令行方式或者DOM命令
(3)在Java中,数据库存取技术可分为如下几类:
● JDBC直接访问数据库
● JDO技术(Java Data Object)
● 第三方O/R工具,如Hibernate, Mybatis 等
JDBC是java访问数据库的基石,JDO, Hibernate等只是更好的封装了JDBC。
1.1.1、什么是JDBC
JDBC是SUN公司(Oracle公司甲骨文)提供一套用于数据库操作的接口API,Java程序员只需要面向这套接口编程即可。不同的数据库厂商,需要针对这套接口,提供不同实现。不同的实现的集合,即为不同数据库的驱动。JDBC规范定义接口,具体的实现由各大数据库厂商来实现。
JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统(DBMS)、通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类库,使用这个类库可以以一种标准的方法、方便地访问数据库资源
JDBC是Java访问数据库的标准解决方案,真正怎么操作数据库还需要具体的实现类,也就是数据库驱动。每个数据库厂商根据自家数据库的通信方式编写好自己数据库的实现类,也就是驱动。所以我们只需要会调用JDBC接口中的方法即可,数据库驱动由数据库厂商提供。
使用JDBC的好处:
(1)程序员如果要开发访问数据库的程序,只需要会调用JDBC接口的方法即可,不用关注类是如何实现的。
(2) 使用同一套Java代码,进行少量的修改就可以访问其他JDBC支持的数据库。
1.1.2、使用JDBC开发用到的包
包 | 说明 |
---|---|
java.sql | 所有与JDBC访问数据库相关的接口和类 |
javax.sql | 数据库的扩展包,提供数据库额外的功能,如:连接池 |
数据库的驱动 | 由各大数据库厂商提供,需要额外去下载,是对JDBC接口的实现类 |
1.1.3、 JDBC的核心API
接口 | 说明 |
---|---|
DriverManager类 | 管理和注册数据库驱动,得到数据库连接对象 |
Connection接口 | 一个连接对象,可用于创建Statement和PreparedStatement对象 |
Statement接口 | 一个SQL语句对象,用于将SQL语句发送给数据库服务器 |
PreparedStatement接口 | 一个SQL语句对象,是Statement的子接口 |
ResultSet接口 | 用于封装数据库查询的结果集,返回给客户端Java程序 |
1.2、导入驱动JAP包
下载地址:https://dev.mysql.com/downloads/connector/j/
新建一个jdbc_base工程,然后创建一个文件夹,名为lib
然后复制MYSQL数据库驱动jar包,到lib目录
添加lib目录到 Add as Library
1.3、加载和注册驱动
加载和注册驱动的方法:Class.forName(数据库驱动实现类),数据库驱动由mysql厂商提供,它的驱动类是:com.mysql.cj.jdbc.Driver
public static void main(String[]args){
try{
//1、加载数据库的驱动类,通过反射的方式创建驱动类对象
Class.forName("com.mysql.cj.jdbc.Driver");
}catch(ClassNotFoundException ce){
ce.printStackTrace();
}
}
【从JDBC3开始,Class.forName可以省略】
1.4、DriverManager类
作用:
(1)管理和注册驱动
(2)创建数据库的连接,并返回一个连接对象Connection
DriverManager中的方法:
Connection getConnection(String url,String user,String password):通过连接字符串,用户名,密码返回一个数据库连接对象
1.5、使用JDBC连接数据库的四个参数
参数 | 说明 |
---|---|
用户名 | 登录数据库的用户名 |
密码 | 登录数据库的密码 |
连接字符串URL | 不同的数据库URL是不同的,MYSQL的写法是:jdbc:mysql://localhost:3306/数据库名?serverTimezone=UTC [&参数名=参数值&参数名=值] |
驱动类的字符串名 | com.mysql.cj.jdbc.Driver |
1.5.1、连接数据库的URL地址格式
JDBC URL 用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL 选择正确的驱动程序,从而建立到数据库的连接。JDBC URL的标准由三部分组成,各部分间用冒号分隔。
jdbc:<子协议>:<子名称>
协议:JDBC URL中的协议总是jdbc
子协议:子协议用于标识一个数据库驱动程序(数据库管理系统的名称)
子名称:一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为了定位数据库提供足够的信息
例如:
MySQL的连接URL编写方式:
jdbc:mysql://主机名称:mysql服务端口号/数据库名称?参数=值&参数=值
jdbc:mysql://localhost:3306/testdb
jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=utf8(如果JDBC程序与服务器端的字符集不一致,会导致乱码,那么可以通过参数指定服务器端的字符集)
jdbc:mysql://localhost:3306/testdb?user=root&password=123456
Oracle9i:
jdbc:oracle:thin:@主机名称:oracle服务端口号:数据库名称
jdbc:oracle:thin:@localhost:1521:testdb
SQLServer:
jdbc:sqlserver://主机名称:sqlserver服务端口号:DatabaseName=数据库名称
jdbc:sqlserver://localhost:1433:DatabaseName=testdb
1.6、案例:获取MYSQL的数据库连接对象
public static void main(String[]args){
String url="jdbc:mysql://localhost:3306/db2?serverTimezone=UTC&characterEncoding=utf8";
try{
//1、加载数据库的驱动类,通过反射的方式创建驱动类对象
Class.forName("com.mysql.cj.jdbc.Driver");
//2、获取数据库连接对象Connection
Connection conn=DriverManager.getConnection(url,"root","RootBDIT628@#");
//判断连接对象是否成功获取
if(conn!=null){
System.out.println("ok");
}else{
System.out.println("fail");
}
}catch(ClassNotFoundException|SQLException ce){
ce.printStackTrace();
}
}
1.6.1、Connection接口
Connection接口:具体的实现类由数据库厂商实现,代表一个数据库连接对象
Connection方法:Statement createStatement():创建一个SQL语句对象
1.7、Statement接口
Statement作用: 代表一条SQL语句对象,用于发送SQL语句给服务器,用于执行静态SQL语句并返回它所生成结果的对象
Statement中的方法:
方法 | 说明 |
---|---|
int executeUpdate(String sql) | 用于发送DML语句,增删改的操作:INSERT、UPDATE、DELETE ,返回的结果是表示SQL语句影响的行数 |
ResultSet executeQuery(String sql) | 用于发送DQL语句,执行查询的操作,SELECT返回值:表示查询到的结果集 |
1.8、释放资源
(1) 需要释放的对象,ResultSet结果集,Statement对象,Connection对象
(2)释放原则:先开的后关,后开的先关:ResultSet->Statement->Connection
(3)放在finally代码块中,或者try()自动关闭
1.9、需求:使用JDBC在MYSQL的数据库中创建一张学生表
package com.bdit;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* @Description : 使用JDBC创建学生对象: id name gender birthday
*/
public class Demo1 {
public static void main(String[] args) {
String url="jdbc:mysql://localhost:3306/db2?serverTimezone=UTC&characterEncoding=utf8";
Connection conn=null;
Statement st=null;
try {
//1、加载数据库的驱动类,通过反射的方式创建驱动类对象
Class.forName("com.mysql.cj.jdbc.Driver");
//2、获取数据库连接对象Connection
conn= DriverManager.getConnection(url,"root","RootBDIT628@#");
//判断连接对象是否成功获取
if(conn!=null){
System.out.println("ok");
}else{
System.out.println("fail");
}
//3.获取Statement对象
st=conn.createStatement();
//准备SQL语句
String sql="create table student(id int primary key auto_increment," +
"name varchar(20) not null,gender varchar(10) not null,birthday date)";
//4、执行SQL(DDL没有返回结果)
int i=st.executeUpdate(sql);
System.out.println("表创建成功");
}catch (ClassNotFoundException | SQLException ce){
ce.printStackTrace();
}finally {
//先判断是否null
if(st!=null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace(