20201027冯强
一、学习总结:
1.JDBC
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):持久性是指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
接下来的其他操作或故障不应该对其有任何影响。事务在操作时的理想状态:多个事务之间互不影响,如果隔离级别设置不当就可能引发并发访问问题。
事务并发会产生以下问题
近期评论