30.设置工具类(配置文件 Statement)
1.设置配置文件: 在SRC包设置文件《db.properties》 driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/demo1?useUnicode=true&characterEncoding=utf8&useSSL=true username=root password=121788
2.设置一个工具类: 名字叫做 《informationUtils》 package utils; import java.io.InputStream; import java.sql.*; import java.util.Properties; public class InformationUtils { // 提升作用域 private static String driver=null; private static String url=null; private static String username=null; private static String password=null; // 第一个被运行,而且只能运行一次 static { try{ // 1.获取配置文件的输入流 InputStream in = InformationUtils.class.getClassLoader().getResourceAsStream("db.properties"); // 2.创建一个对象 Properties properties = new Properties(); // 3.读取输入字节流 properties.load(in); // 4.获取文件里面的指定资源 driver=properties.getProperty("driver"); url=properties.getProperty("url"); username=properties.getProperty("username"); password=properties.getProperty("password"); // 5.驱动只用加载一次 Class.forName(driver); } catch (Exception e) { e.printStackTrace(); } } // 6.获取链接 public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url,username,password); } // 7.释放连接 public static void release(Connection connection, Statement statement, ResultSet resultSet){ if(resultSet!=null){ try { resultSet.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if(statement!=null){ try { statement.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if(connection!=null){ try { connection.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } }
3.进行引用工具类(方法实现) package utils; import java.sql.*; public class TestUtils { public static void main(String[] args) { // 增加变量的作用域 Connection connection=null; Statement statement=null; ResultSet resultSet=null; try { // 1.链接 connection=InformationUtils.getConnection(); // 2.获得执行sql的对象 statement=connection.createStatement(); String sql="insert into information values (4,'004','小黑',2,'个',2032,'李威涛','吉林',1235)"; int i=statement.executeUpdate(sql); if(i>0){ System.out.println("插入成功"); } } catch (SQLException throwables) { throwables.printStackTrace(); }finally { InformationUtils.release(connection,statement,resultSet); } } }
31.SQL注入问题(用户信息不安全)
SQL注入的发生,通常是恶意用户通过在表单中填写包含SQL关键字的数据,来使数据库执行非常规逻辑的过程。
1.当我们使用Statement这个对象的时候,我们在数据导入的时候可能会存在SQL注入 的问题,也就是说sql语句进行重新修改的问题.
package utils; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class SQL { public static void main(String[] args) { // 1.正常登入 // login("李明","121788"); login("'or '1=1","'or ' 1=1"); // login("'or 1 #'","2"); // } public static void login(String username,String password){ // 增加变量的作用域 Connection connection=null; Statement statement=null; ResultSet resultSet=null; try { // 1.链接 connection=InformationUtils.getConnection(); // 2.获得执行sql的对象 statement=connection.createStatement(); // select *from admin where name= or 1=1 and password= or 1=1; String sql="select *from admin where `name`='"+username+"' and `password`='"+password+"'"; resultSet=statement.executeQuery(sql); while (resultSet.next()){ System.out.println(resultSet.getInt(1)+" "+resultSet.getString(2)+" "+resultSet.getString(3)); } } catch (SQLException throwables) { throwables.printStackTrace(); }finally { InformationUtils.release(connection,statement,resultSet); } } }
1.实现对用户信息的全部查询的效果,导致用户信息的泄露(MD5)加密有用处了。
32.PreparedStatement
1.Statement与PreparedStatement的区别: (一)、格式: (1).前者: 驱动. 链接 .创建语句(createStatement) . 创建 sql语句. 把sql语句放入执行语句中. (2).后者: 驱动. 链接. 创建sql语句. sql语句放入preparedStatemnt(预编译). 进行执行. (二)、 进行插入和删除的时候: (1).前者直接写即可 (2).后者需要用?当占位符,然后进行 preparedStatemenr.setObject(?的坐标,数据)
1.进行查询的操作
package lesson2; import utils.InformationUtils; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class preST { private static Connection connection=null; private static PreparedStatement preparedStatement=null; private static ResultSet resultSet=null; public static void main(String[] args) { try { // 1.链接 connection= InformationUtils.getConnection(); // String sql="insert into admin value (?,?,md5(?))"; preparedStatement=connection.prepareStatement(sql); preparedStatement.setInt(1,4); preparedStatement.setString(2,"小明"); preparedStatement.setString(3,"123456"); int n= preparedStatement.executeUpdate(); if(n>0){ System.out.println("插入成功"); } } catch (Exception throwables) { throwables.printStackTrace(); }finally { InformationUtils.release(connection,preparedStatement,resultSet); } } }
2.使用md5格式进行密码的加密的操作:
3.解决SQL注入的问题:
1.正常输入无问题
2.非正常输入
33.数据库连接池(用户访问数量限制)
(一)、为什么要进行数据库连接池 1.数据库链接十分浪费资源。 (二)、什么是池化技术: 池化技术: 准备一些预先的资源,过来就链接预先准备好的。 eg:银行每天需要接纳很多客人,那么银行的门不能来一个开一次,走一个关一次, 所以我们因该设置接纳员进行等待,等待用户的到来,进行接纳。所以我们要设置 接纳员的个数,(最小连接数),(最多连接数),(常用连接数) (三)、编写连接池 实现一个接口DataSource(数据源) (1).常见开源数据库连接池:DBCP.C3P0. (2).使用了这些数据库连接池之后,我们就不用再进行手动编写了
1.DBCP (连接池)