Java-JDBC

作者: 指尖轻敲 | 来源:发表于2019-01-02 09:42 被阅读6次

    JDBC让java程序可以连接任何提供了JDBC驱动的数据库(Mysql/Oracle/SOL server)。

    连接Mysql

    连接Mysql需要先添加驱动,把com.mysql.jdbc.Driver这个字节码加载到JVM中,字节码中的静态代码块会自动执行。(需要导入mysql-connector-java包)

    try {
        Class.forName("com.mysql.jdbc.Driver");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    

    添加完驱动就可以获取连接对象了,该方法接收三个参数分别是:链接urrl、用户名、密码。打印出链接对象说明我们已经链接成功。

    String url = "jdbc:mysql://localhost:3306/java01";
    String user = "root";
    String password = "636332";
    try {
        Connection connection = DriverManager.getConnection(url,user, password);
        System.out.println(connection);
    } catch (SQLException e) {
        e.printStackTrace();
    }
    
    // com.mysql.jdbc.JDBC4Connection@53b32d7
    

    操作数据库

    我们先以创建一个表为例,需要先创建一个Statement对象,然后通过Statement对象的executeUpdate方法去执行创建的sql语句,并返回结果。执行完成之后释放资源。

    String sql = "create table students(id int, name varchar(255), age int)";
    Statement statement = null;
    try {
        statement = connection.createStatement();
        statement.executeUpdate(sql);
        // 释放资源
        statement.close();
        connection.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    

    接下来我们给这个表中插入一条数据,这里执行sql语句的方法也是executeUpdate。

    String sql2 = "insert into students value(1, '杨超越', 24)";
    statement.executeUpdate(sql2);
    

    接下我们来看一下查询的写法,查询与之前使用的方法不一样,需要使用executeQuery方法执行sql语句。

    String sql3 = "select * from students where age = '24'"; //查询总共几条
    ResultSet res = statement.executeQuery(sql3);
    while (res.next()){
        // 打印查出来的数据的name字段
        System.out.println(res.getString("name"));
    }
    

    事物处理

    事物的概念

    事物是一个最小的工作单元,可能由几个任务组成,这些任务要么全部执行成功,要么全部都不执行,不能只执行其中一部分。
    举个简单的例子:去银行转账,A发起转账的任务,银行进行处理扣除A账户的钱,并给B账户增加响应的钱。B收到钱,一个事物算是完成。不存在A的钱扣除了,因为某种系统的原因,B没有收到转账。

    事物的特性
    • 原子性:对于数据来说,事物就是最小的单元,不能在进行分割。要么所有操作都成功,要么都不操作。

    • 一致性:事物执行成功,所有的变化都有效的应用,一单发生错误,该事物的所有操作都进行回滚到之前的状态。

    • 隔离性:事物在执行的过程中是独立的,如果此时又运行同样的事物出现了并发,那么一个事物就要等另一个事物的执行。

    • 持久性:事物完成之后,对数据库的修改是永久保持的。

    代码实现事务的流程

    1、默认情况下,我们执行一条sql语句就是一个事务,执行就会被自动提交,我们需要关闭自动提交。

    2、把一个事务要执行的多条sql语句放在一起,如果全部正常执行,手动进行提交。

    3、如果一旦发生错误,全部回滚,之前的操作都会被撤销。

    上代码

    我们先创建一个超级简单的表,


    初始表.png

    然后用代码操作数据库,不加事务管理的情况下,我们执行两个sql语句,然而a.split("1");会发生异常,这时就造成了只执行了一条语句。

    try {
        Class.forName("com.mysql.jdbc.Driver");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    String dbUrl = "jdbc:mysql://localhost:3306/java01";
    String user = "root";
    String password = "636332";
    String sql = "update bank set money = 200 where name = 'zhangsan'";
    String sql2 = "update bank set money = 100 where name = 'lisi'";
    
    try {
        Connection connection = DriverManager.getConnection(dbUrl, user, password);
        Statement statement = connection.createStatement();
        statement.executeUpdate(sql);
        String a = null;
        a.split("1");
        statement.executeUpdate(sql2);
        statement.close();
        connection.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    

    结果如下:

    有异常操作后.png

    很明显这不符合我们事务的特性,我们来加上事务相关代码:

    Connection connection = null;
    try {
        connection = DriverManager.getConnection(dbUrl, user, password);
        // 关闭自动提交
        connection.setAutoCommit(false);
    } catch (SQLException e) {
        e.printStackTrace();
    }
    try {
        Statement statement = connection.createStatement();
        statement.executeUpdate(sql);
        String a = null;
        a.split("1");
        statement.executeUpdate(sql2);
        // 所有sql语句执行完成手动提交
        connection.commit();
        statement.close();
        connection.close();
    } catch (SQLException e) {
        try {
            // 一旦上面操作有异常就回滚
            connection.rollback();
        } catch (SQLException e1) {
            e1.printStackTrace();
        }
        e.printStackTrace();
    }
    

    这时我们再看数据库,发现两个sql语句都没有执行。如果我们把有异常的a.split("1");去掉再执行一次。发现都执行成功。

    相关文章

      网友评论

          本文标题:Java-JDBC

          本文链接:https://www.haomeiwen.com/subject/hyrnlqtx.html