> 文档中心 > JDBC看这篇就够了

JDBC看这篇就够了


提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 

文章目录

  • 前言
  • 一、JDBC是什么?
  • 二、JDBC原理图
  • 三、JDBC的使用步骤
  • 总结

前言

学了Mysql数据库后,花了两天时间学习了一下JDBC的使用,这里整理了一下笔者对jdbc的理解(注:本文所有代码针对Mysql数据库进行编码)


提示:以下是本篇文章正文内容,下面案例可供参考

一、JDBC是什么?

JDBC是SUN公司制定的一套接口,接口都有调用者和实现者,面向接口调用、面向接口写实现类、这都属于面向接口编程。

二、JDBC原理图

JDBC API是一系列的接口,它统一和规范了应用程序与数据库的连接,执行SQL语句,并得到返回结果等各类操作,相关类和接口在java.sql和javax.sql包中

三、JDBC的使用步骤

JDBC导入mysql驱动文件

(1) 在Mysql官网下载相应的驱动jar包,根据自己使用的mysql版本选择合适的版本进行下载,如果是Mac本,选择tar.gz文件下载,如果是win系统,选择zip文件下载,最后进行解压即可

(2)在IEDA中导入驱动文件

然后选择 

这样就完成了对Mysql数据库驱动文件进行导入

四、JDBC编码步骤

1.注册驱动,获取连接

创建数据库连接的方式有五种,我简单的介绍一下

Driver接口的方法:

Connection connect(String url, Properties info)

尝试使数据库连接到给定的URL

返回的connect对象就是连接数据的对象

第一种方式:

public void connect01() throws SQLException { //注册驱动 Driver driver = new Driver(); //jdbc:mysql://是规定好的协议,localhost:3306代表本机 和监听的端口,xyx_db02表示连接到xyx_db02这张表 String url = "jdbc:mysql://localhost:3306/xyx_db02"; //将 用户名 和 密码 放入到 Properties 对象中 Properties properties = new Properties(); properties.setProperty("user","root"); //用户 ,properties(key,value) key是规定好的 "user" properties.setProperty("password","123"); //密码 Connection connect = driver.connect(url, properties); //返回一个连接 System.out.println(connect);    }

第二种方式:通过java的反射机制加载Driver类

public void connect02() throws Exception {//使用反射加载Driver类 ,动态加载,更加的灵活,减少依赖性 Class cls = Class.forName("com.mysql.jdbc.Driver");Driver driver = (Driver) cls.newInstance(); String url = "jdbc:mysql://localhost:3306/xyx_db02"; //将 用户名 和 密码 放入到 Properties 对象中 Properties properties = new Properties(); properties.setProperty("user","root"); //用户 ,properties(key,value) key是规定好的 "user" properties.setProperty("password","123"); //密码 Connection connect = driver.connect(url, properties); //返回一个连接 System.out.println("方式二"+connect);    }

第三种方式:通过 DriverManager类的registerDriver方法传入driver对象完成对数据库的连接

static Connection getConnection(String url, String user, String password)

尝试建立与给定数据库URL的连接

public void connect03() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {//使用反射加载Driver Class aClass = Class.forName("com.mysql.jdbc.Driver");Driver driver = (Driver) aClass.newInstance();//创建url 和 user 和password String url = "jdbc:mysql://localhost:3306/xyx_db02"; String user = "root"; String password = "xuyuxuan0724"; DriverManager.registerDriver(driver); //注册Driver驱动 Connection connection = DriverManager.getConnection(url, user, password); System.out.println("第三种方式= " + connection);    }

第四种方式:Class.forName()方法,自动完成注册驱动

public  void  connect4() throws ClassNotFoundException, SQLException {//com.mysql.jdbc.Driver//使用反射加载Driver类 Class.forName("com.mysql.jdbc.Driver"); //创建url 和 user 和password String url = "jdbc:mysql://localhost:3306/xyx_db02"; String user = "root"; String password = "xuyuxuan0724"; Connection connection = DriverManager.getConnection(url, user, password); System.out.println("第四种方式 = " +connection);    }

这里两点需要说明:

1.Mysql驱动5.1.6之后可以无需Class.forName("com.mysql.jdbc.Driver");

2.从jdk1.5使用了jdbc4,不再需要显示调用Class.forName()注册驱动,而是自动调用驱动jar包下META-INF\services\java.sql.Driver文本中的类名称去注册

第五种方式:写入配置文件,让mysql连接更灵活,减少代码冗余

 public void connect05() throws IOException, ClassNotFoundException, SQLException {//通过Properties对象获取相关配置文件的信息 Properties properties = new Properties(); properties.load( new FileInputStream("src//mysql.Properties")); //获取相关的值 String user = properties.getProperty("user"); String password = properties.getProperty("password"); String driver = properties.getProperty("driver"); String url = properties.getProperty("url"); Class.forName(driver); Connection connection = DriverManager.getConnection(url, user, password); System.out.println("方式五 " +connection);    }

DriverManager不调用registerDriver()方法传入driver是为什么?

是因为在类加载的时候,Driver类底层的static代码块中已经调用了该方法,是自动注册驱动

这里附上Driver类的底层源码:

public class Driver extends NonRegisteringDriver implements java.sql.Driver{ static { try{     java.sql.DriverManager.registerDriver(new Driver()); } catch(SQLException E) {     throw new RuntomeExceptione("Can't register driver!"); }    }

好了,相信小伙伴看到这里,对JDBC连接数据库的方式有了一个大概的认识,这里我们进入下一个步骤

2.组织SQL语句

 String sql = "Update  actor set name = '周星驰' "; //用于操作 sql语句 Statement statement = connect.createStatement(); // int rows = statement.executeUpdate(sql); //如果是 dml语句 返回的就是影响的行数 System.out.println(rows >0 ?"成功":"失败"); // 1

代码测试过,返回的是成功;

这里有一个问题,Statement类在开发中是不允许使用的,因为它存在一个SQL注入问题,我们来看一个典型的SQL注入问题:

如果我们使用select语句,这里会判断where后面的sql语句,我们原本想要查询的数据 name ='tom',pwd='123',而上图的sql语句就相当于写了个万能条件语句,name='1' 或者 pwd = ' 或者'1=1',这里显然是可以查询出我们想要的数据的,据说在2000年左右,因为sql注入问题让很多企业损失惨重,后面这个问题才被解决

这里我们介绍一下Statement类

Statement类

基本介绍:

1.用于执行静态Sql语句并返回其生成结果

2.在连接建立后,需要对数据库进行访问,执行命名或是SQL语句,可以通过Statement(存在SQL注入问题)PrepardStatement(预处理) CallableStatement(存储过程)

3.Statement对象执行SQL语句,存在SQL注入风险

4.SQL注入是利用某些系统没有对用户输入对数据进行充分对检查,而在用户输入数据中注入非法对SQL语句段或命令,恶意攻击数据库

5.要防范SQL注入,只要用PreparedStatement(从Statement扩展而来),取代Statement就可以了

聊到select语句,在这里介绍一下ResultSet类

ResultSet类

表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。

ResultSet对象保持一个光标指向其当前的数据行。 最初,光标位于第一行之前。 next方法将光标移动到下一行,并且由于在ResultSet对象中没有更多行时返回false ,因此可在while循环中使用循环来遍历结果集。

我们来看一下ResultSet底层

rows所有行,是一个ArrayList数组,internalRowDate是一个对象数组,每个对象数组包含各行的数据,比如说0对应的是49是id为1的ASCll码,1对应的name中的‘周星驰‘,UTF-8中每一个汉字占三个字节,所以对应了九个ascll码以此类推

由于只是测试,表我们已经建好了

mysql> select * from actor;+----+-----------+-----+---------------------+-------+| id | name      | sex     | borndate     | phone |+----+-----------+-----+---------------------+-------+|  1 | 周星驰     | 男      | 1970-11-11 00:00:00 | 110   ||  3 | 刘德华     | 男      | 1970-12-12 00:00:00 | 110   ||  4 | 吴孟达     | 男      | 1969-01-01 00:00:00 | 1231  |+----+-----------+-----+---------------------+-------+
 //1.注册驱动 Class.forName(driver); //2.得到连接 Connection connection = DriverManager.getConnection(url, user, password); //3.得到Statement Statement statement = connection.createStatement(); //4.组织sql语句 String sql = "select id,name,sex,borndate from actor"; //执行给定的sql语句,该语句返回单个 ResultSet对象 ResultSet resultSet = statement.executeQuery(sql); while (resultSet.next()){ //会让光标向后移动,如果没有更多行,则会返回false     int id =  resultSet.getInt(1);//获取该行第一列数据     String name = resultSet.getString(2); //获取该行第二列数据     String sex = resultSet.getString(3);//获取该行第三列数据     Date date = resultSet.getDate(4);     System.out.println(id+"\t"+name+"\t"+sex+"\t"+date); }

返回结果为:

3.关闭资源

在JDBC编码过程中,我们创建了resultSet,statement,connection等资源,这些资源在使用完毕后一定要进行关闭资源,关闭的过程中遵循从里到外的原则,因为在增删改查中的操作中都要用到这样的关闭操作

  resultSet.close(); statement.close(); connection.close();

下面附上关于select查询语句的完整代码:                                                                                                                                                

import java.io.FileInputStream;import java.sql.*;import java.util.Properties;@SuppressWarnings({"all"})public class ResultSet_ {    public static void main(String[] args) throws Exception { //通过Properties对象获取相关配置文件的信息 Properties properties = new Properties(); properties.load( new FileInputStream("src//mysql.Properties")); //获取相关的值 String user = properties.getProperty("user"); String password = properties.getProperty("password"); String driver = properties.getProperty("driver"); String url = properties.getProperty("url"); //1.注册驱动// Class.forName(driver); //2.得到连接 Connection connection = DriverManager.getConnection(url, user, password); //3.得到Statement Statement statement = connection.createStatement(); //4.组织sql语句 String sql = "select id,name,sex,borndate from actor"; //执行给定的sql语句,该语句返回单个 ResultSet对象 ResultSet resultSet = statement.executeQuery(sql); //5.使用while取出数据 /*     mysql> select * from actor;     +----+-----------+-----+---------------------+-------+     | id | name      | sex     | borndate     | phone |     +----+-----------+-----+---------------------+-------+     |  1 | 周星驰     | 男      | 1970-11-11 00:00:00 | 110   |     |  3 | 刘德华     | 男      | 1970-12-12 00:00:00 | 110   |     |  4 | 吴孟达     | 男      | 1969-01-01 00:00:00 | 1231  |     +----+-----------+-----+---------------------+-------+  */ while (resultSet.next()){ //会让光标向后移动,如果没有更多行,则会返回false     int id =  resultSet.getInt(1);//获取该行第一列数据     String name = resultSet.getString(2); //获取该行第二列数据     String sex = resultSet.getString(3);//获取该行第三列数据     Date date = resultSet.getDate(4);     System.out.println(id+"\t"+name+"\t"+sex+"\t"+date); } //6.关闭资源 resultSet.close(); statement.close(); connection.close();    }}

JDBC编程的内容就这些了,如果你已经全部掌握,还有事务,获取自增,连接池等等内容可以自行了解一下 

K歌软件