JDBC连接MySQL/SQL注入
一、JDBC连接MySQL: 1.添加驱动:mysql-connector-java-5.1.47.jar 2.创建连接: (1)加载驱动:Class.forName("com.mysql.jdbc.Driver"); //jdk1.6以后无需再加载驱动;再引用库META-INF下会自动加载,但是web项目还是要加载; (2)获取连接对象:DriverManager.getConnection(url,user,password); 3.创建SQL语句: 4.发送sql到数据库; 5.执行sql语句; 6.获取返回的结果: 1)DQL返回查询的结果集; 2)DML返回影响的行数; 3)DDL返回0; 7.处理结果; 8.释放资源:Connection.close();Statement.close(); public class Test { public static void main(String[] args) throws Exception { // 1、加载驱动 //把com.mysql.jdbc.Driver这份字节码加载进JVM //当一份字节码被加载到JVMs时,就会执行该字节码中的静态代码块 Class.forName("com.mysql.jdbc.Driver"); // 2、创建连接 String url = "jdbc:mysql://localhost:3306/test"; String user = "root"; String password = "000000"; Connection conn = DriverManager.getConnection(url,password); // 3、创建sql String sql = "select * from user"; Statement st = conn.createStatement(); // 4、执行sql ResultSet resultSet = st.executeQuery(sql); // 5、处理返回结果while (resultSet.next()){ System.out.println(resultSet.getString("name")); } // 6、关闭资源 st.close(); conn.close(); } } 二、JDBC常用类: 资源关闭:ResultSet,Statement,Connection的顺序执行close; 1.DriverManager类:管理一组 JDBC 驱动程序的基本服务;Driver的子类; 方法:static Connection?getConnection(String url,String user,String password);//返回Connection接口; 1)String url="jdbc:mysql://localhost:3306/test"; 2)String url="jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&setCharacterEncoding=utf8"; //??屏蔽SSL的警告;??解决乱码; 3)String url="jdbc:mysql:///test?useSSL=false&serverTimezone=UTC";//8.0新版本; 2.Connection接口: 方法: (1)Statement?createStatement();//创建一个 Statement 对象来将 SQL 语句发送到数据库。 (2)PreparedStatement?prepareStatement(String sql); //创建一个?PreparedStatement 对象来将参数化的?SQL?语句发送到数据库。 (3)close(); 3.Statement接口:用于执行静态 SQL 语句并返回它所生成结果的对象。 方法: (1)int?executeUpdate(String sql);//执行DDL和DML语句;DML返回影响的行数;DDL返回0; (2)ResultSet executeQuery(String sql);//执行DQL语句;返回 ResultSet结果集; (3)close(); 4.ResultSet接口: 方法: (1)boolean next();光标向后移动一行;//类似迭代器的hasnext(); (2)XXX?getXXX(int columnIndex);//一般不使用; //通过字段位置获取值; (3)void?close(); (4)XXX?getXXX(String columnLabel); //通过字段名获取值; 5.PreparedStatement:表示预编译的 SQL 语句的对象。 参数:所有的通过外部传入的参数使用?代替;?--->占位符; //String sql = "delete from student where sid = ?"; ?替换占位符方法:void?setXXX(int parameterIndex,XXX x); //int parameterIndex:占位符的下标,下标从1开始;需要和sql中?的顺序一一对应; //XXX x:替换占位符的具体的数据类型; 方法: (1)int?executeUpdate();//执行DDL和DML语句;DML返回影响的行数;DDL返回0; (2)ResultSet executeQuery();//执行DQL语句;返回 ResultSet结果集; //无需传入sql参数,在创建对象时已经传入,并且预编译; (3)close(); public class Test { public static void main(String[] args) throws Exception { // 1、加载驱动 //把com.mysql.jdbc.Driver这份字节码加载进JVM //当一份字节码被加载到JVMs时,就会执行该字节码中的静态代码块 Class.forName("com.mysql.jdbc.Driver"); // 2、创建连接 String url = "jdbc:mysql://localhost:3306/test"; String user = "root"; String password = "000000"; Connection conn = DriverManager.getConnection(url,password); // 3、创建sql String sql = "select * from user where name = ?"; PreparedStatement prepareStatement = conn.prepareStatement(sql); prepareStatement.setString(1,"ls"); // 4、执行sql ResultSet resultSet = prepareStatement.executeQuery(); // 5、处理返回结果 while (resultSet.next()) { System.out.println(resultSet.getString("name")); } // 6、关闭资源 prepareStatement.close(); conn.close(); } } 三、SQL注入: 1、sql注入: 正常代码:sid:001 ??----> delete from student where sid = "001"; 问题代码:sid:999 or 1=1 ??-----> delete from student where sid = "999"?or 1=1; //delete from student;等于删除整表; 解决后代码:sid:999 or 1=1 ??-----> delete from student where sid = "999 or 1=1"; 2、解决办法:PreparedStatement;//Statement的子接口; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |