Jdbc


文章目录



1.概念

Java DataBase Connectivity Java 数据库连接, Java语言操作数据库

JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
Java-web_Jdbc_mysql
有关的类都在java.sql和javax.sql(扩展包)下

Java-web_Jdbc_sql_02

2.快速入门

2.1步骤

  1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
1.复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下
2.右键-->Add As Library
2. 注册驱动
3. 获取数据库连接对象 Connection
4. 定义sql
5. 获取执行sql语句的对象 Statement
6. 执行sql,接受返回结果
7. 处理结果
8. 释放资源

2.2 代码实现

Java-web_Jdbc_java_03

      //1. 导入驱动jar包
//2.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//3.获取数据库连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");
//4.定义sql语句
String sql = "update account set balance = 500 where id = 1";
//5.获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
//6.执行sql
int count = stmt.executeUpdate(sql);
//7.处理结果
System.out.println(count);
//8.释放资源
stmt.close();
conn.close();

3. 详解各个对象

3.1 使用 JDBC 开发使用到的包

会使用到的包

说明

java.sql

所有与 JDBC 访问数据库相关的接口和类

javax.sql

数据库扩展包,提供数据库额外的功能。如:连接池

数据库的驱动

由各大数据库厂商提供,需要额外去下载,是对 JDBC 接口实现的类

3.2 JDBC 的核心 API

接口或类

作用

DriverManager

类 1) 管理和注册数据库驱动

2) 得到数据库连接对象

Connection 接口

一个连接对象,可用于创建 Statement 和 PreparedStatement 对象

Statement 接口

一个 SQL 语句对象,用于将 SQL 语句发送给数据库服务器。

PreparedStatemen 接口

一个 SQL 语句对象,是 Statement 的子接口

ResultSet 接口

用于封装数据库查询的结果集,返回给客户端 Java 程序

4.导入驱动jar包

Java-web_Jdbc_java_04

Java-web_Jdbc_java_05

4. 加载和注册驱动

Java-web_Jdbc_java_06

public class Demo1 {
public static void main(String[] args) throws ClassNotFoundException {
4 / 21
//抛出类找不到的异常,注册数据库驱动
Class.forName("com.mysql.jdbc.Driver");
} }

com.mysql.jdbc.Driver 源代码:
// Driver 接口,所有数据库厂商必须实现的接口,表示这是一个驱动类。

public class Driver implements java.sql.Driver {
public Driver() throws SQLException {
}
static {
try {
DriverManager.registerDriver(new Driver()); //注册数据库驱动
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
}

5.DriverManage

5.1DriverManage作用

  1. 管理和注册驱动
  2. 创建数据库的连接

5.2类中的方法

Java-web_Jdbc_java_07

5.3 使用 JDBC 连接数据库的四个参数

Java-web_Jdbc_mysql_08

5.4 连接数据库的 URL 地址格式

5.4.1 MySQL 写法

Java-web_Jdbc_sql_09

5.4.2 MySQL 中可以简写

jdbc:mysql:///database

省略localhost和端口号

5.4.3 乱码问题

可以指定参数:characterEncording=utf8

jdbc:mysql:///数据库?characterEncording=utf8

5.5 插入实例

public class jdbc_Demo01 {
public static void main(String[] args) throws Exception {
//1.导入jar包
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
//mysql5之后的不需要注册驱动jar包
//获取数据库的链接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","root");
//定义sql语句
String sql = "update user1 set age = 13 where name = \"zhangsan\"";
Statement stmt = conn.createStatement();
int count = stmt.executeUpdate(sql);
System.out.println(count);
stmt.close();
conn.close();


}
}

插入一条数据
结果返回1则插入成功一条数据,如果返回的为0的话则插入不成功
count返回的是插入成功的数目

6. Connection接口

6.1 Connection接口作用

具体的实现类由数据库的厂商实现,代表一个连接对象

6.2 Connection方法

Java-web_Jdbc_mysql_10

7. Statement接口

7.1 Jdbc访问数据库的步骤

Java-web_Jdbc_mysql_11

Java-web_Jdbc_mysql_12

7.2 Statement作用

代表了一条语句对象,用于发送SQL语句给服务器,用于执行静态SQL语句并返回它所生成结果的对象。

7.3 Statement方法

Java-web_Jdbc_mysql_13

7.4 释放资源

1.ResultSet结果集,Statement语句,Connection连接
2.先开后关的原则
3.放在finally中释放
4.判断有无再释放

7.5 执行DML操作

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class jdbc_Demo02 {
public static void main(String[] args) {
Statement stmt = null;
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
String sql = "insert into user1 values(\"lisi\",11)";
conn = DriverManager.getConnection("jdbc:mysql:///db1","root","root");
stmt = conn.createStatement();
int count = stmt.executeUpdate(sql);
if(count > 0){
System.out.println("添加成功");
}else {
System.out.println("添加失败");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}

结果
添加成功

Java-web_Jdbc_sql_14

7.6 执行DQL操作

import java.sql.*;

public class jdbc_Demo3 {
public static void main(String[] args) {
Statement stmt = null;
Connection conn = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
String sql = "select * from user1";
conn = DriverManager.getConnection("jdbc:mysql:///db1","root","root");
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
rs.next();
String name = rs.getString("name");
int age = rs.getInt(2);
System.out.println(name + "--------" + age);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}

结果
zhangsan--------13

改版的DQL:可以取出全部的数据
主要还是判断next()是否为空通过while判断

import java.sql.*;

public class jdbc_Demo04 {
public static void main(String[] args) {

Statement stmt = null;
Connection conn = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
String sql = "select * from user1";
conn = DriverManager.getConnection("jdbc:mysql:///db1","root","root");
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while(rs.next()) {
String name = rs.getString("name");
int age = rs.getInt(2);
System.out.println(name + "--------" + age);
}

} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}