目录
前言
每一个不同的数据库里面都有自己的API,像是主流的Oralce MySQL SQLserver
对于底层的程序员来说,程序员学数据库编程就需要学几套的API,提高了学习成本
所以有人需要站出来将这些API统一成标准,在JAVA中这个“人”就是JDBC
JDBC约定了数据库的API都有什么?应该怎么样使用?
但是却没有实现各个数据库里API的使用,所以就有了驱动包
由于JAVA的影响力很强大,所以各个数据库厂商为了适应JAVA纷纷提供了JDBC的驱动包
这个驱动包就是用来实现具体的底层数据库api的
所以我们程序员只需要学习JDBC这一套API就可以调用市面上所有数据库的API了
用一句话总结就是JDBC屏蔽了原生数据库api的差异,用统一的接口来规范了所有的数据库编程
1.下载对应的官方的数据库驱动包
关于MySQL的具体调用是这样的
由于前面所说JDBC只是约定了API的标准以及怎样使用,并没有具体实现
所以想要具体实现数据库API就得调用官方提供的驱动包
我们下载好以后先进入IDEA
然后在目录里面创建一个Directory
命名为lib,然后将驱动包复制到这里面
点击OK以后我们再将其作为库来导入
这样就完成官方驱动包作为库导入进IDEA了
此时IDEA就可以解析包里面的内容了
2.编写数据库程序
在编写代码之前首先需要准备好一个数据库和数据表
然后编写下列代码
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("111111");
第一段代码使用的是向上转型,通过这种方式我们来实例化对象
因为DataSource只是JDBC里面的接口,我们需要通过这种方式来也将类里面的方法具体实现
在第二行代码中
第一个 jdbc:mysql表示这个URL是给JDBC里面的MYSQL使用的
第二个 127.0.0.1表示IP地址,其中这个IP地址是一个特殊的IP,表示主机自己
第三个3306表示端口号,这个端口号是我们在安装MYSQL的时候默认设置的,这里写上是用来表示数据库在本地主机里面的地址
第四个java?characterEncoding = utf是表示数据库的名称以及使用的字符集
第五个SSL是一种加密方法,由于我们自己使用数据库不需要进行加密所以手动关闭了
所以这一行代码的意义就在于指定数据库所在的地址和端口以及所要使用的数据库名称
在第三行和第四行代码就是进行数据库的认证操作了
通过这四行代码我们就可以完成创建一个数据源的操作了
3.建立连接
Connection connection = dataSource.getConnection();
通过这行代码,我们才真正的将客户端和服务器进行网络连接了
这是会报一个受查异常
我们直接在main函数这里throw一个SQLExpection,将异常交给JVM来进行处理
4.构造SQL语句
我们进行一个插入的操作
第一行代码是描述我们要执行哪些SQL语句
第二行代码才是真正的执行这段SQL语句的
我们创建了一个字符串来表示我们要执行那些语句
然后将字符串传给connection这个方法帮助我们构造一个新的PrepareStatement对象
PrreparedStatement主要的工作是将SQL语句进行预处理(比如进行语法解析之类的事情)
之前我们直接使用命令行来写SQL语句是通过服务器来解析SQL的
现在我们直接通过这段代码来进行预处理了
5.执行SQL语句
我们针对增删改都是使用 excuteUpdate 来执行返回值是一个int类型的数据
代表的是有多少行数据收到了影响
针对查则是使用excuteQuery来执行
我们通过这段代码就可以给服务器发送网络请求了从而实现了服务器与客户端内容上的交互操作
同时这段代码是有返回值得,这个返回值表示这个操作影响了几行代码
int ret = preparedStatement.executeUpdate();
6.断开连接
根据前面所说,我们建立连接是找了个地方记录谁和谁进行连接了
那么我们在执行完我们得把连接断开并将之前得数据擦除
不进行断开 那么这块空间就一直记录着数据
我们每次建立新连接都要找新地方进行记录,久而久之就造成了内存泄露的问题
preparedStatement.close();
connection.close();
最后我们运行一下
动态的数据输入
我们在插入这里现在插入的数据是写死的,但是希望数据是动态输入的
那么我们可以通过这样的操作来完成数据的输入
Scanner scanner = new Scanner(System.in);
System.out.print("请输入你的学号");
int id = scanner.nextInt();
System.out.print("请输入你的姓名");
String name = scanner.next();
System.out.print("请输入你的班级");
String class1 = scanner.next();
String sql = "insert into student values("+id+",'"+name+"','"+class1+"')";
但这样却存在两点问题
一是代码很丑
二是容易遭到SQL的注入攻击
所以并不建议这么写
更加靠谱的方式是通过prepareStatement来通过占位符的方式实现动态的SQL构造
Scanner scanner = new Scanner(System.in);
System.out.print("请输入你的学号");
int id = scanner.nextInt();
System.out.print("请输入你的姓名");
String name = scanner.next();
System.out.print("请输入你的班级");
String class1 = scanner.next();
/* String sql = "insert into student values("+id+",'"+name+"','"+class1+"')";*/
String sql = "insert into student values(?,?,?)";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1,id);
preparedStatement.setString(2,name);
preparedStatement.setString(3,class1);
System.out.println("sql"+preparedStatement);
?表示我们以后要通过代码来把这块地方给填充
后面就是调用prepareStatement语句来进行填充
每个数字表示要占用哪个问号的地方
最后我们运行一下就可以发现我们写的 ? 的地方已经被填充且顺利的插入完毕了
查询的操作
查询的操作前面是一样的,从构造SQL才出现了不同
String sql = "select * from student";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()){
//next相当于光标向下移动一次
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
String class1 = resultSet.getString("class");
System.out.println(id+" : "+name+" : "+class1);
}
resultSet.close();
preparedStatement.close();
connection.close();
前面提到查询在执行SQL语句使用的是 executeQuery 并且返回值是Resultset
这个返回值的意思顾名思义是结果集合的意思
在while语句里面的判断条件的next相当于是一个光标不断地指向下一个数据,直到返回false为止
当光标指向哪一行数据的时候我们就需要把相应数据的列名给获取到位
比如id是int值那么我们就用result方法的getInt来获取int数据
并且创建一个变量名接受获取到的数据
最后我们将数据进行打印即可
运行结果如下
我们可以修改sql语句来达到我们想要的结果
比如我想要一个id= 1的数据
那么只需要修改sql就能实现
String sql = "select * from student where id = 1";
运行结果如下
我们在JAVA里面写SQL的主要目的是在于解放人的生产力
不再重复的写相对固定的SQL语句,让JDBC帮我们把重复的工作完成
从而提高了人的工作效率
学习JDBC的意义在于
我们的各种框架一直在变更但是我们JDBC却是恒定不变的
当我们在使用框架的时候发现难以达到自己想要的目的的时候
我们可以基于JDBC进行修改框架达到自己想要的效果