一、概述
-
什么是JDBC
-
Java DataBase COnnectivity Java 数据库连接
-
其实就是利用Java程序连接并访问数据库的一种技术
-
-
为什么要学习JDBC
-
之前我们是通过终端,或者第三方工具直接连接数据库
-
在企业开发中,更多的是通过程序来连接数据库的
-
未来学习的MyBatis,Hierbate框架底层都是封装的JDBC
-
-
JDBC工作原理
二、JDBC入门案例
-
需求:创建数据库jdbc,在库中创建User表,并插入三条以上的数据,利用Java程序查询所有数据并打印在控制台上
-
开发步骤
-
准备数据
create database jdbc; use jdbc; create table user(id int primary key auto_increment,name varchar(50),gender varchar(5),age int,address varchar(50) ); insert into user values (null,'宋江','男',32,'山东郓城县'), (null,'卢俊义','男',31,'河北大名府'), (null,'吴用','男',30,'山东郓城县曹溪村');
-
导入jar包
-
创建jdbc项目
-
创建jdbc-base modul
-
在jdbc-base目录下新建lib文件夹
-
导入jar包
-
mysql-connector-java-8.0.3.jar
-
junit-4.10.jar
-
-
使用lib
-
-
创建类并使用JDBC程序(6个步骤)
/**
* 需求:通过JDBC程序 查询jdbc数据库下,user表中的所有数据并打印在控制台
* JDBC操作数据库步骤:
* 1. 注册驱动
* 2. 创建数据库连接对象
* 3. 获取传输器对象
* 4. 执行SQL
* 5. 处理结果集
* 6. 释放资源
*/
public class JDBCDemo1 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1. 注册驱动(所谓的注册驱动就是通过反射技术把第三方提供的Java代码加载到我们的内存中)
Class.forName("com.mysql.cj.jdbc.Driver");
//2. 创建数据库连接对象//String url = "jdbc:mysql://localhost:3306/jdbc?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8";
//String url = "jdbc:mysql://localhost:3306/jdbc?useSSL=false&serverTimezone=UTC&amkp;useUnicode=true&characterEncoding=UTF-8";
String url = "jdbc:mysql://localhost:3306/jdbc"; //数据库路径
String userName = "root"; //数据库名
String password = "root"; //数据库密码
Connection conn = DriverManager.getConnection(url, userName, password);//3. 获取传输器对象
Statement stat = conn.createStatement();
//4. 执行SQL
String sql = "select * from user";
ResultSet rs = stat.executeQuery(sql);
//5. 处理结果集
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String gender = rs.getString("gender");
int age = rs.getInt("age");
String address = rs.getString("address");System.out.println(id + "," + name + "," + gender + "," + age + "," + address);
}
//6. 释放资源
rs.close();
stat.close();
conn.close();
}
}
-
三、JDBC开发细节
-
注册驱动
JDBC注册驱动有两种方式
-
第一种方式:通过反射注册
Class.forName("com.mysql.cj.jdbc.Driver");
-
第二种方式:通过DriverManager调用registerDriver()方法
DriverManager.registerDriver(new Driver()); 这种注册驱动的方式有两个弊端1. 会导致注册注册两次2. 会让程序和具体的驱动绑定死
-
MySQL5 之后的驱动包,可以省略不写
-
-
获取连接之数据库URL
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "root");
如果连接的端口是3306,由于mysql默认端口是3306,所以可以省略不写。
jdbc:mysql:///jdbc
另外:可以在url后面拼接参数来防止中文乱码问题:
jdbc:mysql:///jt_db?characterEncoding=utf-8
use SSL = false : mac电脑不适用安全连接
-
Statement传输器对象
Statement stat = conn.createStatement();
Statement传输器对象用于向数据库服务器发送sql语句,该对象上提供了发送sql的方法:
executeQuery(String sql) -- 用于向数据库发送查询类型的sql语句,返回一个 ResultSet对象 executeUpdate(String sql) – 用于向数据库发送更新(增加、删除、修改)类型的sql语句,返回一个int值,表示影响的记录行数
-
ResultSet结果集对象
ResultSet对象用于封装sql语句查询的结果,也是一个非常重要的对象。该对象上提供了遍历数据及获取数据的方法。
-
遍历数据行的方法
next() – 使指向数据行的索引向下移动一行
-
获取数据的方法
getInt(int columnIndex) getInt(String columnIndex) getString(int columnIndex) getString(String columnIndex) getDouble(int columnIndex) getDouble(String columnIndex) getObject(int columnIndex) getObject(String columnIndex)
-
-
释放资源
re.close(); stat.close(); conn.close();
此处释放资源必须按照一定的顺序释放,越晚获取的越先关闭。所以先关闭rs对象,再关闭stat对象,最后关闭conn对象。
另外,为了避免上面程序抛出异常,释放资源的代码不会执行,应该把释放资源的代码写在finally块中。
JDBC连接数据库整体代码实现
package com.oracle.jdbc; import java.sql.*; /*** 完整的JDBC结构(JDBC处理异常)*/ public class JDBCDemo3 {public static void main(String[] args) {Connection conn = null;Statement stat = null;ResultSet rs = null; try {//1.获取数据库连接对象conn = DriverManager.getConnection("jdbc:mysql:///jdbc", "root", "root");//2.获取传输器对象stat = conn.createStatement();//3.执行SQLString sql = "select * from user";rs = stat.executeQuery(sql);//4. 处理结果集while (rs.next()) {int id = rs.getInt("id");String name = rs.getString("name");String gender = rs.getString("gender");int age = rs.getInt("age");String address = rs.getString("address");System.out.println(id + "," + name + "," + gender + "," + age + "," + address);}//5. 释放资源} catch (SQLException e) {e.printStackTrace();} finally { if (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();} finally {rs = null;}} if (stat != null) {try {stat.close();} catch (SQLException e) {e.printStackTrace();} finally {stat = null;}} if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();} finally {conn = null;}} }} }
四、JDBC增删改查
package com.oracle.test;
import org.junit.Test;
import java.sql.*;
/**
* JDBC实现增删改查
*/
public class JDBCTest {/**
* 需求:往user表中新增一条数据
*/
@Test
public void addUserTest() {
Connection conn = null;
Statement stat = null;
try {
conn = DriverManager.getConnection("jdbc:mysql:///jdbc", "root", "root");
stat = conn.createStatement();
String sql = "insert into user values(null,'公孙胜','男',28,'天津蓟县')";
int i = stat.executeUpdate(sql);
if (i > 0) {
System.out.println("添加成功!!");
} else {
System.out.println("添加失败");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
if(stat!=null){
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
stat = null;
}
}if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
conn = null;
}
}}
}
/**
* 需求:查询id是2的客户信息
*/
@Test
public void findByIdUserTest() {
Connection conn = null;
Statement stat = null;
ResultSet rs = null;
try {
conn = DriverManager.getConnection("jdbc:mysql:///jdbc", "root", "root");
stat = conn.createStatement();
String sql = "select * from user where id=2";
rs = stat.executeQuery(sql);
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String gender = rs.getString("gender");
int age = rs.getInt("age");
String address = rs.getString("address");System.out.println(id + "," + name + "," + gender + "," + age + "," + address);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
rs = null;
}
}if(stat!=null){
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
stat = null;
}
}if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
conn = null;
}
}
}
}/**
* 需求:修改吴用的家庭住址为 山东郓城县
*/
@Test
public void updateUserTest() {
Connection conn = null;
Statement stat = null;try {
conn = DriverManager.getConnection("jdbc:mysql:///jdbc", "root", "root");
stat = conn.createStatement();
String sql = "update user set address='山东郓城县' where name='吴用'";
int i = stat.executeUpdate(sql);
if(i>0){
System.out.println("修改成功");
}else{
System.out.println("修改失败");
}} catch (SQLException e) {
e.printStackTrace();
}finally {if(stat!=null){
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
stat = null;
}
}if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
conn = null;
}
}
}
}/**
* 需求:删除id 是4的用户
*/
@Test
public void deleteByIdTest(){
Connection conn = null;
Statement stat = null;try {
conn = DriverManager.getConnection("jdbc:mysql:///jdbc", "root", "root");
stat = conn.createStatement();
String sql = "delete from user where id=4";
int i = stat.executeUpdate(sql);
if(i>0){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}} catch (SQLException e) {
e.printStackTrace();
}finally {if(stat!=null){
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
stat = null;
}
}if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
conn = null;
}
}
}
}}