JDBC
1.概述
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。是Java访问数据库的标准规范
JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
JDBC需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。
2.原理
JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成厂商提供。
3.JDBC开发步骤
1.注册驱动.
告知JVM使用的是哪一个数据库的驱动
2.获得连接.
使用JDBC中的类,完成对MySQL数据库的连接
3.获得语句执行平台
通过连接对象获取对SQL语句的执行者对象
4.执行sql语句
使用执行者对象,向数据库执行SQL语句
获取到数据库的执行后的结果
5.处理结果
6.释放资源.
调用一堆close()方法
3.1导入驱动jar包
创建lib目录,用于存放当前项目需要的所有jar包,选择jar包,右键执行build path / Add to Build Path
3.2JDBC开发步骤代码
package com.oracle.demo1; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class demo01 { public static void main(String[] args) throws SQLException, ClassNotFoundException { // 1.注册驱动(反射的概念) //DriverManager.registerDriver(new Driver()); Class.forName("com.mysql.jdbc.Driver"); //2.获得连接 //url格式url="jdbc:mysql://主机:端口号/数据库名"; String url="jdbc:mysql://localhost:3306/demo_jdbc"; String username="root"; String password="123456"; Connection conn=DriverManager.getConnection(url, username, password); //3.获得语句执行平台 Statement sta=conn.createStatement(); //4.执行SQL语句 //String sql="INSERT INTO sort(sname,sprice,syear) VALUES ('中央空调',2000,10)"; String sql="update sort set sprice=33 where sid=2"; int row=sta.executeUpdate(sql); //5.处理结果集 System.out.println(row); //6.释放资源(先开的后关) sta.close(); conn.close(); } }
3.3SQL注入问题
假设有登录SQL语句如下
SELECT * FROM 用户表 WHERE NAME = 用户输入的用户名 AND PASSWORD = 用户输的密码;
此时,用户输入正确的用户名和密码,查询到了信息用户可以登录。但是当输入的帐号为XXX
密码为'XXX' OR 'a'='a'时,真正执行的代码变成了
SELECT * FROM 用户表 WHERE NAME = ‘XXX’ AND PASSWORD =’ XXX’ OR ’a’=’a’;
此时,用户不需要输入正确的用户名和密码也能登录成功。这便是SQL的注入问题。
为了解决这一问题,我们使用PreparedStatement来反注入。
3.4JDBC工具类
以后涉及数据库的增删改查操作,都会用到获得数据库连接操作。为了实现代码的重复利用,我们可以封装工具类JDBCUtil,用来提供获取连接对象的方法。代码如下
package com.oracle.demo2; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Scanner; public class Dbutil { private Dbutil() {} static Connection conn; static { try{ Class.forName("com.mysql.jdbc.Driver"); String url="jdbc:mysql://localhost:3306/demo_jdbc"; Scanner sc=new Scanner(System.in); String username="root"; String password="123456"; conn=DriverManager.getConnection(url,username,password); }catch(Exception ex){ throw new RuntimeException(ex+"数据库连接失败"); } } public static Connection getConn() { return conn; } public static void close(ResultSet rs,Statement sta,Connection conn){ if(rs!=null) { try { rs.close(); }catch(SQLException ex) {} } if(sta!=null) { try { sta.close(); }catch(SQLException ex) {} }if(conn!=null) { try { conn.close(); }catch(SQLException ex) {} } } public static void close(Statement sta,Connection conn){ if(sta!=null) { try { sta.close(); }catch(SQLException ex) {} }if(conn!=null) { try { conn.close(); }catch(SQLException ex) {} } } }