一、jdbc简介
JDBC是java用于连接数据库的api,数据库软件有多种,像MySQL,SQLsever,Oracle等数据库,这些数据库都是由不同的团队开发的,所以相同的功能的api的名字不同,当一个后端工程需要切换一个数据库软件时,就需要改写后端的大量跟数据库相关的代码,非常麻烦,所以Java自己提供了一套JDBC来兼容所有的数据库操作,各个厂商也根据Java的JDBC的api提供了自家数据库的驱动包,这样就是的JDBC编写时,只需要下载对应数据库的驱动包,就能使用同一套api操作不同的数据软件。
二、引入数据库驱动包
有两种办法
- 直接下载
- 在Maven仓库搜索Mysql
- 选择和数据库版本匹配的数据库驱动包
- 点击jar直接下载好驱动包
- 下载好之后在jdbc项目下面新建一个lib目录,将下载好的驱动包移动到目录下
- 在Maven仓库搜索Mysql
- 创建maven项目引入依赖(和之前的Maven项目引入依赖步骤一样创建maven项目引入依赖)
三、基本api介绍
- DataSourse接口
这是一个描述一个数据库的接口,这个接口是java自带的,它实例化需要数据库驱动包提供的实现了这个接口的DataSource类,本文使用的MySQL驱动包,所以对应的类名叫做MySQLDataSource。
创建好这个DataSource之后要让这个DataSource和想要操作的数据库关联起来,所以给它赋值这个数据库的对应信息。这些信息就包括,数据库用户名(user),数据库密码(password),数据库的位置信息(url)。
用户名只要不去改,自动就是数据库生成的root,password就是每次运行数据库需要输入的密码,这两个是登录数据库的钥匙,url则描述了数据库到底是在网络上的那个位置。这个url和http中的url的结构是一样的。jdbc:mysql://127.0.0.1:3306/jdbc?characterEncoding=utf8&useSSL=false
- jdbc:mysql
jdbc的版本,此时jdbc使用的是mysql驱动版。 - 127.0.0.1:3306
因为是操作的本机的数据库,所以此时的ip地址是127.0.0.1,冒号后面的端口号是3306,MySQL数据库默认使用的就是3306端口。 - /jdbc
数据库路径,选中的jdbc这个数据库,这个库要首先自己创建好。
4.?后面的就是一些配置信息
characterEncoding=utf8表示字符集使用utf8字符集
useSSL=false表示不使用加密传输
两者之间用&隔开。
- jdbc:mysql
- Connection类
Connection是连接类,它抽象出了连接池中的连接,在实例化了DataSource,明确了目标数据库的各种信息之后,jdbc就会创建连接池,连接池会进行多个连接,当需要使用连接时,就用getConnection方法取出一个连接。然后就可以使用取出的连接进行消息的传递了。
- Statement接口
Statement是用来处理sql语句的类,主要使用两个它的子类,PreparedStatement和Statement。
其中PreparedStatement会对sql语句进行预处理,statement不会。
因为sql语句是字符串,距离真正数据库能执行的命令还需要被解析,而服务器需要接收四面八方传来的sql语句,所以一般客户端在发送sql语句时,要先对sql语句进行解析,将解析后的命令发送给服务器,从而减轻服务器的负担。所以一般Statement不建议使用
实例化PreparedStatement时需要传入String类型的sql语句。 - executeUpdate和executeQuery方法
executeUpdate是提交sql语句到服务器,并且返回一个int类型的数表示sql语句影响了几行。(适合delete,create,insert等)
executeQuery是提交sql语句到服务器,并获取到服务器返回的结果,用resultSet类来接收。(适合select)
- 参数化的sql语句
可以用?来代替sql语句中的参数。
通过下标来选中第几个?(下标是从1开始的),并且用方法名setInt,setString来表示插入的参数的类型。
构造好之后就可以用executeQuery或者executeUpdate来提交代码。
可以多次设置不同的值,来实现不同的提交语句 - 资源回收(close)
connection和statement都需要在不使用之后对其进行关闭,如果一个connection要多次发送不同sql语句,就要产生多个statement,每个statement都会占用一定资源,需要显示的关闭。
connection在不使用之后也要显示的关闭,归还连接池中的连接。connection关闭之后与之关联的statement都会自动关闭。