MySQL:JDBC
什么是JDBC?
JDBC( Java DataBase Connectivity ) 称为 Java数据库连接 ,它是一种用于数据库访问的应用程序 API ,由一组用Java语言编写的类和接口组成,有了JDBC就可以 用统一的语法对多种关系数据库进行访问,而不用担心其数据库操作语言的差异 。 有了JDBC,就不必为访问Mysql数据库专门写一个程序,为访问Oracle又专门写一个程序等等。
为什么要有JDBC?
看看大佬的回答:
第一 :JDBC是Java中操作数据库数据的规范,注意是规范和标准,除此之外别无它号,即使Hibernite,Batis 也是要建立在JDBC基础上的。JDBC定义了如何链接数据库(Connection),如何操作数据(ResultSet,Stement)和事务管理(Transcation ,SavePoint...),JDBC具体的实现是由数据库厂商或第三方提供。
第二: 理论上说,不用JDBC也可以直接操作数据库,但是很多情况下这些东西是无法实现的,比如在链接一个数据库时厂商会对通讯协议中的部分内容保密仅提供数据库驱动,很难查找到相关的资料,即使有也会涉及到版权这些问题。除此之外上层的数据操作接口也要重新定义和编写。
JDBC工作原理
既然JDBC主要是用于java连接数据库的,能连接什么数据库没有指定,其实能连接很多种数据库,而且一般来说可以连接oracle和mysql,通常也是这两种。但是既然JDBC能连接这么多的数据库,开发起来太麻烦了,于是sun公司那帮人想出了一个办法,我定义一套规则,大家都按照这个规则来,实现自己公司访问数据库的实现。这套规则就是JDBC,遵循了JDBC规范的,可以访问自己数据库的API被称之为驱动。
JDBC是不动的,但是驱动包有很多种。
如何链接JDBC
首先需要下载驱动包
Java驱动包一般在该网站中下载:maven中央仓库
Maven Repository: (mvnrepository.com)
在搜索框中输入你想下载的驱动包:
如图:
点进去以后:
注意要下载与你MySQL版本相同(大版本)的驱动包,否则就会报错;
中间的红色是说该版本有缺陷,黑客可以通过该缺陷攻击你的数据库,但是我们初学者没必要慌,咱数据库随便他们偷!
下载完以后,打开编译器,创建一个 lib 包:
然后将下载的驱动包直接用鼠标拖进来就可以了。
然后右键点击add as library :
这样idea就可以识别目录中的 jar 包了,从而调用里面的类来编写代码。
包中类/接口,如下图:
准备工作完成,接下来就可以正式开始写代码了;
JDBC完成开发需要如下几个步骤来操作:
- 遍历并初始化一个数据源
- 和数据库服务器建立链接
- 构造MySQL语句
- 执行MySQL语句
- 释放必要资源
1. 遍历并初始化一个数据源
我们需要创建一个数据源:
该数据源来自我们下载的驱动包:
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java_107_3?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("");
为什么我们要这么做,我们不能创建一个MysqlDataSource()拿 MysqlDataSource 类型来接收吗?
当然可以,这样后面也就不用再向下转型了,这样还更方便了。
但是上面代码为啥要这么写呢?
主要是大家都这么写,体现接口的统一性。
我们来看看每一句数据源的含义:
setUrl("jdbc:mysql://127.0.0.1:3306/java_107_3?characterEncoding=utf8&useSSL=false")
setUser("root")
setPassword("")
2. 和数据库建立链接
Connection connection = dataSource.getConnection();//注意包要导对:java.sql.Connection
getConnection 方法好多包中有存在,但是我们需要 sql 包下的方法。
注意:
这里包一个异常需要抛出。
3. 构造MySQL语句
即使使用代码来操作数据库仍然需要使用mysql语句来构造。
String sql = "insert into student values(1,'张三')";
PreparedStatement statement = connection.prepareStatement(sql);
切记,构造时要确保该表存在。
PreparedStatement statement = connection.prepareStatement(sql);
该语句是对mysql语句进行预编译,
如果请求是sql 字符串,服务器是可以处理的,服务器就需要对其解析并执行,但是如果大量数据同时发起请求,那么服务器压力就会非常大。
那么进行一个预编译就会减小服务器的压力。
preparestatement
1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程
2.使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处。
3.statement每次执行sql语句,相关数据库都要执行sql语句的编译,preparedstatement是预编译得, preparedstatement支持批处理。
当你需要执行Statement对象多次的时候,PreparedStatement对象将会大大降低运行时间,当然也加快了访问数据库的速度。
这种转换也给你带来很大的便利,不必重复SQL语句的句法,而只需更改其中变量的值,便可重新执行SQL语句。选择PreparedStatement对象与否,在于相同句法的SQL语句是否执行了多次,而且两次之间的差别仅仅是变量的不同。如果仅仅执行了一次的话,它应该和普通的对象毫无差异,体现不出它预编译的优越性。
来自:preparestatement的用法-百度知了好学
4. 执行MySQL语句
int ret = statement.executeUpdate();
System.out.println("ret = " + ret);
statement.executeUpdate();
预编译过的sql语句发送给服务端,服务端作出相应,返回值为 int类型;其含义为:sql语句所影响的行数。
5. 释放必要资源
//5. 释放必要资源
statement.close();
connection.close();
谁后创建,谁先释放。
释放完资源这样简单的JDBC链接就完成了。
修改sql构造语句
但是显然我们整个过程还是有缺陷的。
看下图:
这里直接将sql语句写死了,无法灵活改变,改写法可读性差,且易被sql注入
所以我们还需要在这里进一步改变。
我们在这里改为从控制台读取输入信息,再通过拼装功能来完成对构造。
虽然这样解决了以上问题,但是明显不好写,并且容易写错,那么我们可以通过PreparedStatement拼装功能来实现。
代码如下:
//3. 从控制台读取用户输入内容
System.out.println("请输入学生学号");
int id = scanner.nextInt();
System.out.println("请输入学生名字");
String name = scanner.next();
//4. 构造MySQL语句
String sql = "insert into student values(?,?)";//'?' 表示一个占位符
PreparedStatement statement = connection.prepareStatement(sql);
//将占位符替换成指定的值
statement.setInt(1,id);//将第一个 '?' 替换为id
statement.setString(2,name);//将第二个 '?' 替换为name
// 打印需要加到拼凑之后
System.out.println(statement);
//5. 执行MySQL语句
int ret = statement.executeUpdate();
System.out.println("ret = " + ret);
那么本章的JDBC就到这里了,MySQL也就结束了,下一章内容就要开始JavaEE 的内容,难度又是大幅度提升。