026_jdbc-mysql-PrepareStatement解决sql注入

本文详细介绍了如何在JDBC中使用PreparedStatement进行参数化查询,防止SQL注入,包括登录验证、注册、密码修改和用户管理。通过实例演示了PreparedStatement在执行插入、更新和删除操作中的应用,并展示了如何实现UserDao接口及其实现类UserDaoImpl的安全操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 新建一个JDBCPrepareStatement工程, 使用我们之前的JDBCUtil.java和jdbc.properties属性文件

2. PreparedStatement对象相比较以前的Statement对象, 预先处理给定的sql语句, 对其执行语法检查。 在sql语句里面使用?占位符来替代后续要传递进来的变量。后面不管传递什么进来, 都把它看成是字符串, 不会产生任何的关键字。

3. 使用PreparedStatement对象编写程序

4. 输入任意用户名和密码, 并且sql注入, 登录失败

5. 使用正确的用户名和密码, 登录成功

6. 使用PreparedStatement对象进行插入操作

7. 使用PreparedStatement对象进行更新操作

8. 使用PreparedStatement对象进行删除操作

9. 使用PreparedStatement对象查找所有用户

10. UserDao.java接口代码

package com.lywgames.dao;

public interface UserDao {
	/**
	 * 用户登录方法
	 * @param username
	 * @param password
	 */
	public void login(String username, String password);
	/**
	 * 注册新用户
	 * @param username
	 * @param password
	 * @param registertime
	 */
	public void register(String username, String password, long registertime);
	/**
	 * 修改密码
	 * @param username
	 * @param password
	 */
	public void modifyPassword(String username, String password);
	/**
	 * 删除用户
	 * @param username
	 */
	public void deleteUser(String username);
	/**
	 * 查找所有用户
	 */
	public void findAll();
}

11. UserDaoImpl.java完整代码

package com.lywgames.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import com.lywgames.dao.UserDao;
import com.lywgames.util.JDBCUtil;

public class UserDaoImpl implements UserDao {
	public void login(String username, String password) {
		Connection conn = null; 
//		Statement st = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		try {
			// 1.获取连接对象
			conn = JDBCUtil.getConn(); 
			/**
			 *	// 2.创建statement, 跟数据库打交道, 一定需要这个对象
			 *	st = conn.createStatement();
			 *	// 3.执行查询sql, 获取ResultSet结果集
			 *	rs = st.executeQuery("select * from user where username='"+ username  +"' and password='"+ password +"'");
			 **/
			// 2.PreparedStatement对象相比较以前的Statement对象, 预先处理给定的sql语句, 对其执行语法检查。 在sql语句里面使用?占位符来替代后续要传递进来的变量。
			// 后面不管传递什么进来, 都把它看成是字符串, 不会产生任何的关键字。
			ps = conn.prepareStatement("select * from user where username=?and password=?");
			// 给占位符赋值, 位置从1开始
			ps.setString(1, username);
			ps.setString(2, password);
			// 3.执行查询
			rs = ps.executeQuery();
			// 4.使用ResultSet结果集遍历
			if(rs.next()){
				System.out.println("登录成功");
			}else{
				System.out.println("登录失败");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 5.释放资源
			JDBCUtil.release(conn, ps, rs);
		}
	}

	@Override
	public void register(String username, String password, long registertime) {
		Connection conn = null; 
		PreparedStatement ps = null;
		
		try {
			// 1.获取连接对象
			conn = JDBCUtil.getConn(); 
			// 2.PreparedStatement对象相比较以前的Statement对象, 预先处理给定的sql语句, 对其执行语法检查。 在sql语句里面使用?占位符来替代后续要传递进来的变量。
			// 后面不管传递什么进来, 都把它看成是字符串, 不会产生任何的关键字。
			ps = conn.prepareStatement("insert into user (username,password,registertime) values (?,?,?)");
			// 给占位符赋值, 位置从1开始
			ps.setString(1, username);
			ps.setString(2, password);
			ps.setTimestamp(3, new Timestamp(registertime));
			// 3.执行更新
			ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 4.释放资源
			JDBCUtil.release(conn, ps);
		}
	}

	@Override
	public void modifyPassword(String username, String password) {
		Connection conn = null; 
		PreparedStatement ps = null;
		
		try {
			// 1.获取连接对象
			conn = JDBCUtil.getConn(); 
			// 2.PreparedStatement对象相比较以前的Statement对象, 预先处理给定的sql语句, 对其执行语法检查。 在sql语句里面使用?占位符来替代后续要传递进来的变量。
			// 后面不管传递什么进来, 都把它看成是字符串, 不会产生任何的关键字。
			ps = conn.prepareStatement("update user set password=? where username=?");
			// 给占位符赋值, 位置从1开始
			ps.setString(1, password);
			ps.setString(2, username);
			// 3.执行更新
			ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 4.释放资源
			JDBCUtil.release(conn, ps);
		}
	}

	@Override
	public void deleteUser(String username) {
		Connection conn = null; 
		PreparedStatement ps = null;
		
		try {
			// 1.获取连接对象
			conn = JDBCUtil.getConn(); 
			// 2.PreparedStatement对象相比较以前的Statement对象, 预先处理给定的sql语句, 对其执行语法检查。 在sql语句里面使用?占位符来替代后续要传递进来的变量。
			// 后面不管传递什么进来, 都把它看成是字符串, 不会产生任何的关键字。
			ps = conn.prepareStatement("delete from user where username=?");
			// 给占位符赋值, 位置从1开始
			ps.setString(1, username);
			// 3.执行更新
			ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 4.释放资源
			JDBCUtil.release(conn, ps);
		}
	}

	@Override
	public void findAll() {
		Connection conn = null; 
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		try {
			// 1.获取连接对象
			conn = JDBCUtil.getConn(); 
			// 2.PreparedStatement对象相比较以前的Statement对象, 预先处理给定的sql语句, 对其执行语法检查。 在sql语句里面使用?占位符来替代后续要传递进来的变量。
			// 后面不管传递什么进来, 都把它看成是字符串, 不会产生任何的关键字。
			ps = conn.prepareStatement("select * from user");
			// 3.执行查询
			rs = ps.executeQuery();
			// 4.使用ResultSet结果集遍历
			while(rs.next()){
				System.out.println(rs.getInt(1) + " " + rs.getString(2) + " " + rs.getString(3) + " " + rs.getTimestamp(4));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 5.释放资源
			JDBCUtil.release(conn, ps, rs);
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值