Mysql回顾

上次写的笔记全部丢失,因为没有保存,我们程序员宝宝真的要记住啊,一定要保存!保存!保存!
重新来过()

public User login(int userid, String password) {//用户登录
		
	

	String sql = "select * from user  where user_id='"+userid+"' and user_pw='"+password+"' ";		
		//System.out.println(sql);

		Connection conn=null;//声明数据库连接对象
		Statement stmt=null;//声明
		ResultSet rs =null;//声明结果集,以上声明是为了后面的释放资源
		

		try
		{
		
			conn = JdbcUtil.getConnection();//获取数据库连接
			stmt = conn.createStatement();//创建对象
			rs  = stmt.executeQuery(sql);//执行SQL语句放入结果集
			if(rs.next()){
				User user = new User();
				
				user.setUser_id(rs.getInt("user_id"));
				user.setUser_name(rs.getString("user_name"));
				user.setUser_pw(rs.getString("user_pw"));
				user.setUser_realname(rs.getString("user_realname"));
				user.setUser_sex(rs.getString("user_sex"));
				user.setUser_tel(rs.getString("user_tel"));
				user.setUser_email(rs.getString("user_email"));
				
				return user;
				//(rs.getString("birthday"));	
			}
			return null;
			
		}
		catch(Exception e)
		{
			throw new RuntimeException(e);//抛出异常,不影响程序运行
			
		}
		finally
		{
			JdbcUtil.release(rs, stmt, conn);//关闭连接,释放资源
			
		}
	}

以这个为例吧,感觉这里面知识点还挺多的,对于我这种小菜鸟来说,首先是这段代码使用Statement,他不能避免SQL注入,并且每次执行都需要编译SQL语句,效率低下。如果将密码改成”03 or 1=1“ 将不会起到验证的作用,对于所有的用户都可以进行成功登录。但是PreparedStatemen可以防止SQL注入,

Connection conn=null;
		PreparedStatement stmt=null;
		ResultSet rs =null;
		

		String sql = "select * from user where user_id= ? and user_pw=?;
		
		//System.out.println(sql);
		
		try
		{
				
			conn = JdbcUtil.getConnection();
			stmt = conn.prepareStatement(sql);
			
			stmt.setInt(1, userid);
			stmt.setInt(4, password);
			rs  = stmt.executeQuery();

这样改就可以有效避免SQL注入,因为这里有占位符规定了语句的结构,用户仅可以对于占位符 进行赋值,而不能改变结构。除此以外PreparedStatemen也可以进行预编译(不用改变一次参数就要重新编译整个sql语句,效率高)。
当然,还需要说一下statement的优势,更适用于程序中同一个查询只会进行一次网络到数据库的通讯,PreparedStatemen第一次执行消耗很高,更适用于多次操作。这个博主写的很详细,大家可以参考一下statement和PreparedStatemen的比较
再有就是 RuntimeException,用户可以选择性的进行异常处理,该异常会不断地向上一层一层抛出,好吧,这里说起来比较复杂,可以参考这个异常,吹爆这篇文章,写的很详细,大神们的解释真的太通透了。上一条代码,使用了再次抛出异常,原理如下
①为什么要再次抛出异常? 在本级中,只能处理一部分内容,有些处理需要在更高一级的环境中完成,所以应该再次抛出异常。这样可以使每级的异常处理器处理它能够处理的异常。
②异常处理流程 :对应与同一try块的catch块将被忽略,抛出的异常将进入更高的一级。
有异常这里使用try catch 来手动捕获异常,如果没有try catch就是自动捕获异常,处理由jvm来处理 。
资源释放就参考主要是我懒得打字了

你可能感兴趣的:(数据库,mysql)