JDBC
jdbc中文名叫java数据库连接
创建项目
创建项目,引入jar包
我的jdk是1.8的,所以用的比较老的jar包
官网下载
https://downloads.mysql.com/archives/c-j/
导入jar包,并构建好,怎么构建
在数据库里面建立好一个库,我命名为java,建个表test加点数据进去
代码实现
分为四个步骤
- 加载驱动
- 获得连接
- 基本操作
- 释放资源
实现的代码
package com.jdbctest;
import org.junit.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBCDemo1 {
// 使用junit的test来调试
@Test
public void demo1() throws Exception{
// 加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 获得连接,把结果放到Connection类型的对象里面,后面的两个参数是数据库的用户名和密码
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/java","root","");
// 基本操作
// 获取sql语句的对象
Statement statement = con.createStatement();
// 编写sql语句
String sql = "select * from test";
// 执行sql语句,把结果放到ResultSet类型的对象里面
ResultSet res = statement.executeQuery(sql);
// 遍历结果集,打印出id,username,passwd
while (res.next()){
System.out.print(res.getString("id")+' ');
System.out.print(res.getString("username")+' ');
System.out.print(res.getString("passwd"));
System.out.println();
}
// 释放资源,依次释放
res.close();
statement.close();
con.close();
}
}
查询成功!
JDBC的API详解
DraverManager
一个驱动管理类
作用:
- 注册驱动
- 获得与数据库的连接
注册驱动
registerDriver()
开发过程中是不用这个来注册的
因为这个方法的参数是一个Driver类,而实例化Draver类的时候就会自动注册了
如果手动在去注册的话就会注册两次了
平常的开发中,我们通常使用Class.forName("com.mysql.jbdc.Driver");
这个forName()
的作用是:
Class.forName 方法的作用,就是初始化给定的类。而我们给定的 MySQL 的 Driver 类中,它在静态代码块中通过 JDBC 的 DriverManager 注册了一下驱动。
获得与数据库的连接
getConnection(url,user,passwd)
参数
- url:一种形式的数据库URL
- user:数据库用户名
- password:用户的密码
主要说下这个url:
jdbc:mysql://localhost:3306/java
jdbc
:连接数据库的协议mysql
:jdbc的一个子协议,用于区分数据库localhost
:表示mysql数据库服务器的主机地址,如果在本地就是localhost,如果是外网的就填外网的ip3306
:mysql的端口号,可以在配置文件里面修改的java
:所连接数据库的名称
如果连接的是本机而且端口号没去改,localhost:3306还可以省略掉
jdbc:mysql:///java
Connection
与数据库的一个连接对象
作用:
- 创建执行sql语句的对象
- 管理事务
创建执行sql语句的对象
createStatement()
创建一个对象来将sql语句发送到数据库,返回的Statement类型的对象就可以用来执行sql语句
除了这个createStatement()
,还有两个方法也有类似的作用
CallableStatement()
PreparedStatement()
区别:
createStatement()
:执行sqlCallableStatement()
:执行数据库的存储过程PreparedStatement()
:执行sql,可以对sql进行预处理防止sql注入
后期主要都是用 PreparedStatement()
来创建对象
事务管理
要进行事务管理就要先关闭自动提交
提交事务的方法:commit()
回滚事务:rollback
Statement
主要作用是用来执行sql语句
作用
- 执行sql语句
- 执行批处理
执行sql语句
-
execute()
-
executeQuery()
-
executeUpdate()
区别:
-
boolean execute()
:可以执行查询、修改、添加、删除的sql语句
返回值:如果第一个结果为ResultSet对象,则返回true ;如果其为更新计数或者不存在任何结果,则返回false抛出
简单来说就是如果执行查询语句就返回true,其他的返回false -
ResultSet executeQuery()
:只能用于查询语句,查询到的结果一般是表格状的,会封装到ResultSet里面 -
int executeUpdate()
:执行修改、添加、删除语句
返回值:插入3条记录就返回3,删除5条记录就返回5
常用的是后面两个语句
执行批处理
addBatch()
:添加到批处理
clearBatch()
:清空批处理
- executeBatch():把一批sql语句传给mysql执行,返回更新了的计数组成数组
Result
select语句执行后得到的结果集(只有select才行)
结果集的遍历
next()
:让指针跳到下一条记录
最开始指针是指向记录外面,执行了next后指针就指向了第一个数据
指针一直往下跳,只要指针的指向有数据就返回true,当执行了next后没有记录了,就会返回false
如下图,执行了四次next,第五次next就没有数据了,指针指向了空,返回了false,这样就循环了四次
结果集的获取
用get数据类型()
来获取结果集
getInt()
getLong()
getString()
getObject()
等等
这里的getObject()
可以获取任意类型的值
这一类的getXxx()的方法一般都有一个重载的方法,开发中通常使用字段名的getXxx(),用字段名更精准,字段的序号容易改变
- getXxx(int columnindex):字段的序号
- getXxx(String columnName):字段名
资源释放
JDBC程序执行结束后,将与数据库进行交互的对象释放掉,通常是
- Resultset
- Statement
- Connection
这几个对象中尤其是Connection对象是非常稀有的。数据库的连接是有限制的,如果一次性有太多的连接,那么就不能再建立连接了,所以这个对象一定要做到尽量晚创建,尽早释放掉。
- 要把资源释放写入到finally的代码块里面(finally表示一定会被执行的代码块)
- 资源释放的规范操作
//在开头先声明一下变量
public void demo() {
Connection conn = null;
Statement stmt = null;
。
。
。
finally {
// 释放result
if (res != null) {
try {
res.close();
} catch (SQLException sqlEx) { // ignore }
// 手动设空,让java回收机制更快的回收掉,提高效率
rs = null;
}
// 释放statement
if (stmt != null) {
try {
stmt.close();
} catch (SQLException sqlEx) { // ignore }
stmt = null;
}
// 释放connection
if (con != null) {
try {
con.close();
} catch (SQLException sqlEx) { // ignore }
con = null;
}
}