JDBC 2.PreparedStatement与事务
2019-03-28 本文已影响0人
第二套广播体操
PreparedStatement 执行sql的对象
sql注入问题 在拼接sql时 有一些sql的特殊关键字参与字符串的拼接会导致安全问题
解决方法 使用PreparedStatement
预编译 sql 参数使用?作为占位符
定义sql的参数使用作为占位符
方法:setXXX(问号的位置编号从1开始,占位符所在位置的值);
如果是字符串就是 setString 整数就是 setInt
执行时不需要传递sql语句
演示 登录功能
/** 登录功能 */
public class Jdbc_PreparedStatement {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet resultSet = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "root");
String sql = "select *from work where user=? and password=?";
ps = conn.prepareStatement(sql);
ps.setString(1,"张三");
ps.setString(2,"23456");
resultSet = ps.executeQuery();
if (resultSet.next() == true) {
System.out.println("登陆成功");
} else {
System.out.println("登陆失败");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
JdbcUnits.getClose(conn,ps,resultSet);
}
}
}
Jdbc 事务控制
事务 一个包含多个步骤的业务操作 如果这个业务操作被事务管理
则这多个步骤要么同时成功 要么同时失效
通过connection进行事务管理
开启方法 setAutoCommit(false)
提交方法commit()
回滚方法 rollback()
/**
* 事务 及事务回滚和提交
*/
public class Jdbc_AutoCommit {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement pstat1 = null;
PreparedStatement pstat2 = null;
try {
connection = JdbcUnits.getConnection();
// 创建事务 开启手动提交
connection.setAutoCommit(false);
pstat1 = connection.prepareStatement(
"UPDATE change_money SET money=money-? WHERE id=?");
pstat2 = connection.prepareStatement(
"UPDATE change_money SET money=money+? WHERE id=?");
pstat1.setInt(1,500);
pstat1.setInt(2,1);
pstat2.setInt(1,500);
pstat2.setInt(2,2);
pstat1.executeUpdate();
// 在两次提交中出现错误导致第二次无法提交 可以回滚到之前状态
// int i= 2/0;
pstat2.executeUpdate();
// 提交事务
connection.commit();
} catch (Exception e) {
// 出现错误 回滚
try {
connection.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally {
JdbcUnits.getClose(connection,pstat1);
JdbcUnits.getClose(null,pstat2);
}
}
}