JDBC - PreparedStatement和Statement的区别

使用PreparedStatement的好处:

  1. 不再使用 + 拼接sql语句,减少语法错误,语义性强
  2. 将模板sql(固定的部分)和参数部分进行了分离,提高维护性
  3. 有效的解决了sql注入问题
    注入问题:比如下面的例子,使用Statement,用户输入username时,可能会输入一些特殊符号,尤其是双引号、单引号,系统将这些符号拼接到sql语句中,可能会导致sql语句出错,进而导致程序报错。
  4. 大大减少了编译次数,效率高
    比如下面例子中的登录验证。
    使用Statement,如果有10个人进行登录验证,程序就需要编译执行10次。
    PreparedStatement叫做预编译,模板一样,只会编译一次
public class TextPrepareStatement {
	//使用Statement实现登录
	public void testStatement() throws Exception{
		//-------------用户输入部分---------------
		Scanner input = new Scanner(System.in);
		System.out.println("请输入用户名:");
		String username = input.next();
		System.out.println("请输入密码:");
		String pwd = input.next();
		
		//-------------连接数据库步骤-------------
		Properties info = new Properties();
		info.load(new FileInputStream("src\\jdbc.properties"));
		String user = info.getProperty("name");
		String password = info.getProperty("password");
		String driver = info.getProperty("driver");
		String url = info.getProperty("url");
		//1. 加载驱动
		Class.forName(driver);
		//2. 获取连接
		Connection connection = DriverManager.getConnection(url, user, password);
		//3. 执行查询
		String sql = "SELECT COUNT(*) FROM admin WHERE username='"+username+"' AND PASSWORD='"+pwd+"'";
		Statement statement = connection.createStatement();
		ResultSet set = statement.executeQuery(sql);
		if(set.next()) {
			int count = set.getInt(1);
			System.out.println(count>0?"Login Success!":"Login Failure!");
			
		}
		//4. 关闭连接
		set.close();
		statement.close();
		connection.close();
	}
	
	//使用PreparedStatement实现登录
		public void testPreparedStatement() throws Exception{
			//-------------用户输入部分---------------
			Scanner input = new Scanner(System.in);
			System.out.println("请输入用户名:");
			String username = input.next();
			System.out.println("请输入密码:");
			String pwd = input.next();
			
			//-------------连接数据库步骤-------------
			Properties info = new Properties();
			info.load(new FileInputStream("src\\jdbc.properties"));
			String user = info.getProperty("name");
			String password = info.getProperty("password");
			String driver = info.getProperty("driver");
			String url = info.getProperty("url");
			//1. 加载驱动
			Class.forName(driver);
			//2. 获取连接
			Connection connection = DriverManager.getConnection(url, user, password);
			//3. 执行查询
			//3.1 编写sql
			String sql = "SELECT COUNT(*) FROM admin WHERE username=? AND PASSWORD=?";
			//3.2 获取PreparedStatement命令对象
			PreparedStatement statement = connection.prepareStatement(sql);
			//3.3 设置占位符的值
			statement.setString(1, username);
			statement.setString(2, pwd);
			//3.4 执行sql命令
//			int update = statement.executeUpdate(); //执行增删改,返回受影响的行数
			ResultSet set = statement.executeQuery(); //执行查询,返回结果集
			if(set.next()) {
				int count = set.getInt(1);
				System.out.println(count>0?"login success!":"login failure!");
			}
			//4. 关闭连接
			set.close();
			statement.close();
			connection.close();
		}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值