第八节 Java JDBC
1. JDBC 概念
由来:用来增强数据库的移植性,如果不用JDBC我们直接和底层的数据进行连接,当我们换数据库的时候就需要去更改相关代码。因为底层的驱动不同,对应的接口也不同。 比如MySQL数据库和Oracle数据库,它们厂商提供的接口就不一样。因此如果我们的程序直接和他们连接,在我们进行数据库更换的时候就必须去更改接口的内容以及相关的API。而JDBC对他们的底层进行了封装,数据库厂商如果要用JDBC就必须根据相关的接口去编写对应的驱动程序来提供接口。我们的程序是直接的和JDBC进行相连,我们只需要用JDBC中的东西进行数据库的一些相关操作。而不用管是什么数据库,这样就将操作进行了一些统一,在我们进行更改数据库的时候我们不需要更改太多的内容,我们只需要将驱动Jar包更换一下就行了。
2. JDBC 常用API
2.1 Driver 接口
Driver 接口是所有JDBC驱动程序必须实现的接口,该接口专门提供给数据库厂商使用,在编写JDBC程序时,必须要把所使用的数据库驱动程序或类库加载到项目的classpath 中(就是数据库驱动程序的JAR包)。
2.2 DriverManager 类
用来加载JDBC驱动并创建与数据库的连接。
DriverManager类的重要方法:
方法声明 | 功能描述 |
---|---|
static synchronized void registerDriver(Driver driver) | 该方法用于向DriverManager中注册给定的JDBC驱动程序 |
static Connection getConnection(String url,String user,String pwd) | 用于建立数据库连接,并返回表示连接的Connection对象 |
但在实际开发中一般不用registerDriver()这个方法来注册驱动,因为要选择注册的驱动类中有一段代码块执行过了。通常用Class类的静态方法forName()来实现注册驱动
2.3 Connection 接口
只有获得了Connection对象才能对数据库进行一些操作,它代表Java程序和数据库的连接对象。
Connection接口中的常用方法:
方法声明 | 功能描述 |
---|---|
Statement createStatement() | 返回一个向数据库发送语句的Statement对象 |
PreparedStatement prepareStatement(String sql) | 该方法用于返回一个PreparedStatement对象,这个对象用于向数据库发送参数化SQL语句 |
CallableStatement prepareCall(String sql) | 返回一个CallableStatement对象,该对象用于调用数据库中的存储过程 |
2.4 Statement 接口
用来执行数据库操作的接口,它会把静态的SQL语句发送到数据库中编译执行,然后返回数据库处理结果,它可以通过Connection实例的createStatement()方法获得。
Statement接口中的常用方法:
方法声明 | 功能描述 |
---|---|
boolean execute(String sql) | 用于执行各种SQL语句,返回为true表示执行的SQL语句有查询结果,可通过Statement的getResultSet()方法查询 |
int executeUpdate(String sql) | 用于执行SQL中的insert、update、和delete语句,该方法返回受影响数据的条数 |
ResultSet executeQuery(String sql) | 用于执行SQL中的select语句,返回一个结果集对象,ResultSet对象 |
2.5 PreparedStatement 接口
解决问题就是在Statement中我们的SQL语句里面如果有变量不好实现,PreparedStatement是Statement的子接口,但是它实现了SQL语句可以带参数,同时比较安全。我们的SQL语句中可以用占位符" ? "来代替参数,然后我们在通过setXxx()方法为SQL语句中的变量赋值。
PreparedStatement接口中的常用方法:
方法声明 | 功能描述 |
---|---|
int executeUpdate() | 在此PreparedStatement对象中执行的SQL语句必须是DML语句或无返回内容的SQL语句(如DDL语句) |
ResultSet executeQuery() | 在此PreparedStatement对象中执行SQL查询,该方法返回的是ResultSet对象 |
void setInt(int parameterIndex,int x) | 将指定参数设置为给定的int值 |
void setFloat(int parameterIndex,float x) | |
void setString(int parameterIndex,String x) | 将指定参数设置为给定的String值 |
void setDate(int parameterIndex,Date x) | 将指定参数设置为给定的Date值 |
void addBatch() | 将一组参数添加到此PreparedStatement对象的批处理命令中 |
void setCharacterStream(int parameterIndex,java.io.Reader reader,int length) | 将指定的输入流写入数据库的文本字段 |
void setBinaryStream(int parameterIndex,java.io.InputStream x,int length) | 将二进制的输入流数据写入到二进制字段中 |
注意:在setDate()方法中参数Date类型必须shiijava.sql.Date而不是java.util.Date。
也可通过setObject()方法去设置。
2.6 ResultSet 接口
这个类是用来保存JDBC执行查询时返回的结果集,该结果集封装在一个逻辑表格中。内部有一个指向 数据行的游标,ResultSet对象初始化时,游标在表格的第一行之前,调用next()方法将游标向下移动一行,如果下行没有数据返回false。
ResultSet 接口中的常用方法:
方法声明 | 功能描述 |
---|---|
String getString(int columnIndex) | 用于获取指定字段的String类型的值,columnIndex用来代表字段的索引 |
String getString(String columnName) | 用于获取指定字段的String类型的值,参数columnName代表字段名称 |
int getInt(int columnIndex) | 用于获取指定字段的int 类型的值,参数columnIndex代表字段索引 |
int getInt(StringcolumnName) | 用于获取指定字段的int 类型的值,参数 columnName代表字段名称 |
Date getDate(int columnIndex) | 用于获取指定字段的Date类型的值,参数columnIndex代表字段的索引 |
Date getDate(String columnName) | 用于获取指定字段的Date类型的值,参数columnName代表字段的名称 |
boolean next() | 将游标从当前位置向下移动一行 |
boolean absolute(int row) | 将游标移动到此ResultSet对象的指定行 |
void afterLast() | 将游标移动到此ResultSet对象的末尾,最后一行之后 |
void beforeFirst() | 将游标移动到此ResultSet对象的开头,第一行之前 |
boolean previous() | 将游标移动到此ResultSet对象的上一行 |
boolena last() | 将游标移动到此ResultSet对象的最后一行 |
这里面的索引是从1开始的。
3. JDBC 编程步骤
第一步下载数据库驱动:
(1) SQL Server驱动包下载地址:
https://www.microsoft.com/zh-CN/download/details.aspx?id=11774
使用示例:https://docs.microsoft.com/en-us/sql/connect/jdbc/using-the-jdbc-driver?view=sql-server-ver15#making-a-simple-connection-to-a-database
(2) Mysql驱动包下载下载地址:
MySQL驱动包(.jar)下载及官方使用说明:
https://dev.mysql.com/doc/connector-j/8.0/en/conne
ctor-j-usagenotes-connect-drivermanager.html
MySQL 下载地址:https://dev.mysql.com/download
s/mysql/
MySQL workbench下载地址:https://dev.mysql.com/
downloads/workbench/
jar包下载地址:https://dev.mysql.com/downloads/co
nnector/j/
选择“platform Independent”与平台无关
然后选择下载mysql-connector-java-8.0.20.zip,通常
是第二个
不注册登录账号,直接选择下方“No thanks, just start
my download",也可以直接打开下方连接下载:
https://dev.mysql.com/get/Downloads/Connector-J/
mysql-connector-java-8.0.20.zip
(3) Oracle驱动下载:
https://www.oracle.com/database/technologies/app
dev/jdbc-ucp-19-6-c-downloads.html
说明文档:
https://docs.oracle.com/en/database/oracle/oracle-d
atabase/20/jjdbc/JDBC-getting-started.html#GUID-A7
809785-56AF-4BD1-A04D-E69CA03489C5
(1)加载数据库驱动
通常利用Class类的静态方法forName(String qudongName)来实现
Class.forName(“DriverName”)
①MY SQL Server:
com.microsoft.sqlserver.jdbc.SQLServerDriver
②Oracle:
oracle.jdbc.driver.OracleDriver
③MySQL:MySQL8.0以前版本:
com.mysql.jdbc.Driver
MySQL8.0以后版本:
com.mysql.cj.jdbc.Driver
(2)通过DriverManager获取数据库连接
Connection conn=DriverManager.getConnection(String url,String user,String pwd);
注意:连接数据库的url,要按照一定规则去写,比如MySQL中是这样写的:
jdbc:mysql://databasesip:port/databasename(默认端口3306)
MySQL8.0以前版本
Connection conn =
DriverManager.getConnection(“jdbc:mysql://l
ocalhost:3306/数据库名”,“数据库服务器登录名”,“登
录密码”);
MySQL8.0以后版本
“jdbc:mysql://localhost:3306/数据库名?
useSSL=false&serverTimezone=UTC”
//解决时区问题也可以直接设置,当然也可以在MySQL查询
中执行set global time_zone=’+8:00’;
//serverTimezone=GMT%2B8
(3)通过Connection获取Statement对象
根据前面的Connection接口的常用方法我们有三种方法去获得Statement对象。
(4)使用Statement接口的方法来执行SQL语句
(5)操作ResultSet结果集
(6)关闭连接释放资源,通常资源的关闭和顺序和打开顺序相反,顺序是ResultSet、Statement、Connection。
4. 编写第一个JDBC程序
第一步:搭建数据库环境
下载好数据库,并配置好环境变量,并创建好数据库和对应表
这里我以前弄过了,就直接使用了,直接进入下一步
第二步:给IDEA导入数据库驱动JAR包
打开 IDEA 在创建好项目中用快捷键ctrl+Alt+shift+s或File->project structure
找到JAR包对应的位置,点击ok即可搞定
如果使用Eclipse 按如下方法去导入Jar包:
第一步:先在项目中创建一个文件包,然后将下载好的jar包复制进来
右键找到build path–>
开始编写第一个JDBC程序:
使用Mysql:
public class FirstJDBCDemo {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/student_info?useSSL=false&serverTimezone=UTC";
Connection con= DriverManager.getConnection(url,"root","pwd");
PreparedStatement ps=con.prepareStatement("select *from course");
ResultSet result=ps.executeQuery();
//输出结果集
System.out.println("课程号 "+" 课程名称 "+" 课程简介 "+" 课时 "+
" 学分 "+" 开课学期 ");
while(result.next()){
String id=result.getString("课程号");
String name=result.getString("课程名称");
String jieshao=result.getString("课程简介");
int keshi=result.getInt("课时");
int xuefen=result.getInt("学分");
String kaikexueqi=result.getString("开课学期");
System.out.println(id+" |"+name+" | "+jieshao+" | "+keshi+" | "+xuefen+" | "+kaikexueqi);
}
result.close();
ps.close();
con.close();
}
}
效果如下图:
使用SQL Server
public class JdbcDemo {
public static void main(String[] args)
throws ClassNotFoundException, SQLException
{
//注册驱动
Class.forName("com.microsoft.sqlserver.jdbc
.SQLServerDriver");
//创建连接客串
String connectionUrl =
"jdbc:sqlserver://localhost:1433;"
+
"databaseName=student;user=sa;password=1234
56;";
//建立连接
Connection con =
DriverManager.getConnection(connectionUrl);
// Connection con =
DriverManager.getConnection("jdbc:sqlserver
://localhost:1433;databaseName=student","sa
","123456");
//显示连接数据库名
//
System.out.println(con.getCatalog());
//预处理
PreparedStatement ps =
con.prepareStatement("select * from
student");四、案例—使用JDBC实现QQ登
录
由同学们独立完成,并交作业。
数据库可选择ACCESS,或者MySQL。
"com.hxtt.sql.access.AccessDriver"
//delete from student where sid= ?"
//update student set sname = ?
where sid = ?"
//执行并生成结果集
ResultSet result =
ps.executeQuery();
//遍历结果集
while (result.next()) {
System.out.println(result.getInt("sid")+res
ult.getString("sname"));
}
//关闭连接等
con.close();
ps.close();
result.close();
}
}