JDBC典型用法

一、JDBC4.2常用接口和类简介

1.什么是JDBC?

  • Java Database Connectivity ,即Java数据库连接技术,具体指的就是JDK中提供的一组数据库编程接口

2.JDBC接口

JDK提供了一组Java连接数据库编程接口, 位于java.sql包

接口名

作用

Connection

数据库连接

Statement

SQL语句执行

PreparedStatement

预编译SQL语句执行

CallableStatement

调用存储函数存储过程语句执行

ResultSet

查询语句返回的结果集

3.JDBC驱动包--代码库

各大数据库厂商提供了对JDBC接口的实现类, 并封装为jar包, 称为JDBC驱动包,驱动包中有驱动类

数据库

驱动包

驱动类

MySQL

📎mysql-connector-java-5.1.47.jar

com.mysql.jdbc.Driver

Oracle

📎ojdbc8-19.7.0.0.jar

oracle.jdbc.OracleDriver

4.Java工程中引入JDBC驱动包

 

1.DriverManager:用于管理JDBC驱动的服务类,主要功能式获取Connecton对象

public static synchronized Connection getConnection(String url,String user,String pass) throws SQLException;

2.Connection:代表数据库的连接对象,每个Connection代表一个物理连接会话,要想访问数据库,必须先获取数据库的连接

* Statement createStatement() throws SQLException:该方法是返回一个Statement对象

*PreparedStatement prepareStatement(String sql)throws SQLException:该方法是返回预编译的Statement对象,就是将sql提交到数据库进行预编译

*CallableStatement prepareCall(String sql) throws SQLException:该方法是返回CallableStatement对象,该对象用于调用存储过程

3.Statement:用于执行SQL语句的工具接口

*该对象用于执行DDL,DCL,也可以用于执行DML,还可以用于SQL查询

//SQL查询返回的是结果集
ResultSet executeQuery(String sql) throws SQLException
//执行DML语句,返回受影响的行数  返回0
int executeUpdate(String sql) throws SQLException
//执行任何的SQL语句  如果是ResultSet对象,返回true,如果是受影响的行数,返回false
boolean execute(String sql) throws SQLException

4.ResutlSet:结果集对象 

*void close():释放ResultSet对象

boolean absolute(int row):将结果集记录指针移动到row行,如果row是负数,则移动到倒数第row行

booean next()将ResultSet的记录指针定位到下一行

二、JDBC编程步骤

1.加载数据库驱动 通常使用Class.forName()静态方法来加载驱动

//加载数据库驱动
driverClass=com.mysql.jdbc.Driver
Class.forName(driverClass);

2.通过DriverManager获取数据库的连接

String url = "jdbc:mysql://localhost:3306/ems?useUnicode=true&characterEncoding=utf-8";
String user = "root";
String password = "root";
Connection connection = null;
try {
    connection = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
    e.printStackTrace();
}

数据库url地址的组成部分

协议://数据库IP地址:端口号/数据仓库名称?属性=值&属性=值

协议

jdbc:mysql

数据库IP地址

本地连接写localhost, 非本地连接写具体的IP地址

端口号

默认3306

数据仓库名称

指定本次连接哪个数据仓库

?

表示后面拼接参数, 参数格式是属性=值

&

多组参数之间使用 & 拼接

  • 使用DriverManager.getConnection() 方法可以建立Java客户端(指当前Java工程)与数据库之间的连接
  • 该方法接受三个参数, 分别是url地址, 数据库用户名, 数据库密码,该方法执行成功返回一个Connection类型的连接对象
  • 该方法抛出一个数据库异常 SQLException,该异常是一个编译时异常,必须捕捉处理。
  • 出现这个异常的原因会有很多种情况:
  1. url 地址格式写错,IP地址写错,或数据库名写错等
  2. 用户名或密码写错
  3. 没有网络
  4. 数据库服务器没有启动
  5. 数据库服务器防火墙没有关闭等, 都有可能造成数据库连接失败, 触发异常

3. 通过Connection对象创建Statement对象

* createStatement():创建基本对象

*prepareStatement(String sql)创建预编译的Statement对象

*prepareCall(String sql)根据传入的SQL语句创建prepareCall对象

4.使用statement去执行SQL语句

* executeQuery()只执行查询语句

*executeUpdate()执行DDL语句和DML语句

*execute()执行任何语句,但是比较麻烦

5.操作结果集

*next(),previous(),first()

*getXxx()获取记录指针指向行,特定列的值

6.回收数据库的连接

大体的步骤

 代码演示

package package01;

import java.sql.*;

public class Test {
    public static void main(String[] args) {
        //加载驱动:
        String driver = "com.mysql.jdbc.Driver";
        try {
            Class.forName(driver);
            System.out.println("驱动加载成功");
        } catch (ClassNotFoundException e) {
            System.out.println("驱动加载失败");
            e.printStackTrace();
        }
        String url="jdbc:mysql://localhost:3306/ems?useUnicode=true&characterEncoding=utf-8";//数据库的地址,就好比电话号码
        //数据库url组成部分:协议://数据库IP地址:端口号/数据仓库名称?属性=值&属性=值
        String user="root";//数据库用户名
        String password="root";//数据库密码
        //拨号链接数据库--用DriverManager.getConnection();方法
        //声明connection变量存储连接会话对象。才能保持通话
        Connection connection=null;//声明在try作用域的外面,这样在try里面和外面都可访问
        //外面可以访问里面。但是里面不能访问外面
        try {
            //建立连接
            //1.建立完后保存连接
            //connection声明在里面后外面的访问不了connection
            connection=DriverManager.getConnection(url,user,password);
            System.out.println("数据连接成功");
            //声明sql变量存储本次会话内容(会话内容及为一条sql命令)
            String sql="select * from cainfly";
            //通过连接对象connection获取sql执行对象statement
            Statement statement=connection.createStatement();//创建执行语句的方法
            //2.用执行对象调用执行方法,执行sql命令,返回查询的结果集对象
            ResultSet resultSet = statement.executeQuery(sql);//查询的方法executeQuery()--alt回车
            //3.resultSet结果集对象
            //4.迭代resultSet对象,每循环一次取结果中的一行
            while(resultSet.next()){//如果结果集中有下一行就进入下一行
                //在循环中。resultSet指向当前这行数据,然后一格一格的取出数据
                int id=resultSet.getInt("id");
                String name=resultSet.getString("name");
                String age= resultSet.getString("age");
                String phone = resultSet.getString("phone");
                System.out.println(id+"\t"+name+"\t"+age+"\t"+phone);
            }
        } catch (SQLException e) {
            System.out.println("数据库连接失败");
            e.printStackTrace();
        }finally {
            //5.挂掉电话=关闭连接:释放资源,因为连接数是有上限的,不是无限的
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

使用execute()方法执行SQL语句

该方法只是在不知道SQL语句类型的情况下使用

该方法执行SQL语句的返回值是boolean值,判断是否返回了ResultSet对象

statement提供了两种执行结果

1.getResultSet():获取该statement执行查询语句所返回的ResultSet()对象

2.getUpdateCount():获取该statement执行的DML语句所影响的行数

使用占位符?来代替相似的语句

insert into cainfly values(null,?,?);

注意的是:插入自增长的id时需要在prepareStatement(sql,Statement.Statement.RETURN_GENERATED_KEYS)

使用setXxx()里面插入的数据要和表中一一对应且要满足表中的约束

为了满足这种功能JDBC提供了prepareStatement接口

优点:1.预编译SQL语句,性能更好

    2. 无需拼接SQL语句,编程更简单

3.可以防止SQL注入,安全性更好

package JDBCTEST;

import java.sql.*;

public class Test7 {
    public static void main(String[] args) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("加载驱动成功");
        } catch (ClassNotFoundException e) {
            System.out.println("加载驱动失败");
            e.printStackTrace();
        }
        String url="jdbc:mysql://localhost:3306/test?userUnicode=true&characterEncoding=utf-8";
        String user="root";
        String pass="root";
        Connection connection=null;
        try {
           connection= DriverManager.getConnection(url,user,pass);
           System.out.println("数据库连接成功");
           //connection.setAutoCommit(false);
           String sql="select * from cainfly";
           Statement statement = connection.createStatement();
            //遍历结果集
            System.out.println("旧的数据库内容");
            ResultSet resultSet = statement.executeQuery(sql);
            while(resultSet.next()){
                int id=resultSet.getInt("id");
                String name=resultSet.getString("name");
                double balance=resultSet.getDouble("balance");
                System.out.println("编号id:"+id+"\t"+"姓名:"+name+"\t"+"收入:"+"\t"+balance);
            }
            //插入数据
           String sql1="insert into cainfly(id,name,age,phone,balance) values(null,?,?,?,?)";
            PreparedStatement s= connection.prepareStatement(sql1, Statement.RETURN_GENERATED_KEYS);
            s.setObject(1,"刘鹏飞");
            s.setObject(2,"25");
            s.setObject(3,"99999999");
            s.setObject(4,"100000");
            s.executeUpdate();
            //connection.commit();
            sql="select *from cainfly";
            Statement statement1 = connection.createStatement();
            ResultSet rs = statement1.executeQuery(sql);
            System.out.println("新的数据库内容");
            while(rs.next()){
                int id=rs.getInt("id");
                String name=rs.getString("name");
                double balance=rs.getDouble("balance");
                System.out.println("编号id:"+id+"\t"+"姓名:"+name+"\t"+"收入:"+"\t"+balance);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

 

三、JDBC的事务支持

JDBC连接事务由Connection提供,Connection默认打开自动提交==关闭事务

1.调用Connection的setAutoCommit()方法来关闭自动提交==开启事务

connection.setAutoCommit(false);

2.执行完所有的事务后可以调用Connection的commit()方法来提交事务

connection.commit();

3.如果任何一条SQL语句执行失败,可以调用Connection的rollback()方法来回滚事务

connection.rollback();
package JDBCTEST;

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

//事务
public class Test4 {
    public static void main(String[] args) {
        String driver="com.mysql.jdbc.Driver";
        try {
            Class.forName(driver);
            System.out.println("加载驱动成功");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("加载驱动失败");
        }
        String url="jdbc:mysql://localhost:3306/test?userUnicode=true&characterEncoding=utf-8";
        String user="root";
        String pass="root";
        Connection connection=null;
        try{
            connection= DriverManager.getConnection(url,user,pass);
            System.out.println("数据库连接成功");
            //开启事务==关闭自动提交
            connection.setAutoCommit(false);
            Statement statement = connection.createStatement();
            //主键1价格减去3000
            String sql="update cainfly set balance=balance-3000 where id=1";
            statement.executeUpdate(sql);
            //主键2价格增加3000
            sql="update cainfly set balance=balance+3000 where id=9";
            statement.executeUpdate(sql);
            //提交事务
            connection.commit();
            System.out.println("数据修改成功");
        } catch (SQLException e) {
                e.printStackTrace();
                System.out.println("数据库连接失败");
            try {
                //如果SQL发生错误,发生回滚
                connection.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        }
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值