Day_8 登陆案例、PreparedStatement类、JDBC控制事务

登陆案例:

需求:

  1. 通过键盘录入用户名和密码
  2. 判断用户是否登陆成功
    如果sql有查询结果则成功,反之失败

步骤:

  1. 创建数据库表 user
CREATE TABLE USER(
	id int PRIMARY KEY auto_increment,
	username VARCHAR(32),
	PASSWORD VARCHAR(32)
);

INSERT INTO USER VALUES(NULL,'张三','123');
INSERT INTO USER VALUES(NULL,'李四','456');

Test:

package cn.sdut.jdbc;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

/*
  需求:
    1. 通过键盘录入用户名和密码
    2. 判断用户是否登陆成功
*/
public class Test {

    public static void main(String[] args) {
        //1.创建键盘录入,接受数据
        Scanner input = new Scanner(System.in);
        System.out.println("请输入用户名");
        String username = input.next();
        System.out.println("请输入用户密码");
        String password = input.next();
        //2.调用方法
        boolean flag = new Test().login(username,password);
        //3.判断结果并输出
        if(flag)
            System.out.println("登陆成功!");
        else
            System.out.println("密码或用户名错误!");
    }

    //登陆方法
    public boolean login(String username, String password) {
        if(username == null || password == null) {
            return false;
        }

        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        try {
            con = JDBCUtil.getConnection();
            String sql = "select * from user where username='"+username+"'and password='"+password+"'";
            st = con.createStatement();
            rs = st.executeQuery(sql);
            return rs.next();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtil.closeAll(rs,st,con);
        }
        return false;
    }
    
}

PreparedStatement类(Statement子类):

  1. SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串拼接,会造成安全性问题
  •  	1.任意输入用户名,输入密码:a' or 'a' = 'a
    
  1. 解决sql注入问题:使用 PreparedStatement 对象解决
  2. 预编译的Sql:参数使用 ? 作为占位符
  3. 步骤:
  •  	定义sql时使用 ?作为占位符
     	例:`select * from user where username=? and password=?`
     	
     	给 ?赋值
         1.参数1:?的位置编号,从1开始
     	 2.参数2:?的值
    
	   con = JDBCUtil.getConnection();
       String sql = "select * from user where username=? and password=?";
       pst = con.prepareStatement(sql);
       pst.setString(1,username);
       pst.setString(2,password);
       rs = pst.executeQuery();

JDBC控制事务:

  1. 事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个事务要么同时成功,要么同时失败。
  2. 操作
  •  	1.开启事务setAutoCommit(boolean autoCommit):调用同时设置false,即开启事务
     	2.提交事务:commit()
     	3.回滚事务:rollback()
    
  1. 使用Connection对象来管理事务
  •   		操作开始前开启事务
      		操作结束后提交事务
      		try/catch中回滚事务(一旦报错就会回滚事务)
    
    public void Turn(int idOut,int idIn,double change) {
        try {
            con = JDBCUtil.getConnection();

            //开启事务管理,禁止自动提交(默认自动提交)
            con.setAutoCommit(false);
            //捆绑转入转出操作
            //放置缓冲区,确定成功再修改数据库

            //SQL语句
            String sql = "update account set money=money+? where id=?";
            //转入操作
            pst = con.prepareStatement(sql);
            pst.setDouble(1,change);
            pst.setInt(2,idIn);
            pst.executeUpdate();
            //转出操作
            pst = con.prepareStatement(sql);
            pst.setDouble(1,-1*change);
            pst.setInt(2,idOut);
            pst.executeUpdate();

            con.commit();
            
        } catch (Exception e) {
            if(con != null) {
                try {
                    con.rollback();
                } catch (SQLException e1) {
                    e1.printStackTrace();
                }
            }
            e.printStackTrace();
        } finally {
            JDBCUtil.closeAll(null,pst,con);
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值