本文章所讲述的是使用Java来操作MySQL,Java是通过JDBC这样的技术来操作MySQL的。
🌴Java的数据库编程:JDBC
JDBC,即Java Database Connectivity,java数据库连接。是一种用于执行SQL语句的Java API,它是 Java中的数据库连接规范。这个API由 java.sql.*,javax.sql.* 包中的一些类和接口组成,它为Java 开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问。
所谓的API为应用程序编程接口(Application Progromming Interface),可简单的理解为成是"一组类"或者"一组方法",都是现成的,可以直接进行调用,就可以实现一些效果。
有的库,提供的API特别的多,形成了一系列的体系,这种情况,也可称为"SDK"-软件开发工具包
例如Java中的JDK就是一个SDK,只不过是给他起了个专属的名字,Java软件开发工具包
🌳JDBC工作原理
MySQL本事就提供了一组API供程序员调用,Oracle,SQL Server。SQLite....都提供了这样的API让程序员调用。
这些不同的数据库,提供的API是不同的。这就导致了一个程序员,如果在项目中用到的不同数据库,就需要学习掌握多分API的使用。此时Java就提供了一套API接口标准,你们都按照我这一套标准适配过来(每个数据库厂商写一些代码,按照Java这一套标准把原来自己的API封装一下),程序员就只需掌握Java这一套AP即可。也就是JDBC。
JDBC 为多种关系数据库提供了统一访问方式,作为特定厂商数据库访问API的一种高级抽象,它主要包含一些通用的接口类
JDBC访问数据库层次结构:
详细结构:
JDBC优势:
- Java语言访问数据库操作完全面向抽象接口编程
- 开发数据库应用不用限定在特定数据库厂商的API
- 程序的可移植性大大增强
🎄建立数据库连接
🚩下载mysql驱动包
JDBC是Java标准库提供的,你只要安装了JDK就自带了JDBC,但是,使用JDBC操作mysql就需要下载并导入mysql的驱动包。
mysql驱动包下载链接:
Maven Repository: Search/Browse/Explore (mvnrepository.com)
进入网站后,搜索mysql,点击红框里的内容:
进去后下面有很多MySQL的版本,以下图中的版本随便哪个都可以使用:
选择你所需要的版本,我选择了5.1.49版本:
点击下载后得到一个 .jar的文件(类似.rar文件,里面包含了很多.class文件),找到你下载的包
🚩导入项目
mysql驱动包下载之后,还需要将这个 .jar文件导入到项目中。
新建项目中创建一个目录,用于存放 .jar文件:
将你刚才所下载的 .jar文件拷贝到该目录下:
右击lib目录,选择Add as Library,告诉idea说,当前这个目录是存放第三方库的目录,此时idea就能够正确识别到咱们拷贝进来的驱动包了
点击之后,选择OK,此时就添加完成了。
上述操作编写JDBC程序的准备工作!
🚩编写代码
接下来通过JDBC进行一个简单的插入数据操作,要想编写JDBC,还需要准备好数据库和数据表,虽然JDBC也能进行建表操作,但是一般都是提前手动建立好的。
🏀DataSource(数据源)-获取对象
数据源描述了你要操作的数据库在哪里,在MySQL就需要设定好,MySQL服务器的位置,要访问的是数据库名字,以及访问数据库的用户名和密码。
DataSource就是JDBC中提供的一个接口,它是不能直接new实例的,需要new一个实现了这个接口的类的实例。
写法一:以下这个过程就是所谓的数据库厂商写的代码和JDBC进行对接,也就是让数据库厂商,实现JDBC中提供的DataSource接口,进一步的去实现接口中的抽象方法
写法二:
两种用法没有什么区别,只是存在两种写法,只不过第一种写法是向上转型,第二种直接创建一个原生的MysqlDataSource,严格来说,两种写法本质上没什么区别。在Java中,更多人喜欢第一种,认为这样写的代码,更便于代码和数据库之间"解耦合"(降低耦合),未来有一天若要重masql更变为Oracle,第一种代码写法,改动成本低一些。
我们常说,写程序追求"高内聚""低耦合":
"低耦合":写代码时,有很多模块,如果一个模块修改了代码,对别的模块影响小就叫"低耦合";如果影响很大就叫"高耦合"。
"高内聚":代码中,实现某个功能的时候,如果和这个功能相关的代码,是集中放在一起的,就认为是"高内聚";如果是散落在项目的各个文件,各个角落中就认为是"低内聚"。
写法一由于使用的是向上转型,即调用MysqlDataSource的setUrl方法需要向下转型,写法二则不用。
url参数解释(唯一资源定位符):
MySQL是一个客户端-服务器程序,服务器就是保存数据本体的,咱们当前写的JDBC代码,就是在写一个MySQL客户端(之前使用的cmd黑框是mysql自带的客户端),我们也可通过Java代码通过jdbc自己实现客户端,我们自己实现的客户端就需要通过网络访问到数据库服务器进行增删改查,要想访问数据库服务器就需要知道服务器的地址,url就描述了服务器在网络中的地址。
上述除了设置url,还要设置数据库的用户名和密码
🏀数据库连接Connection
getConnection有一个返回值,为Connection
在使用Connection时,一定要使用java.sql这个包底下的,其他的都不行!!!
整体代码:
这个Connection对象就表示,客户端和服务器之间的连接对象,就可以通过这个连接对象来完成后续的操作。
🌲Statement对象
将你写好的字符串sql语句,转换成JDBC能够识别的语句对象,也就是Statement。
注意:Statement是一个接口,不能直接实例化。所以我们一般使用的是PreparedStatement,Statement仅仅是一个普通的语句对象,而PreparedStatement是一个带有"预编译"功能的语句对象。一个字符串sql发送到数据库服务器上,是要先对sql进行解析校验(判断当前sql是否符合要求),才能执行。
但是PreparedStatement也是一个接口,不能直接实例化,是通过Connection提供了PreparedStatement方法来构造。
上述过程,就是把一个字符串的sql,转成了语句对象(内部会对sql进行解析校验)。
这个操作就是把上述解析好的sql发送给数据库服务器,并且有一个int类型的返回值,表示影响到了几行数据
整体代码:
执行结果: 数据库查询:
这些代码都是固定逻辑。
但是上述我们插入数据的内容,都是在代码中写死的,要想插入不同的数据,就需要修改代码,重新编译运行。很多时候是希望在程序运行时,让用户数输入要插入的数据。
代码:
执行结果: 数据库查询:
这种属于拼接字符串,确实可行,但是不推荐,不太安全,可能会引起sql注入攻击这样的漏洞。
比较推荐的是PreparedStatement提供的api来完成动态内容的设置。
代码:
执行结果:
🚩修改
代码:
执行结果: 数据库查询:
🚩查询
执行结果: