JDBC系列--登录练习和事务控制

1,081 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

登陆练习

需求:

1.通过键盘录入用户名和密码

2.判断用户是否登录成功

select * from user where username = "" and password = "";

如果这个sql有查询结果,则成功反之失败

数据库

image-20211020163514924

更改配置文件即可

image-20211020163605046

代码

 package cn.caq.jdbc;
 ​
 import cn.caq.utils.JDBCutils;
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.Scanner;
 ​
 /**
  * 需求:
  * 1.通过键盘录入用户名和密码
  * 2.判断用户是否登录成功
  */
 ​
 public class JDBCDemo08 {
 ​
     public static void main(String[]args){
         //1.键盘录入,接受用户名和密码
         Scanner scanner = new Scanner(System.in);
         System.out.println("请输入username:");
         String username = scanner.nextLine();
         System.out.println("请输入password");
         String password = scanner.nextLine();
 ​
         //2.调用方法
 //        JDBCDemo08 jdbcDemo08 = new JDBCDemo08();
 //        boolean login = jdbcDemo08.login(username, password);
         boolean flag = new JDBCDemo08().login(username, password);
 ​
         //3.判断结果,输出不同语句
         if (flag){
             System.out.println("Success!!!!!!");
         }else {
             System.out.println("username or passwd False!!!!!!!!");
         }
 ​
     }
 ​
     //登录方法
     public boolean login(String username,String password){
         if (username == null || password == null){
             return false;
         }
         Connection conn = null;
         Statement stmt = null;
         ResultSet rs = null;
         //1.连接数据库
         try {
             conn = JDBCutils.getConnection();
             //2.定义sql
             String sql = "select * from user where username = '"+username+"' and password = '"+password+"'";
             //3.获取执行sql的对象
             stmt = conn.createStatement();
             //4.执行sql语句
             rs = stmt.executeQuery(sql);
             //5.判断
             return rs.next();//有下一行返回true
         } catch (SQLException throwables) {
             throwables.printStackTrace();
         } finally {
             JDBCutils.close(rs,stmt,conn);
         }
 ​
         return false;//如果出现异常返回false
     }
 }
 

 输出结果为:

 请输入username:

 zs

 请输入password

 123

 Success!!!!!!

 ​        请输入username:

 sadfa

 请输入password

 24323

 username or passwd False!!!!!!!!

测试成功

JDBC控制事务

1.事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。

2.操作:

1.开后事务

2.提交事务

3.回滚事务

3.使用connection对象来管理事务

开启事务: setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开后事务

在执行sql之前开启事务

提交事务: commit()

当所有sql都执行完提交事务

回滚事务: rollback()

在catch中回滚事务

下面通过一个转账实例来加深印象

转账实例

 package cn.caq.jdbc;
 ​
 import cn.caq.utils.JDBCutils;
 ​
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
 ​
 /**
  * 事务操作
  */
 ​
 public class JDBCDemo10 {
     public static void main(String[] args) {
         Connection conn = null;
         PreparedStatement pstmt1 = null;
         PreparedStatement pstmt2 = null;
         //1.获取连接
         try {
             conn = JDBCutils.getConnection();
             //开启事务
             conn.setAutoCommit(false);
 ​
             //2.定义sql
             //2.1张三 - 500
             String sql1 = "update account set balance = balance - ?  where id = ?";
             //2.1李四 + 500
             String sql2 = "update account set balance = balance + ?  where id = ?";
             //3.获取执行sql对象
             pstmt1 = conn.prepareStatement(sql1);
             pstmt2 = conn.prepareStatement(sql2);
             //4.设置参数
             pstmt1.setDouble(1, 500);
             pstmt1.setInt(2, 1);
 ​
             pstmt2.setDouble(1, 500);
             pstmt2.setInt(2, 2);
 ​
             //5.执行sql
             pstmt1.executeUpdate();
 ​
             //手动制造异常
             int i = 3 / 0;
 ​
             pstmt2.executeUpdate();
 ​
             //提交事务
             conn.commit();
 ​
         } catch (Exception throwables) {
             try {
                 if (conn != null) {
                     conn.rollback();
                 }
             } catch (SQLException e) {
                 e.printStackTrace();
             }
             throwables.printStackTrace();
         }
     }
 }
 ​
 ​

 如果中途出现任何异常,则触发回滚操作!      输出结果为:

     java.lang.ArithmeticException: / by zero

  at cn.caq.jdbc.JDBCDemo10.main(JDBCDemo10.java:43)

金额没有发生变化

image-20211020173304405

成功了

小总结

通过事务的控制,来解决数据传输中可能遇到的问题,通过在程序中实现这一操作能很好的加深我们的印象