什么是JDBC?
1、JDBC - 即Java DataBase Connectivity --> Java语言的数据库连接
2、JDBC定义了操作所有关系型数据库的规则 (即接口) ,不同数据库厂商根据自己的数据库写了不同的实现类。
3、JDBC本质:sun公司定义的一套操作所有关系型数据库的接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
JDBC快速入门
使用步骤
下载对应版本的驱动jar包
–> 然后导入项目注册驱动
–> 获取数据库连接对象Connection
–> 定义sql
–> 获取执行sql语句的对象Statement
–> 执行sql, 接受返回结果
–> 处理结果
–> 释放资源
代码
导入驱动jar包
将jar包导入到项目文件的lib目录下

注册驱动
Class.forName("com.mysql.jdbc.Driver");
获取数据库连接对象 - Connection 关键字
以连接到本机数据库为例, 使用Connection关键字
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/databaseName", "root", "passwords");
//root位置是登录数据库的账号名, passwords位置是登录数据库的密码
conn即获取到的数据库连接对象,之后通过conn对象操作连接的数据库
定义sql语句 - Statement关键字
String sqlTodo = "xxx";
//这里xxx就是sql语句,你想要对数据库执行什么操作,就写对应的sql语句,sql语句可以看我的另一篇MySQL笔记
//这里sql语句不加分号
获取执行sql的对象 Statement - 数据库连接对象的createStatement方法
Statement stmt = conn.createStatement();
执行sql语句 - 执行sql对象的 executeXXX 方法
int res = stmt.executeUpdate(sqlTodo);
//执行更新操作,并用 res 接收执行结果
释放资源 - 对每个对象调用 close() 方法
stmt.close();
conn.close();//注意顺序,数据库连接对象最后释放
完整代码示范
public class JDBCLearn{
public static void main(Sting args[]){
//数据库连接和基本操作对象的获取
Class.forName("com.mysql.jdbc.Driver");
Connect conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/databaseName", "root", "myDbPasswords");
Statement stmt = conn.createStatement(sql);
//开始操作数据库
String sqlTodo = "uopdate Users set identify = VIP where account = 12133";
int res = stmt.executeUpdate(sql);
//获取到res后,可以对其进行一系列操作
//数据库使用结束记得释放资源
stmt.close();
conn.close();//连接对象最后才能释放
}
}
JDBC的类
5个对象
- DriverManager - 驱动管理对象
- Connection - 数据库连接对象
- Statement - 执行sql的对象
- ResultSet - 结果集对象
- PreparedStatement - 执行sql的对象()功能更加强大
DriverManager
功能:
1、注册驱动, 告诉程序使用哪一个数据库驱动jar包
static void registerDriver(Drievr driver)
//java代码中一般使用以下代码注册驱动, mysql5.0之后可以省略注册步骤
Class.mysql.jdbc.Driver
…
2、获取数据库连接
方法:
static Connection getConnection(String url, String user, String password)
url: 指定连接的路径。语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
本地数据库的ip地址默认为: localhost:3306。如果连接的本机mysql服务器,并且服务器默认端口是3306,那么url可以简写为: jdbc:mysql:///数据库名称
user: 用户名password: 密码
…
Connection
功能:
1、获取执行sql的对象
statement statement();
//或者
PreparedStatement)String user\\\sql;
2、管理事务
- 开启事物方法:
void setAutoCommit(boolean autoCommit) - 提交事务:
commit() - 撤销事务:
rollback()
…
Statement
功能
1、执行sql
boolean execute(String sql); //可以执行任意的sql语句,要执行的sql语句以String作为参数传入
//两个常用方法
int executeUpdate(String sql); //执行增删改操作,返回值为sql语句在表中影响的行数
//返回值>0则sql语句执行成功,反之则执行失败
ResultSet executeQuery(String sql) //执行查找操作,返回值为一个结果集对象,其中存储查找到的结果
JDBC crud 实例 - 新增用户
import java.sql.*;
public class Main{
public static void main(String[] args){
//这里都放在try作用域外面,方便在try中最后释放
Connection conn = null;
Statement stmt = null;
//新增用户
try{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql:///CarRentSystem", "root", 666);
stmt = conn.createStatement();
//定义sql语句,开始进行数据库操作
String sqlAdd = "inser into Users values('客户1','ordinary',5000)";
int count = stmt.executeUpdate(sqlAdd);//用count接收影响的行数
if(count > 0){
System.out.println("注册成功!");
}else{
Sys.out.println("注册时遇到错误,注册失败,请联系管理员处理。");
}
}catch(ClassNotFoundException e){ //数据库驱动注册出现异常时抛出的异常
System.out.println("数据库驱动注册出错!");
e.printStackTrace();
}catch(SQLException e){ //sql语句执行出现异常时抛出的异常
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();
}
}
}
}
}
JDBC crud实例 - 查找用户信息
import java.sql.*;
public class Main{
public static void main(String[] args){
//这里都放在try作用域外面,方便在try中最后释放
Connection conn = null;
Statement stmt = null;
//修改指定用户的信息
try{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql:///CarRentSystem", "root", 666);
stmt = conn.createStatement();
//定义sql语句,开始进行数据库操作
//设置账号为666的用户身份为VIP
String sqlUpdate = "update Users set identify='VIP' where account = 666";
int count = stmt.executeUpdate(sqlUpdate);//用count接收影响的行数
if(count > 0){
System.out.println("用户信息更新成功!您已获得VIP权限!");
}else{
Sys.out.println("权限更新出错,请联系管理员处理。");
}
}catch(ClassNotFoundException e){ //数据库驱动注册出现异常时抛出的异常
System.out.println("数据库驱动注册出错!");
e.printStackTrace();
}catch(SQLException e){ //sql语句执行出现异常时抛出的异常
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();
}
}
}
}
}
JDBC crud实例 - 删除用户
import java.sql.*;
public class Main{
public static void main(String[] args){
//这里都放在try作用域外面,方便在try中最后释放
Connection conn = null;
Statement stmt = null;
//删除指定车辆
try{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql:///CarRentSystem", "root", 666);
stmt = conn.createStatement();
//定义sql语句,开始进行数据库操作
//删除车辆编号为5的车辆信息
String sqlDelete = "delete from Vehicles where carID = 5";
int count = stmt.executeUpdate(sqlDelete);//用count接收影响的行数
if(count > 0){
System.out.println("车辆已删除");
}else{
Sys.out.println("删除失败,请重试或检查代码。");
}
}catch(ClassNotFoundException e){ //数据库驱动注册出现异常时抛出的异常
System.out.println("数据库驱动注册出错!");
e.printStackTrace();
}catch(SQLException e){ //sql语句执行出现异常时抛出的异常
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();
}
}
}
}
}
Result - 结果集对象
知识准备 --> 游标
数据查询过程中,游标首先指向选择的表的第一行,作为当前选定的行,此时获取的数据是游标当前所指向行的数据,可以使用APInext()控制游标下移一行,previous控制游标上移一行 来获取不同行的数据
| 常用的游标方法 | 说明 |
|---|---|
boolean next() | 游标下移一行 |
boolean previous() | 游标上移一行 |
boolean absolute(int number) | 令游标移动到指定的第numebr行 |
boolean beforeFirst() | 令游标移动到第一行 |
boolean afterLast() | 令游标移动到最后一行 |
xxx getXxx(xxx 参数) | XXX为数据类型,比如 int getInt(1)、double getDouble(“money”)。注意,如果传int数据,那么是获取列编号,这里列编号从1开始而不是0;如果String,那么是获取传入的列名称对应的数据 |
功能
封装从数据库中查询到的结果并将其作为返回值返回
这里特别注意下,如果用ResultSet只读取了一列数据,然后需要使用到读取的数据时,要首先rs.next(),才能使用rs.xxxgetXXX(yyy)正常读取,否则会抛出异常。
实例 - 注册账号时判断账号是否以及被注册了
public static boolean isRepeat(int newAccount, Statement stmt, ResultSet rs){
//只读取一列数据
String sqlSearchAccount = "select account from usersinfo where account="+newAccount;
try {
rs = stmt.executeQuery(sqlSearchAccount);
} catch (SQLException e) {
e.printStackTrace();
}
try {
//由于只读取一列数据并用ResultSet存储返回的结果,所以在使用rs之前要先rs.next()
if(rs.next()){
//使用结果集获取读取到的数据
if(rs.getInt("account") == newAccount){
System.out.println("您输入的账号已经被注册了,请换一个账号吧\n");
return false;
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return true;
}
抽取JDBC工具类: JDBCUtils
作用: 简化书写
抽取原则: 高度重复的代码片段
代码示例 - 建议写成静态工具类,很方便调用
package CarRentalSystem.JDBCUtils;
import java.sql.ResultSet;
import java.sql.SQLException;
public class jdbcUtilsByCostomer{
/***************************用户操作界面******************************/
//用户租车
public String sqlUserRentCar(int carId, ResultSet rs, int nums){
String res="";
try {
rs.absolute(carId+1);
int numsNow = rs.getInt("nums");
numsNow -= nums;
res="update cardata set nums="+numsNow+" where id="+carId;
} catch (SQLException e) {
e.printStackTrace();
}
return res;
}
//用户付款
public String sqlPayMoney(int userId, ResultSet rs, double rent){
String res="";
try {
rs.absolute(userId+1);
Double moneyNow=rs.getDouble("money");
if(moneyNow < rent){
System.out.println("余额不足!请充值后再继续租车!");
res = "update usersinfo set money="+moneyNow+" where id="+userId;
}else{
moneyNow -= rent;
res = "update userinfo set money="+moneyNow+" where id="+userId;
}
} catch (SQLException e) {
e.printStackTrace();
}
return res;
}
//用户充值
public String sqlRecharge(int userId, double addMoney, ResultSet rs){
String res = "";
try {
rs.absolute(userId+1);
Double moneyNow = rs.getDouble("money");
moneyNow += addMoney;
res = "update usersinfo set money="+moneyNow+" where id="+userId;
}catch (SQLException e){
e.printStackTrace();
}
return res;
}
//用户查看余额
public double SeeMoney(int userId, ResultSet rs){
double moneyNow = 0.0;
try {
rs.absolute(userId+1);
moneyNow = rs.getDouble("money");
}catch (SQLException e){
e.printStackTrace();
}
return moneyNow;
}
}
本文介绍了JDBC的基本概念,包括其定义、作用及操作数据库的步骤,并提供了完整的代码示例,涵盖连接数据库、执行SQL语句等核心操作。

被折叠的 条评论
为什么被折叠?



