JDBC练习_登录案例和JDBC事务管理
JDBC练习_登录案例
练习:
需求:
1.通过键盘录入用户名和密码
2.判断用户是否登录成功
"select * from user where username = " " and password = " " ";
如果这个sql有查询结果,则成功,反之则失败
步骤:
1.创建数据库表 user
-- JDBC练习表 CREATE TABLE USER( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(32), password VARCHAR(32) ); -- 查询 SELECT * FROM USER; -- 添加数据 INSERT INTO USER VALUES(NULL,'zhangsan','123'),(NULL,'lisi','234');
2.实现登录功能代码
public static void main(String[] args) { //1.键盘录入,接收用户名和密码 Scanner scanner = new Scanner(System.in); System.out.println("请输入用户名"); String username = scanner.nextLine(); System.out.println("请输入密码"); String password = scanner.nextLine(); //2.调用方法 boolean flag = new JdbcPractice8().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){// 有一个为空直接返回false return false; } Connection conn = null; Statement stmt = null; ResultSet rs = null; //连接数据库判断是否登录成功 try { //1.获取连接对象 conn = JDBCUtils.getConnection(); //2.获取执行sql语句 String sql = "select * from user where username = '"+username+"' and password = '"+password+"' "; //3.获取执行sql语句对象 stmt = conn.createStatement(); //4.执行sql语句 rs = stmt.executeQuery(sql); //5.判断 return rs.next();// 判断是否有下一行,有下一行返回true } catch (SQLException e) { e.printStackTrace(); }finally { //释放资源 JDBCUtils.close(rs, stmt, conn); } //没有则返回false return false; }
运行结果:

数据库:

JDBC事务管理
PreparedStatement:执行sql的对象
1.SQL注入问题:在拼接sql的特殊关键字参与字符串的拼接,会造成安全性问题
1.输入用户随便,输入密码:'a ' or 'a ' = 'a' (错误)sql
select * from user where username = 'sdadsadas' and password = 'a ' or 'a ' = 'a'
2.解决sql注入问题:使用PreparedStatement对象来解决
3.表示预编译的SQL语句的对象:参数使用?作为占位符
4.步骤:
1.导入驱动jar包:mysql-connector-java-5.1.37-bin.jar
2、注册驱动
3、获取数据库连接对象 Connection
4、定义sql
注意:sql的参数使用?作为占位符。如:select * from user where username = ? and password = ?;
5、获取执行sql语句的对象 PreparedStatement, Connection.prepareStatement(String sql);
6、给?赋值:
方法:setXxx(参数1,参数2)
参数1:? 的位置编号,从1开始
参数2:?的值
6、执行sql,接受返回结果
7、处理结果
8、释放资源
5.注意:后期都会使用PreparedStatement对象来完成增删改查的所有操作
为什么呢?:
1.可以防止SQL注入
2.效率更高
public static void main(String[] args) { //1.键盘录入,接收用户名和密码 Scanner scanner = new Scanner(System.in); System.out.println("请输入用户名"); String username = scanner.nextLine(); System.out.println("请输入密码"); String password = scanner.nextLine(); //2.调用方法 boolean flag = new JdbcPractice8().login2(username, password); //3.判断结果,输出不同语句 if (flag){ System.out.println("登录成功"); }else { System.out.println("用户名或密码错误"); } }/** * 登录方法,使用PreparedStatement实现(PreparedStatement防止sql注入) */ public boolean login2(String username,String password){ if (username == null || password == null){// 有一个为空直接返回false return false; } //提升作用域 Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; //连接数据库判断是否登录成功 try { //1.获取连接对象 conn = JDBCUtils.getConnection(); //2.获取执行sql语句 String sql = "select * from user where username = ? and password = ? "; //3.获取执行sql语句对象(PreparedStatement对象) pstmt = conn.prepareStatement(sql); //给?赋值 pstmt.setString(1, username); pstmt.setString(2, password); //4.执行sql语句 rs = pstmt.executeQuery();// 子类 //5.判断 return rs.next();// 判断是否有下一行,有下一行返回true } catch (SQLException e) { e.printStackTrace(); }finally { //释放资源 JDBCUtils.close(rs, pstmt, conn); } //没有则返回false return false; }
运行结果:

 
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号