JavaWeb--JDBC与事务

前言

  • Java Web 其实就是一个技术的总和,把Web看成一个容器而已主要使用JavaEE技术来实现.在加上各种中间件。
  • 整个javaWeb阶段的内容通过实际的案例贯穿学习, 所涉及到的技术知识点会在案例中根据不同的需求引入。
  • 首先了解javaWeb的整个技术体系,掌握常用的技术知识点。

我会将JavaWeb分为8篇左右的文章来记录自己的学习过程,也方便大家逐级递增难度的学习,如有错误或遗漏欢迎大家指出。

注:本篇文章承接上一篇JavaWeb文章JavaWeb--过滤器与监听器
下面我们进入正题!

14、JDBC

什么是JDBC:Java DataBase Connection (Java连接数据库)

连接数据库需要jar包的支持:

  • java.sql
  • javax.sql
  • mysql-connector-java(连接驱动)

JDBC 固定步骤:

1.加载驱动
2.连接数据库,代表数据库
3.向数据库发送SQL的对象Statement : CRUD
4.编写SQL (根据业务,不同的SQL)
5.执行SQL
6.关闭连接(先开的后关)

实验环境搭建:

  1. 数据库信息

  2. 导入数据库依赖

    <!--mysql驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.29</version>
    </dependency>
    
  3. IDEA中连接数据库

  1. JDBC六步

    public class TestJDBC {
        public static void main(String[] args) throws ClassNotFoundException, SQLException {
            //配置信息
            //解决中文乱码问题useUnicode=true&characterEncoding=utf-8
            String url = "jdbc:mysql://localhost:3306/jdbc?     useUnicode=true&characterEncoding=utf-8&useSSL=true";
            String username = "root";
            String password = "qjd011212";
    
            //1.加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.连接数据库,代表数据库
            Connection connection = DriverManager.getConnection(url, username, password);
            //3.向数据库发送SQL的对象   Statement:CRUD
            Statement statement = connection.createStatement();
             // PreparedStatement安全,可以防止sql注入(预编译)
            //4.编写sql
            String sql = "select *from jdbc.users";
    
            //5.执行查询sql,返回一个ResultSet结果集
            ResultSet rs = statement.executeQuery(sql);
            while (rs.next()){
                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();
    
    
        }
    }
    
  • 结果:
  1. 使用预编译防止sql注入

    public class TestJDBC2 {
        public static void main(String[] args) throws ClassNotFoundException, SQLException {
            //配置信息
            //解决中文乱码问题useUnicode=true&characterEncoding=utf-8
            String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8&useSSL=true";
            String username = "root";
            String password = "qjd011212";
    
            //1.加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
    
            //2.连接数据库,代表数据库
            Connection connection = DriverManager.getConnection(url, username, password);
            //3.编写sql
            String sql = "insert into jdbc.users(id, name, password, email, birthday) VALUES (?,?,?,?,?);";
    
            //4.预编译    PreparedStatement安全,可以防止sql注入(预编译)
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
    
            preparedStatement.setInt(1,4);//第一个占位符?的值为1
            preparedStatement.setString(2,"赵六");//第二个占位符?的值为赵六
            preparedStatement.setString(3,"523456");//第三个占位符?的值为123456
            preparedStatement.setString(4,"zl@qq.com");//第四个占位符?的值为1503349647@qq.com
            preparedStatement.setDate(5,new Date(System.currentTimeMillis()));//第五个占位符?的值为当前年月日
    
    
    
            //5.执行查询sql
            int i = preparedStatement.executeUpdate();
            System.out.println(i);
    
    
    
            //6.关闭连接,释放资源(先创建的后关闭)
    
            preparedStatement.close();
            connection.close();
    
    
        }
    }
    
  • 结果:

15、事务

要么都成功,要么都失败!

ACID原则:保证数据的安全

  • 原子性
  • 隔离性
  • 持久性
  • 一致性
开启事务
事务提交commit
事务回滚rollback
关闭事务

junit单元测试

  • 依赖

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>
    </dependency>
    
  • 简单使用:

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

搭建测试事务环境:

count表:

public class TestJDBC3 {

   @Test
    public void test() {
       //配置信息
       //解决中文乱码问题useUnicode=true&characterEncoding=utf-8
       String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8&useSSL=true";
       String username = "root";
       String password = "qjd011212";

       Connection connection = null;

       //1.加载驱动
       try {
           Class.forName("com.mysql.cj.jdbc.Driver");

       //2.连接数据库,代表数据库
        connection = DriverManager.getConnection(url, username, password);
        
       //3.通知数据库开启事务(false是开启)
       connection.setAutoCommit(false);

       String sql = "update jdbc.account set money = money-100 where name = 'a';";
       connection.prepareStatement(sql).executeUpdate();


       //制造错误
       int i=1/0;

       String sql2 = "update jdbc.account set money = money+100 where name = 'b';";
       connection.prepareStatement(sql2).executeUpdate();



       connection.commit();//以上两条sql都提交成功了就提交事务
       System.out.println("提交成功!");
       } catch (Exception e) {
           try {
               //如果出现异常,就通知数据库回滚事务
               connection.rollback();
           } catch (SQLException throwables) {
               throwables.printStackTrace();
           }
           e.printStackTrace();
       }finally {
           try {
               connection.close();
           } catch (SQLException throwables) {
               throwables.printStackTrace();
           }
       }


    }


}
  • 出现错误就会回滚账户余额不变

  • 没有错误就会正常提交事务

posted @ 2022-08-29 19:04  鹤鸣呦呦、、  阅读(50)  评论(0编辑  收藏  举报