Java-JDBC

2019-01-02  本文已影响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");去掉再执行一次。发现都执行成功。

上一篇下一篇

猜你喜欢

热点阅读