Mysql

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);
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读