【笔记】JavaWeb-05-JDBC


JDBC

Java数据库连接

需要jar包的支持:

  • java.sql
  • javax.sql
  • mysql-connecter-java...连接驱动

Java连接数据库实例

1. 导入MySQL驱动


    
    
        mysql
        mysql-connector-java
        8.0.25
    

2. 连接MySQL数据库

在IDEA界面操作,初次连接需要下载驱动,下载即可。

注意:如果MySQL未设置时区,会报错:Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone'

解决:IDEA连接mysql又报错!Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' prope_liuqiker的博客-CSDN博客

3. 实例:查询

public class JdbcTest {
    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";
        String username = "root";
        String password = ".gThqUDcl5IX";

        // 1.加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        
        // 2.连接数据库
        Connection connection = DriverManager.getConnection(url, username, password);

        // 3.向数据库发送sql对象statement:CRUD
        Statement statement = connection.createStatement();

        // 4.编写SQL
        String sql = "select * from users;";

        // 5.执行查询SQL,返回一个ResultSet(结果集)
        ResultSet rs = statement.executeQuery(sql);

        // 输出结果
        while (rs.next()){
            System.out.println("id="+rs.getObject("id"));
            System.out.println("id="+rs.getObject("name"));
            System.out.println("id="+rs.getObject("password"));
            System.out.println("id="+rs.getObject("email"));
            System.out.println("id="+rs.getObject("birthday"));
        }

        // 6.关闭连接
        rs.close();
        statement.close();
        connection.close();
    }
}

4. 实例:添加

public class JdbcTest02 {
    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";
        String username = "root";
        String password = ".gThqUDcl5IX";

        // 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) values (?,?,?,?,?)";

        // 4.预编译
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setInt(1,5);
        preparedStatement.setString(2,"田七");
        preparedStatement.setString(3,"tq123456");
        preparedStatement.setString(4,"tq123@jdbc.com");
        preparedStatement.setDate(5,new Date(new java.util.Date().getTime()));

        // 5.执行查询SQL.executeUpdate返回的是一个int(即多少行受到影响)
        int i = preparedStatement.executeUpdate();
        if (i>0) {
            System.out.println("插入成功!!");
        }

        // 6.关闭连接
        preparedStatement.close();
        connection.close();
    }
}

JDBC固定步骤

查询操作

  1. 加载驱动;
  2. 连接数据库;
  3. 向数据库发送SQL的对象Statement:CRUD;
  4. 编写SQL(根据业务而不同);
  5. 执行SQL:executeQuery();
  6. 关闭连接。

增删改操作

  1. 加载驱动;
  2. 连接数据库;
  3. 编写SQL(根据业务而不同);
  4. 预编译:PreparedStatement;
  5. 执行SQL:executeUpdate();
  6. 关闭连接。

事务

要么都成功,要么都失败

ACID原则

  • 原子性(A)

    一个事务的所有系列操作步骤被看成一个动作,所有的步骤要么全部完成,要么一个也不会完成。如果在事务过程中发生错误,则会回滚到事务开始前的状态,将要被改变的数据库记录不会被改变。

  • 一致性(C)

    一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏,即数据库事务不能破坏关系数据的完整性及业务逻辑上的一致性。

  • 隔离性(I)

    主要用于实现并发控制,隔离能够确保并发执行的事务按顺序一个接一个地执行。通过隔离,一个未完成事务不会影响另外一个未完成事务。

  • 持久性(D)

    一旦一个事务被提交,它应该持久保存,不会因为与其他操作冲突而取消这个事务。

Java中事务实例

开启事务
事务提交  commit()
事务回滚  rollback()
关闭事务
    
/*实例:转账*/
A:1000
B:1000
A   ---100--->   B
A:900
B:1100

测试回滚/提交

public class JdbcTest03 {
    @Test
    public void TTest() {
        // 解决中文乱码:?useUnicode=true&characterEncoding=utf-8
        String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true;characterEncoding=utf-8";
        String username = "root";
        String password = ".gThqUDcl5IX";
        Connection connection = null;

        // 1.加载驱动
        try {
            Class.forName("com.mysql.jdbc.Driver");
            // 2.连接数据库
            connection = DriverManager.getConnection(url, username, password);

            // 3.通知数据库开启事务,false是开启,等价于start transaction;
            connection.setAutoCommit(false);

            // 4. 编写SQL,执行SQL
            String sql = "update account set money = money-100 where name='A';";
            connection.prepareStatement(sql).execute();

            // 制造错误,测试回滚rollback
            int i = 1/0; // 注释掉,即可正常运行

            String sql2 = "update account set money = money+100 where name='B';";
            connection.prepareStatement(sql2).execute();

            // 5.提交事务
            connection.commit();  // 以上两条sql执行成功,提交
            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();
            }
        }
    }
}

单元测试工具:junit

在pom.xml导入junit包



    junit
    junit
    4.12


使用:在需要测试的类上加入@Test注解

public class JdbcTest03 {
    @Test
    public void TTest(){
        System.out.println("sdfwefwe");
    }
}