554JDBC事务管理 Jdbc事务管理 and555JDBC管理事务_概述 556JDBC管理事务实现
JDBC事务管理
1.Preparedstatement:执行sql的对象
1.SQL注入问题:在拼接sql时,有一些的sql的特殊关键字参与字符串的拼接。会造成安全性问题
2.用户随便输入:例如dawugfak,密码输入a' or = 'a' 'a
3.sql:select* from user where username = 'fhdsjkf' and password='a' or 'a'='a
2.解决sql注入问题:使用preparedStatement对象来解决
3.预编译的sql:参与使用?作为占位符
步骤:
导入驱动jar包mysql-connector-java-5.1.37-bin.jar
注册驱动
获取数据库连接对象connection
定义sql
注意;sql的参数使用?作为占位符。如; select*from user where username = ? and password = ?;获取执行sql语句的对象 Preparedstatement Connection.prepareStatement(string sql)
给?赋值︰
*方法:setxxx(参数1,参数2)
*参数1:?的位置编号从1开始*参数2:?的值
执行sq1,接受返回结果,不需要传递sql语句
处理结果
释放资源
public class JDBC_demo003lx {
public static void main(String[] args) throws SQLException {
//1.键盘录入,接受用户和密码
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名:");
String username = sc.nextLine();
System.out.println("请输入密码:");
String password = sc.nextLine();
//2.调用方法,非静态方法new一个对象
boolean flag = new JDBC_demo003lx().login(username, password);
//3.判断结果,输出不同语句
if (flag) {
System.out.println("登录成功");
} else {
System.out.println("登录失败");
}
}
/*写一个登陆方法,有参数用户和密码,返回是否登陆成功*/
public boolean login(String username, String password) throws SQLException {
//判断录入的密码和用户名是否为空
if (username == null || password == null) {
return false;
}
//连接数据库判断是否登陆成功
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
//1.获取链接
try {
conn = JDBCUtils.getConnection();
//2.定义sql语句
String sql = "select * from user where username= ? and password = ?";
//3.获取执行sql的对象
stmt = conn.prepareStatement(sql);
//给?赋值
stmt.setString(1, username);
stmt.setString(2, password);
//4.执行查询
rs = stmt.executeQuery();
//5.判断结果集是不是有数据
return rs.next(); //返回为布尔型数据,如果有下一行就返回true
} catch (SQLException e) {
e.printStackTrace();
} finally {
//6.释放资源
JDBCUtils.close(rs, stmt, conn);
}
return false;
}
}

JDBC管理事务_概述
事务:一个包含多个步骤的业务操作,如果这个业务操作被事务管理,则多个步骤同时成功要么同时失败
操作
开启事务
提交事务
回滚事务
使用Connection对象来管理事务对象
开启事务:setAutoCommit(boolaen autoCommit) 使用该方法设置参数false,级开启事务
提交事务:commit
回滚事务:rollback
public static void main(String[] args) {
/* 声明到try外面 */
Connection conn = null;
PreparedStatement pstmt1 = null;
PreparedStatement pstmt2 = null;
try {
/* 获取连接 */
conn = JDBCUtils.getConnection();
/* 开启事务 */
conn.setAutoCommit(false);
/* 定义sql */ /* 2.1 汤姆-500 2.2 杰瑞+500 */
String slq1 = "update account set balance = balance - ? where id = ?"; // 2.1
String slq2 = "update account set balance = balance + ? where id = ?"; // 2.2
/* 获取sql执行对象 */
pstmt1 = conn.prepareStatement(slq1);
pstmt2 = conn.prepareStatement(slq2);
/* 设置参数 */
pstmt1.setDouble(1,500);//汤姆-500
pstmt1.setDouble(2,1);//id为1
pstmt2.setDouble(1,500);//杰瑞+500
pstmt2.setDouble(2,2);//id为2
/* 执行sql */
pstmt1.executeUpdate();
/*手动制造异常*/
int i=3/0;
pstmt2.executeUpdate();
/* 提交事务 */
conn.commit();
} catch (SQLException e) {
/* 事务的回滚 */
try {
if (conn != null) {
conn.rollback();
}
} catch (Exception ex) {
ex.printStackTrace();
}
e.printStackTrace();
} finally {
/* 关流 */
JDBCUtils.close(pstmt1,conn);
JDBCUtils.close(pstmt2,null);
}
}
}

浙公网安备 33010602011771号