20201027冯强

一、学习总结:

1.JDBC

image-20201027215301521

characterEncoding=utf8&useSSL=false&serverTimezone=UTC public static void main(String[] args) {

String username = "刘明伟";

String password = "123456123' or '1' = '1";

// String password = "123456";

if (login(username, password)) {

System.out.println("登录成功");

} else {

System.out.println("用户名或密码不正确");

}

}

public static boolean login(String username, String password) {

Connection conn = null;

boolean flag = false;

try {

//注册驱动

Class.forName("com.mysql.jdbc.Driver");

//建立数据库连接

String url = "jdbc:mysql://localhost:3306/jdbcdemo?

characterEncoding=utf8&useSSL=true";

String user = "root";

String dbpass = "root";

conn = DriverManager.getConnection(url, user, dbpass);

22使用 PreparedStatement :

//定义SQL语句

String sql = "select * from users where username = '" +

username + "' and userpass = '" + password + "'";

//创建执行sql对象

Statement stat = conn.createStatement();

//执行sql,返回影响行数

ResultSet rs = stat.executeQuery(sql);

flag = rs.next();

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (SQLException e) {

e.printStackTrace();

} finally {

try {

//关闭连接

conn.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

return flag;

}

2.事务

start transaction; #开启事务 
commit; #提交事务 
rollback; #回滚事务
public class TranslactionTest { public static void main(String[] args) { trans(); }public static void trans(){ Connection conn = null; PreparedStatement stat = null; try {//加载驱动 Class.forName("com.mysql.jdbc.Driver"); //获取连接 
    conn = DriverManager.getConnection("jdbc:mysql://localho
                                       st:3306/bank? useSSL=true&characterEncoding=utf8","root", "root");
                                       
                                       //开始事务 
                                       conn.setAutoCommit(false); String sql = "UPDATE 
                                       customer SET balance=balance - ? WHERE customerName = ?"; 
                                       stat = conn.prepareStatement(sql); stat.setObject(1, 100); stat.setObject(2, "老兵"); //执行事务
                                       stat.executeUpdate(); System.out.println("老兵转出
                                                                                成功"); //模拟发生故障 if (true) { throw new RuntimeException("转账期间发生异常"); }sql = "UPDATE customer SET balance=balance+? WHERE customerName=?"; stat = conn.prepareStatement(sql); stat.setObject(1, 100); stat.setObject(2, "新兵"); //执行事务 stat.executeUpdate(); System.out.println("新兵转入成功"); //提交事务 conn.commit(); } catch (Exception e) { e.printStackTrace(); //回滚事务 try {conn.rollback(); } catch (SQLException ex) { ex.printStackTrace(); } }finally{ //关闭连接 if (conn != null){ try {conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }

事务具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为 ACID 特性。

原子性(Atomicity):一个事务是一个不可分割的工作单位,事务中包括的所有SQL语句,要么都执

行,要么都不执行。原子性是事务最根本的特性。

一致性(Consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态(事务前后数

据的完整性必须保持一致)。一致性与原子性是密切相关的。

隔离性(Isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并

发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

持久性(Durability):持久性是指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。

接下来的其他操作或故障不应该对其有任何影响。事务在操作时的理想状态:多个事务之间互不影响,如果隔离级别设置不当就可能引发并发访问问题。

事务并发会产生以下问题

image-20201027215949446

标签

评论

this is is footer