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站/知乎/微信公众号:码农编程录