Java-web_Jdbc
原创
©著作权归作者所有:来自51CTO博客作者959_1x的原创作品,请联系作者获取转载授权,否则将追究法律责任
Jdbc
文章目录
1.概念
Java DataBase Connectivity Java 数据库连接, Java语言操作数据库
JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
有关的类都在java.sql和javax.sql(扩展包)下
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 代码实现
//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包
4. 加载和注册驱动
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作用
- 管理和注册驱动
- 创建数据库的连接
5.2类中的方法
5.3 使用 JDBC 连接数据库的四个参数
5.4 连接数据库的 URL 地址格式
5.4.1 MySQL 写法
5.4.2 MySQL 中可以简写
省略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方法
7. Statement接口
7.1 Jdbc访问数据库的步骤
7.2 Statement作用
代表了一条语句对象,用于发送SQL语句给服务器,用于执行静态SQL语句并返回它所生成结果的对象。
7.3 Statement方法
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();
}
}
}
}
}
结果
添加成功
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();
}
}
}
}
}