JDBC - Java操作数据库

本文介绍了JDBC的基本概念,包括其定义、作用及操作数据库的步骤,并提供了完整的代码示例,涵盖连接数据库、执行SQL语句等核心操作。

什么是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;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

六时二一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值