2018-08-07JDBC连接MySQL+增删改表格+SQL注入问题及其预处理对象PreparedStatement解决方案

如何使用MySQL连接驱动的Jar文件:

新建工程(JavaProject)-->在工程内新建文件夹OutSideJar(New一个Folder)-->将Jar包导入进来-->右键该Jar包BuildPath创建依赖-->右键该工程BuildPath处Configure BuildPath即可查看导入并且创建依赖的Jar包!

连接MySQL数据库具体步骤:

1.注册驱动.

//①注册驱动:告知JVM使用的是哪一个数据库的驱动!

//DriverManager.registerDriver(new Driver());

Class.forName("com.mysql.jdbc.Driver");

//②获得连接:使用JDBC中的类,完成对MySQL数据库的连接(导入SQL包)!

Connection Conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/FuXi?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE","root","0129");

//③获得语句执行平台:通过连接对象获取对SQL语句的执行者对象(导入SQL包)!

Statement Stm=Conn.createStatement();

//④执行sql语句使用执行者对象,向数据库执行SQL语句,获取到数据库的执行后的结果!

String testSql="INSERT INTO SORT(SNAME,DESC1) VALUES('娃娃','吃小孩')";

//用于执行增删改:

boolean Flag=Stm.execute(testSql);

System.out.println(Flag);

//用于查询:

//stm.executeQuery("SELECT * FROM SORT");

//⑤处理结果(针对于查询的操作)

//⑥释放资源

//调用一堆close()方法(原则:先开后关)!

Stm.close();

Conn.close();

// execute()用于增删改!executeQuery()用于查询!

JDBC介绍:

它由一组用Java语言编写的类和接口组成,是Java访问数据库的标准规范!

JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序!

JDBC需要连接驱动(实现类),驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信!

//示意图:

// JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成厂商提供!

//获取连接需要方法 DriverManager.getConnection(URL,UserName,PassWord),三个参数分别表示:

①   URL需要连接数据库的位置(网址)

②   USERNAME用户名

③   PassWord密码

SQL注入问题解释:

假设有登录案例SQL语句如下:

SELECT * FROM 用户表 WHERE NAME=用户输入的用户名 AND PASSWORD=用户输的密码

此时,当用户输入正确的账号与密码后,查询到了信息则让用户登录,但是当用户输入的账号为XXX密码为:XXX‘OR’1=1时,则真正执行的代码变为:

SELECT * FROM 用户表 WHERE NAME = ‘XXX’ AND PASSWORD =‘XXX’ OR 1=1

此时,上述查询语句时永远可以查询出结果的。那么用户就直接登录成功了,显然我们不希望看到这样的结果,这便是SQL注入问题。

解决方案:

预处理对象:PreparedStatement!

执行SQL语句:

int executeUpdate(); --执行insert update delete语句!

ResultSet executeQuery(); --执行select语句!

boolean execute(); --执行select返回true 执行其他的语句返回false!

设置实际参数使用setXXX();方法(XXX为数据类型)!

//示例代1:

Class.forName("com.mysql.jdbc.Driver");

         Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/FuXi?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE","root","0129");

         Statement stm=conn.createStatement();

         Scanner sc=new Scanner(System.in);

         System.out.println("请输入用户名:");

         String uname=sc.nextLine();

         System.out.println("请输入密码:");

         String upwd=sc.nextLine();

         ResultSet rst=stm.executeQuery("SELECT * FROM USER WHERE UNAME='"+uname+"'");

         while(rst.next()){

              System.out.print(rst.getInt("UID")+" ");

              System.out.print(rst.getString("UNAME")+" ");

              System.out.print(rst.getString("PWD")+" ");

              System.out.println();

         }

         rst.close();

         stm.close();

         conn.close();

//示例代码2:

Class.forName("com.mysql.jdbc.Driver");

         Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/FuXi?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE","root","0129");

         Scanner sc=new Scanner(System.in);

         System.out.println("请输入用户名:");

         String uname=sc.nextLine();

         System.out.println("请输入密码:");

         String upwd=sc.nextLine();

         String sql="SELECT * FROM USER WHERE UNAME=? AND PWD=?";

         PreparedStatement stm=conn.prepareStatement(sql);

         stm.setString(1,uname);

         stm.setString(2,upwd);

         ResultSet rst=stm.executeQuery();

         while(rst.next()){

              System.out.print(rst.getInt("UID")+" ");

              System.out.print(rst.getString("UNAME")+" ");

              System.out.print(rst.getString("PWD")+" ");

              System.out.println();

         }

         rst.close();

         stm.close();

         conn.close();

原文地址:https://www.cnblogs.com/postgredingdangniu/p/9437597.html