jdbc之问号占位符的详细分析
目录
- 前言
- 实战
前言
先写sql语句框架
- 一个问号代表一个占位符,之后占位符接收一个值
- 占位符不可使用双引号或者单引号
- 获取占位符,给占位符传值,通过setString等方法
之所以要用问号占位符,在发送sql语句框架给DBMS,DBMS对sql语句框架进行预编译。
如果没有用占位符,正常执行编译信息,如果含有sql关键字,会将其编译,而执行有bug,出现sql注入等情况程序执行到此处,会发送
主要结合jdbc中的步骤
改掉某个步骤
如代码所示
// 3、获取预编译的数据库操作对象
// sql语句的框架中,一个?,表示一个占位符,一个?将来接收一个值。注意:?不要用单引号括起来
String sql = "select * from t_user where userName = ? and userPassword = ?";
// 程序执行到此处,会发送sql语句框架给DBMS,DBMS对sql语句框架进行预编译。
ps = conn.prepareStatement(sql);
// 给占位符?传值,第一个?的下标是1,第二个?的下标是2(JDBC中下标都从1开始)
ps.setString(1,userLoginInfo.get("userName"));
ps.setString(2,userLoginInfo.get("userPassword"));
// 4、执行sql语句
rs = ps.executeQuery();
实战
通过结合jdbc的实战代码进行加深巩固
package ustc.java.jdbc;import java.sql.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;public class JDBCTest07 {public static void main(String[] args) {// 初始化界面Map<String,String> userLoginInfo = initUI();// 验证用户名和密码boolean loginSuccess = login(userLoginInfo);// 输出最后结果System.out.println(loginSuccess ? "登录成功" : "登录失败");}/*** 用户登录* @param userLoginInfo 用户登录信息* @return true表示登录成功,false表示登录失败*/private static boolean login(Map<String, String> userLoginInfo) {boolean loginSuccess = false;Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try {// 1、注册驱动Class.forName("com.mysql.jdbc.Driver");// 2、获取连接conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase","root","146");// 3、获取预编译的数据库操作对象// sql语句的框架中,一个?,表示一个占位符,一个?将来接收一个值。注意:?不要用单引号括起来String sql = "select * from t_user where userName = ? and userPassword = ?";// 程序执行到此处,会发送sql语句框架给DBMS,DBMS对sql语句框架进行预编译。ps = conn.prepareStatement(sql);// 给占位符?传值,第一个?的下标是1,第二个?的下标是2(JDBC中下标都从1开始)ps.setString(1,userLoginInfo.get("userName"));ps.setString(2,userLoginInfo.get("userPassword"));// 4、执行sql语句rs = ps.executeQuery();// 5、处理结果集if(rs.next()) {loginSuccess = true;}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException throwables) {throwables.printStackTrace();} finally {// 6、释放资源if (rs != null) {try {rs.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if (ps != null) {try {ps.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if (conn != null) {try {conn.close();} catch (SQLException throwables) {throwables.printStackTrace();}}}return loginSuccess;}/*** 初试化界面* @return 用户输入的用户名和密码等登录信息*/private static Map<String, String> initUI() {Scanner s = new Scanner(System.in);System.out.print("请输入用户:");String userName = s.nextLine();System.out.print("请输入密码:");String userPassword = s.nextLine();Map<String,String> userLoginInfo = new HashMap<>();userLoginInfo.put("userName",userName);userLoginInfo.put("userPassword",userPassword);return userLoginInfo;}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
