【Mysql4】jdbc


1.JDBC事务操作

在这里插入图片描述

package com.itheima01.transaction;
import com.itheima.utils.JdbcUtil;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
// JDBC : 写一个转账案例
public class Demo {
    
    
    public static void main(String[] args)  {
    
           
        System.out.println("请输入转出的账户:"); 
        Scanner sc = new Scanner(System.in); // 控制台: 模拟页面
        String outUser = sc.nextLine();
                
        System.out.println("请输入转入的账户:");
        String inUser = sc.nextLine();   
             
        System.out.println("请输入转账的金额:");
        double money = sc.nextDouble();
        
       //sql里面最好写单引号 , 1000和jack改为 两个双引和两个+号
       //String sql1 = "update account set money = money-1000 where name = 'jack'";
        String sql1 = "update account set money = money-"+money+" where name = '"+outUser+"'";
        String sql2 = "update account set money = money+"+money+" where name = '"+inUser+"'";

//11111111111111111111111111111111111111111111111111111111111111111111111111111111111111
        Connection conn = null;
        try {
    
    
                /*
                *   事务操作: Connection
                *       1. setAutoCommit(false); 开启事务
                *       2. commit(); 提交事务
                *       3. rollback(); 事务回滚
                *   注意点: 在事务中, 开启事务的连接才具有手动提交事务的功能
                *           一组操作都必须要同一个 连接conn  要执行
                */            
            conn = JdbcUtil.getConnection(); //访问数据库
 		   // Connection conn2 = JdbcUtil.getConnection();      		        
            conn.setAutoCommit(false); //开启事务,禁止自动提交  
                          
            Statement statement = conn.createStatement(); //转出
            statement.executeUpdate(sql1);                        
            // int i = 1/0;  // ArithmeticException 算术异常 模拟银行爆炸                
            Statement statement2 = conn.createStatement(); //转入
            statement2.executeUpdate(sql2);

//1111111111111111111111111111111111111111111111111111111111111111111111111111111111111                  			
            conn.commit(); //提交事务(和事务回滚只有其一执行) 
            System.out.println("转账成功~~");
        } catch (Exception e) {
    
     // 注意: 提升异常级别(用于捕获算术异常)
            e.printStackTrace();
            if(conn != null){
    
     //Connection conn放外面,这边访问的到
                try {
    
    
                    conn.rollback(); //事务回滚
                } catch (SQLException e1) {
    
    
                    e1.printStackTrace();
                }
            }
            System.out.println("转账失败");
        }
    }
}

在这里插入图片描述
在这里插入图片描述

2.登陆案例

在这里插入图片描述

package com.itheima02.login;
import com.itheima.utils.JdbcUtil;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
/*
    前提:
        用户能够登录,说明已经注册过了
        注册成功的时候, 程序会把用户的信息保存到数据库
        
*   登录案例:
*       逻辑: 请输入用户名和密码(用户)
*       我们: 校验数据库
*       sql :  select * from account where name = ? and pwd = ?; (name用户名唯一)
*           预测结果:
*               1. 0条 : 用户名不存在或密码错误
*               2. 1条 : 登录成功
*/
public class LoginDemo {
    
    
    public static void main(String[] args) throws SQLException {
    
    
        System.out.println("请输入用户名:");
        Scanner sc = new Scanner(System.in);
        String name = sc.nextLine();  
              
        System.out.println("请输入密码:");
        String pwd = sc.nextLine();
        
        String sql = "select * from account where name = '"+name+"' and pwd = '"+pwd+"'";
        System.out.println(sql); //将参数(上面键盘输入)直接拼接进sql
        
//1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
        Connection conn = JdbcUtil.getConnection();
        Statement statement = conn.createStatement();           
        ResultSet resultSet = statement.executeQuery(sql); //将sql发送给数据库去处理
        if(resultSet.next()){
    
     //有一条则为true
            System.out.println("登录成功~~");
        }else{
    
    
            System.out.println("用户名不存在或密码错误");
        }
    }
}

根据(用户名和密码)或(1=1永真)为条件查询数据库,what可以随便写。
在这里插入图片描述

3.sql注入和预编译

预编译知道了sql的语法结构了,已经把关键字认全了,后面再包含关键字or就不认了(当成字符串处理),可以防止sql注入。转义飘号。csr。
在这里插入图片描述

4.登陆案例的预编译改造

package com.itheima02.login;
import com.itheima.utils.JdbcUtil;
import java.sql.*;
import java.util.Scanner;

public class LoginDemo02 {
    
    
    public static void main(String[] args) throws SQLException {
    
    
        System.out.println("请输入用户名:");
        Scanner sc = new Scanner(System.in);
        String name = sc.nextLine();
        
        System.out.println("请输入密码:");
        String pwd = sc.nextLine();

            // 1. 改造sql       
        String sql = "select * from account where name = ? and pwd = ?";
        System.out.println(sql);
        Connection conn = JdbcUtil.getConnection();

           // 2. 预编译sql   // PreparedStatement 是 Statement的子接口
        PreparedStatement statement = conn.prepareStatement(sql);
            
          // 3. 设置参数
          // setString(int parameterIndex, String x)
          // parameterIndex : sql中的?的索引(从1开始,从左开始)  // String x: 参数
        statement.setString(1,name);
        statement.setString(2,pwd);

          // 4. 传参执行
        ResultSet resultSet = statement.executeQuery();
        if(resultSet.next()){
    
    
            System.out.println("登录成功~~");
        }else{
    
    
            System.out.println("用户名不存在或密码错误");
        }
    }
}

在这里插入图片描述
如下手动在数据库中增加一行
在这里插入图片描述
在这里插入图片描述

5.预编译好处

package com.itheima03.prepare;
import com.itheima.utils.JdbcUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
/*
*   预编译的好处: 1. 防止sql注入
*                 2. 阅读性强(sql)
*                 3. 批量处理sql,效率高 (节省了sql重复编译过程)
*/
public class PrepareDemo {
    
    
    public static void main(String[] args) throws SQLException {
    
    
//        method01(); //用预编译,如下不用预编译
        String name = "ww";
        int money = 200;
        String sql1 = "insert into account values(null,'"+name+"',"+money+",null)";
        
        String name2 = "www";
        int money2 = 2002;
        String sql2 = "insert into account values(null,'"+name2+"',"+money2+",null)";     
                           
        Connection conn = JdbcUtil.getConnection();
        Statement statement = conn.createStatement(); //不用预编译
        statement.executeUpdate(sql1);// 编译+运行
        statement.executeUpdate(sql2);//编译+运行,和上行一共两次编译        
        statement.close();
        conn.close();
    }

//1111111111111111111111111111111111111111111111111111111111111111111111111
    private static void method01() throws SQLException {
    
    
        String sql = "insert into account values(null,?,?,null)";        
        Connection conn = JdbcUtil.getConnection();
        PreparedStatement pstm = conn.prepareStatement(sql);   
              
        pstm.setString(1,"zs");
        pstm.setDouble(2,1000);
        pstm.executeUpdate();//运行
        
        pstm.setString(1,"ls");
        pstm.setDouble(2,2000);
        pstm.executeUpdate();//运行        
        pstm.close();
        conn.close();
    }
}

B站/知乎/微信公众号:码农编程录
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43435675/article/details/112860185