【Javaweb】大中午的不来一首JDBC六部曲?

本文介绍了如何通过JDBC连接MySQL数据库,包括普通Statement和PreparedStatement的使用,事务的ACID原则及其实现,以及JUNIT单元测试的应用。重点展示了开启事务、提交与回滚操作,并通过一个实际案例演示了事务处理的正确实践。
摘要由CSDN通过智能技术生成

连接

在这里插入图片描述

需要jar包的支持

  • java.sql
  • javax.sql
  • mysql-connector-java…连接驱动(必须要导入)

实验环境搭建

  • 导入数据库依赖

    <!--mysql的驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.17</version>
    </dependency>
    
  • 连接数据库(这个在前面有教程)

  • JDBC固定六部曲

    • 加载驱动

    • 连接数据库

    • 向数据库发送SQL的对象Statement:CRUD

    • 编写sql(根据业务,不同的sql)

    • 执行查询SQL,返回一个ResultSet :结果集

    • 关闭连接,释放资源(一定要做)先开的后关

      1.下面这个是普通的连接statement

    package com.hxl.test;
    
    import java.sql.*;
    
    public class TestJdbc {
        public static void main(String[] args) throws ClassNotFoundException, SQLException {
            //配置信息
            String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
            String username = "root";
            String password = "123456";
            //1.加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.连接数据库
            //DriverManager代表驱动管理
            //connection获得的这个代表数据库,数据库的所有操作,他都可以做
            Connection connection = DriverManager.getConnection(url, username, password);
            //3.向数据库发送SQL的对象Statement:CRUD
            //PreparedStatement这个是安全的,需要把SQL放进去,预编译
            Statement statement = connection.createStatement();
            //4.编写sql
            String sql = "select * from users;";
            //5.执行查询SQL,返回一个ResultSet :结果集
            //增删改都是用executeUpdate即可
            ResultSet rs = statement.executeQuery(sql);
            while(rs.next()){
                //这里如果知道类型就可以使用getInt/getString等类型,不知道的话直接可以用getObject
                System.out.println("id=" + rs.getObject("id"));
                System.out.println("name=" + rs.getObject("name"));
                System.out.println("password=" + rs.getObject("password"));
                System.out.println("email=" + rs.getObject("email"));
                System.out.println("birthday=" + rs.getObject("birthday"));
            }
            //6.关闭连接,释放资源(一定要做)先开的后关
            rs.close();
            statement.close();
            connection.close();
        }
    }
    

    ​ 2.下面这个是预编译的sql即PreparedStatement

    package com.hxl.test;
    
    import java.sql.*;
    
    //使用预编译的,PreparedStatement
    public class TestJdbc2 {
        public static void main(String[] args) throws Exception {
            //配置信息
            String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
            String username = "root";
            String password = "123456";
            //1.加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.连接数据库
            Connection connection = DriverManager.getConnection(url, username, password);
            //3.编写sql
            String sql = "insert into users(id, name, password, email, birthday) value(?,?,?,?,?)";
            //4.预编译
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setInt(1,2);//给第一个占位符?的值赋值为2
            preparedStatement.setString(2,"老二");//给第二个占位符?的值赋值为老二
            preparedStatement.setString(3,"123456");//给第三个占位符?的值赋值为123456
            preparedStatement.setString(4,"2@qqcom");//给第四个占位符?的值赋值为2@qqcom
            //外面的date是sql.date里面的是util
            preparedStatement.setDate(5,new Date(new java.util.Date().getTime()));//给第五个占位符?的值赋值为
            //5.执行sql
            int i = preparedStatement.executeUpdate();
            if(i>0){
                System.out.println("插入成功");
            }
            //6.关闭连接,释放资源(一定要做)先开的后关
            preparedStatement.close();
            connection.close();
        }
    }
    

事务

要么都成功,要么都失败

ACID原则,保证事务的安全

原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(Consistency):事务前后数据的完整性必须保持一致。
隔离性(Isolation):事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

开启事务
事务提交:commit()
事务回滚:rollback()
关闭事务
  • JUNIT单元测试

    依赖

    <!--单元测试-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    

    简单使用

    @Test注解只有在方法上有效,只要加了这个注解的方法,就可以直接运行

    import org.junit.Test;
    
    public class TestJdbc3 {
        @Test
        public void test(){
            System.out.println("测试成功");
        }
    }
    

    成功是绿色的。失败是红色

    在这里插入图片描述

  • 搭建一个环境测试一个事务

package com.hxl.test;

import com.sun.javaws.jnl.RContentDesc;
import org.junit.Test;

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

public class TestJdbc3 {
    @Test
    public void test() {
        //配置信息
        String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
        String username = "root";
        String password = "123456";
        Connection connection = null;
        //1.加载驱动
        try {
            Class.forName("com.mysql.jdbc.Driver");

            //2.连接数据库
            connection = DriverManager.getConnection(url, username, password);
            //3.通知数据库开启事务   false是开启
            connection.setAutoCommit(false);
            String sql = "UPDATE account set money  = money - 100 where name = '老大';";
            connection.prepareStatement(sql).executeUpdate();

            //制造错误
            //int i = 1 / 0;
            String sql2 = "UPDATE account set money  = money + 100 where name = '老二';";
            connection.prepareStatement(sql2).executeUpdate();
            //以上两条SQL都执行成功了,就提交事务!
            connection.commit();
            System.out.println("success");
        } catch (Exception e) {
            try {
                //如果出现异常,就通知数据库回滚事务
                connection.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
        }finally {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
start transaction;#开启事务(必须要做的)

UPDATE account set money  = money - 100 where name = '老大';
#rollback必须要在commint之前才可以,如果在提交之后再回滚,是不会回来的
rollback;

commit;

在上述的代码中如果我们开启了制造错误,运行是失败的,数据也不会改变。另外我们没有通知开启事务,那虽然会报错,但是数据库的数据发生了改变,这个我们需要注意一下。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

秦 羽

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

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

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

打赏作者

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

抵扣说明:

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

余额充值