JDBC是什么?
这工作中我们针对数据库的操作,实际上很少会用到SQL语句,通过命令行/图形化来操作数据库,更多的是通过主流的编程语言来对数据库进行操作,即使通过代码来操作数据,我们还是会使用到SQL语句,所以掌握SQL语句也是很重要的.
如何通过代码操作数据库?
通过代码操作数据库,前提是,数据库需要提供一组API,供其他程序调用,
什么是API(application programming interface)(非常常见)
在编程中,写代码不是从0开始,会调用别人已经写好的代码,我们称之为"库",这些代码里就提供的一些 类/方法/函数 就可以称为API.
JDBC的由来
数据库这样的软件也会提供API供其他人使用,但是数据库有很多种,比如Oracle,MySQL等等,这些数据库提供的API都不一样,每个数据库都有自己的一套API,对于程序员来说,没切换一个数据库,就要重新学习一套API准则,所以为了有一套标准的数据库API体系,Java自身制定了一套准则,各种数据库都要把自己的API转化成和Java这一套兼容的API,Java针对数据库提供API称之为JDBC
如何把MySQL的API转化成兼容JDBC的API
MySQL官方提供了一个mysql-connector(这个不是mysql自带的,也不是java自带的,需要通过第三方途径,把这个东西下载下并且导入到自己的项目中 )这个东西,就可以完成转换,
mysql-connector,把MySQL的原生api转化成Java的api,通过下载第三方库(Java中后缀通常是jar)的插件,我们也称之jar包
怎么使用JDBC呢
1)下载jar包
2)将jar包导入到自己的项目中
a) 先在项目中创建一个目录,名字随便取,但是不要带有中午/特殊字符,
创建一个Director目录,名字一般取成lib(library)在编程中是库的意思
b)创建好目录以后直接选中jar包,将其直接复制给目录文件中去
c)右键lib目录,add as library (告诉idea 这lib是一个"库"目录)
点击Add as Library
在点击ok就大功告成了
此时导完包,idea就可以自动识别jar包里都有啥,上述操作就是导入jar的基本操作
如何通过代码来操作JDBC的api呢?
其实有一点小难度,首先需要创建一个数据源对象,因为MySQL是客户端-服务器,
1.创建数据源对象
数据源对象描述了数据从哪里来,数据库服务器所在的位置,我们来看一下DataSource(Java标准库JDBC自带的接口)的源码
它是一个interface接口类型,所以我们要实例化它,就不能通过new来实例化,只能通过new实现他的子类来实例化对象
我们通过new MysqlDataSource()来实例化,使用Mysql就是这个,使用其他的数据库前面就是其他数据库的名字,导入其他的jar包即可
创建好对象之后就需要给对象设置必要的属性
1)数据库服务器在哪 2)访问数据库的账户是啥3)访问数据库的密码是啥
上述的几个操作都是在DataSource的子类中才有,本身是没有这个方法和属性的
第一行代码采用了向上转型()
为了设置属性,下面的三行代码向下转型
理解一下高耦合:一个模块出现问题会对其他模块造成很大的影响
低耦合:一个模块出现问题对其他模块造成很小的影响
内聚:是不是把有关联的东西放在一起,放的越集中,就称之为高内聚,反之内聚越低
低内聚: 写代码的时候,某个功能,可能需要很多代码配合完成,这些代码零散出现在你的工程中,想找到很费劲,(写代码时很不好的习惯)
写代码我们要追求高内聚,低耦合为的是以后方便维护代码
2.和数据库服务器进行网络连接
URL:称为"唯一资源定位符",用来描述网络资源上的位置,数据库也可以理解成网络资源
上述操作都是为数据源对象设置基本属性,接下来就要开始进行数据库服务器的网络链接
会报错误,我们就需要看是什么错误
受查类异常,我们要么通过throw向上抛出异常,要么通过catch来捕捉异常,
在main函数后面加入一个这样的语句来解决报错,
dataSource.getConnection(),会返回一个Connection类型的对象,这个对象一定要选择正确Java.sql
此处建立连接不一定会成功,有很多种错误,
可能是有(数据库的ip/端口号/数据库名/相关参数/用户名密码)
数据库连接失败常见的报错
密码错误
数据库名字错误
连接失败(可能是端口出错,也有可能是ip错了,服务器没有正常运行,根据具体情况来分析)
3.通过程序构造sql语句
通过程序构造sql语句,我们基于PreparedStatement这个类来实现,在编程中翻译为预处理语句,正常来说在cmd敲得sql语句,是把sql发送到mysql服务器MySQL服务器负责解析,解析完成后执行,因为解析工作需要消耗资源,而且MySQL是一个客户端-服务器,同一时刻要给多个客户端提供服务,解析工作积少成多,也会比较消耗资源,我们就可以把解析工作放到客户端来进行解析(自己写的代码),客户端发sql之前把解析工作完成,就可以降低服务器的压力了
通过connection返回的对象
4.把sql上传到服务器进行执行
第一个主要进行的是查询操作,第二个进行的是更新操作(delete,update,create table)
5.进行资源的释放
通过调用close方法进行资源的释放,要与创建的顺序相反
上述在代码中写sql语句就直接把代码写死了,为了让代码更加灵活,我们可以使用Scanner包,进行键盘录入,?一个?就相当于是一个占位符类似于C语言中的%d的操作,可以通过set后面加上替换的类型来进行替换顺序是从1开始的
查询操作使用到一个ResultSet的集合类