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,user,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, user, 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的子接口;