一下子搞懂JDBC,看这篇就够了--以MySQL为例。

一下子搞懂JDBC,看这篇就够了–以MySQL为例。

一、什么是JDBC?

  JDBC(Java DataBase Connectivity)是Java语言与数据库系统之间的桥梁,通过JDBC可以实现在Java代码中对数据库执行操作。

  它由一组用Java语言编写的类和接口组成,是 Java应用程序与各种不同数据库之间进行对话的方法。

简而言之,有了jdbc可以直接由Java程序来控制对数据库系统执行增删改查,而不用在命令控制行中去苦逼的运行了。

二、JDBC的使用步骤
  1. 导入jar包

      很简单,不再详述。已经有小伙伴提供方法,可以点击链接直接去看看。

      但是有一点一定要注意:下载的jar包一定要和自己的MySQL版本是匹配的。比如自己电脑上安装的是MySQL5,下载的jar包大版本也得是5。

  2. 注册JDBC驱动程序

    注册驱动程序有两种常用方法

    ​ 方法1:

    //mysql5以及之前的版本需要加载驱动程序进内存
    Class.forName("com.mysql.jdbc.Driver")
        
    //mysql5以后的注册驱动这句代码可以省略,非要写请写下面的。【因为Driver的地址发生了改变】
    Class.forName("com.mysql.cj.jdbc.Driver")
    

    方法2:

    DriverManager.registerDriver(new Driver());
    

      其实呢阅读源码发现Driver类里面有个静态方法块,运行了方法二中的代码。

     //Driver类中的静态代码块。
    static {
            try {
                DriverManager.registerDriver(new Driver());
            } catch (SQLException var1) {
                throw new RuntimeException("Can't register driver!");
            }
        }
    
    • 两种方法的区别:

      使用方法二时,程序需要导包操作,也就是在程序开始需要import com.mysql.cj.jdbc.Driver这一句代码。而方法一则可以不需要这个导包操作。使用方法二就降低了程序的扩展性。

  3. 获取Connection对象。

    //调用DriverManager中的静态方法,获取到Connection对象
    Static public Connection getConnection(String url,String username,String password);
    

      上面的url字符串写法因MySQL的版本而异,具体请看下表:

    mysql版本url
    mysql 8jdbc:mysql://主机名:3306/数据库名?serverTimezone=UTC
    mysql 5jdbc:mysql://主机名:3306/数据库名

      而username和password就是登录自己mysql的账号和密码。

  4. JDBC执行SQL语句

      JDBC执行对象首先需要根据获取到的Connection对象获取到Statement或者 PreparedStatement对象。关于这两个对象的区别,将在后面的各类详解中给出。

    //获取到Statement对象
    Statement statement = connection.createStatement();
    //执行增删改操作,调用executeUpdate方法,返回受影响行数。
    int count =statement.executeUpdate("update stu set id=8 where name='张三'");
    //执行查询操作,调用executeQuery,返回一个ResultSet结果集。
    ResultSet resultSet = statement.executeQuery("select *  from stu");
    
  5. 关闭资源

    statement.close();
    connection.close();
    

整体代码示例:

import java.sql.*;
/**
*演示代码,此代码应用的mysql版本为8.0.26
*jar包版本为8.0.16
*/
public class demo {
    public static void main(String[] args) throws Exception {
        //注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //获取连接对象
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo?serverTimezone=UTC","root","root");
        //获取执行对象
        Statement statement = connection.createStatement();
        
       
        //执行增删改操作
        int count =statement.executeUpdate("update stu set id=8 where name='张三' ");
        System.out.println(count);
        
        //执行查询操作
        ResultSet resultSet = statement.executeQuery("select *  from stu");
        //遍历结果集,获取结果
        while (resultSet.next()){
            System.out.println(resultSet.getInt("id"));
        }
        //关闭资源
    	statement.close();
		connection.close();
    }
}
三、jdbc进阶–上述各个类或接口详解
3.1 DriverManager类–驱动管理对象

​ 这里主要说一下DriverManager中的getConnection方法。getConnection方法有四种重载形式,其中有一种是私有的,我们能够使用另外三种。

//重载形式1【常用】
public getConnection(String url,String username,String password);
//重载形式2,username和password都被封装到一个Properties对象中
public getConnection(String url,Properties info);
//重载形式3
public getConnection(String url);
3.2 Connection接口

​ Connection接口:获取执行sql语句的对象以及执行事务操作

 //jdbc中事务是默认提交的,开启事务则调用下面的方法并参数中传入false
connection.setAutoCommit(false);
//提交事务
connection.commit();
//回滚方法
connection.rollback();
//获取Statement对象
Statement statement1 = connection.createStatement();
//获取PreparedStatement对象
PreparedStatement preparedStatement = connection.prepareStatement(Sring sql);

  从上面可以看到,获取到Statement对象的时候没有传入参数,获取到PreparedStatement对象时就已经传入了sql语句。这个区别大吗?这个区别不大。下面继续看。

3.3 Statement接口和PreparedStatement接口
3.3.1 执行单条语句

  无论是Statement对象还是PreparedStatement对象,都需要根据传入的sql语句选择合适的方法去处理。如果是增删改语句,则调用executeUpdate方法,并用int类型的变量去接收返回值,返回值大于0,则说明执行成功;如果是查询语句,则调用executeQuery方法,用结果集类ResultSet的对象去接收。

3.3.2 批处理

  如果有同时执行多条语句的需求,那么批处理的方法你一定得看看。需要注意的是,多条添加的时候,添加到批处理的语句都得是增删改语句。

//Statement对象添加语句
String sql1="update stu set id=1 where name='张三'";
String sql2="update stu set id=9 where name='李四'";
 void statement.addBatch(String sql1);
 void statement.addBatch(String sql2);
//执行
int[] ints=statement.executeBatch();
/
//PreparedStatement对象添加语句
PreparedStatement preparedStatement = connection.prepareStatement("select * from stu where id=?");
//上面的“?”可以替换为想要的值,根据需要替换的元素数据类型选择合适的方法,index表示第几个问号,从1开始
preparedStatement.setInt(int index,Int num);
preparedStatement.setString(int index,String str);
//执行
preparedStatement.addBatch();
3.3.3 Statement接口和PreparedStatement接口的区别

  两者都是用来执行SQL语句的接口,PreparedStatement接口称为预状态通道,在创建对象时就传入了需要执行的SQL语句,其性能较Statement更高。另外,由于PreparedStatement在处理值的时候统一采用了字符串形式进行处理,因此可以防止sql注入攻击。

3.4 ResultSet集合

  执行查询语句的返回值。

//基本语法如下
//执行查询语句,获取到ResultSet对象
ResultSet resultSet = preparedStatement.executeQuery();
//遍历集合,获得结果,语法和迭代器类似。
while (resultSet.next()){
    System.out.println(resultSet.getString("name"));
 }

  通过列名获取到列值,在括号中传入列名,根据列的数据类型选择合适的方法,例如我的表的name列是varchar类型,所以用getString方法接收;如果是整数类型,则用getInt方法,使用int类型接收;日期类型数据则用getDate方法接收。

  所以呢,如果不知道表的列名以及数据类型,怎么获得到数据呢?

这时候Java为你准备了另一个接口:ResultSetMetaData

  通过ResultSet集合的getMetaData方法,获取到ResultSetMetaData对象,通过getTableName(int column)方法传入第几列获得到列名,通过getColumnTypeName(int column)方法获取到列的数据类型。

不知道表的列名以及数据类型,怎么获得到数据呢?

这时候Java为你准备了另一个接口:ResultSetMetaData

  通过ResultSet集合的getMetaData方法,获取到ResultSetMetaData对象,通过getTableName(int column)方法传入第几列获得到列名,通过getColumnTypeName(int column)方法获取到列的数据类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

挟飞仙遨游

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

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

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

打赏作者

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

抵扣说明:

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

余额充值