专栏目录
基本概念
JDBC编程就是通过Java代码来操作数据库
api
数据库是一个类别:MySQL,Oracle,sql server,sqlite
代码操作数据库的前提:数据库提供api,我们要调用api才能完成操作
(api:application programming interface 应用程序调用接口,就是一些实现好的类和方法)
(只要是基于某个东西来编程,就需要这个东西提供api)
如果某个东西提供的api特别多,就会把这个东西叫做SDK
我们平时说的JDK就是JAVA SDK(Java开发工具包)
每个数据库软件的api不同,但是Java把这些api重新封装,形成一套api的标准,程序员就不需要再关心数据库的api差异了😊
安装JDBC
1)引入mysql的jdbc驱动包
这种驱动包属于第三方库,JDK里面是没有的
我们可以到Java世界里的中央仓库里面获取Maven 存储库:搜索/浏览/探索 (mvnrepository.com)
第一个是更高版本的驱动包,第二个是低版本的
我们选择第二个就好了
因为我的MySQL服务器用的是5的,所以这里也要用5系列的驱动包
下载下来的是.jar的文件,本质上是一个压缩包,主要是存放Java程序编译文件.class文件
左边的.pom文件是maven项目的配置文件,不用理他
2)把jar包引入到项目中
随便在项目中创建一个目录,把jar包拷贝进去
再点击add as library就好了
编写JDBC代码
第一步
数据库是服务器,服务器可能在你的主机上,也可能在其他主机上,所以我们要明确服务器的位置
一般都是用ip地址+端口号+数据库名 来定位的
ip地址是用来描述一个主机在网路上的位置,往往由一串数字构成
一般用环回ip:127.0.0.1 (表示主机)来进行举例
端口号:区分不同的服务程序,相当于快递包裹里的手机号(MySQL默认端口号3306)
java
//1.创建数据源,数据源描述了你要操作的数据库在哪里
DataSource dataSource = new MysqlDataSource();
DataSource是JDBC提供的接口,MysqlDataSource是MySQL驱动包提供的
实现类提供的方法
当然下面这种写法也没问题
但是业内一般用第一种方法,原因:
拓展:低耦合,高内聚
耦合:两个东西之间的关联关系,关联越紧密,耦合就越高
代码耦合高了,后面改某个代码前面的代码就容易出bug
内聚:把有关系的代码放到一起,不要放的东一处西一处的低内聚:某个功能的代码会散落在各个地方
高内聚:把有关联的代码放到一起
返回我们刚刚的代码
这里的url可以不用记,password就是你数据库的密码
java
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/javasql?characterEncoding=tuf8&&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("1234");
第二步
java
//2.和数据库服务器建立连接
Connection connection = dataSource.getConnection();
这里的建立连接是抽象连接,通信双方保存各自的信息而已
注意:这里的Connection要用第一个
第三步
java
//3.构造一个sql,需要把sql转成String对象
String sql = "insert into student values(1,'张三')";
PreparedStatement statement = connection.prepareStatement(sql);
PreparedStatement:prepared表示预处理过的,已经解析的sql语句
通过控制台写sql,是先把sql发给服务器,服务器解析并执行的
statement也差不多
但是PreparedStatement可以在客户端这边先提前把sql解析好,把解析后的结果发给服务器,服务器的开销就大幅度降低了
第四步
java
//4.把构造好的sql发送给服务器执行
int n = statement.executeUpdate();
System.out.println("n= " + n);
此时代码会构造一个网络请求,发送给mysql服务器,这个代码相当于扮演了mysql客户端的角色
等待服务器的相应数据,把得到的相应最终显示在控制台上
第五步
java
//5.释放必要的资源
statement.close();
connection.close();
这两个对象内部有一些计算机的重要软/硬件资源,需要释放
⚠释放的顺序与创建的顺序相反
程序执行之后我们就能在我们学生表里看见变化了
而itellij里面打印的
表示有1行受到影响
整个的代码
java
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class TestJDBC {
public static void main(String[] args) throws SQLException {
//1.创建数据源,数据源描述了你要操作的数据库在哪里
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/javasql?characterEncoding=utf8&&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("1234");
//2.和数据库服务器建立连接
Connection connection = dataSource.getConnection();
//3.构造一个sql,需要把sql转成String对象
String sql = "insert into student values(2,'李四')";
PreparedStatement statement = connection.prepareStatement(sql);
//4.把构造好的sql发送给服务器执行
int n = statement.executeUpdate();
System.out.println("n= " + n);
//5.释放必要的资源
statement.close();
connection.close();
}
}
修改代码
上面的代码里的sql指令是写死的,也就是说,要想插入其他数据就需要修改代码,重新编译!
一般程序员写的代码要打包发给用户,每个用户要修改需求就要你修改代码里的sql语句,这样会很麻烦
所以我们要让用户输入信息
java
Scanner scanner = new Scanner(System.in);
System.out.println("请输入学号:");
int id = scanner.nextInt();
System.out.println("请输入姓名:");
String name = scanner.next();
//3.构造一个sql,需要把sql转成String对象
String sql = "insert into student values(" + id + ",'" + name + "')";
这种字符串拼接很丑陋,而且有sql注入攻击的风险
如果用户不好好输入name,他直接给你输入什么); drop database....
那完蛋了你的数据库可能就被端了
我们换种写法
这里的?作为占位符,然后用下面的setInt和setString方法分别把这两个?号的位置填上
这样写比较安全
插入,修改,删除的jdbc代码其实完全一样
查询的就不太一样,因为查询会有一个返回的结果集合(临时表)
查询的代码
前面的操作差不多,到了第四步执行,我们用类似迭代器遍历的方式遍历每行数据
这里的ResultSet就是结果集合,代表查询返回的临时表
这个循环来遍历这张表,想象初始情况下,光标指向第一行上的第一个位置,每次调用next(),光标就会往下走一行
整个执行代码
java
//执行sql
ResultSet resultSet = statement.executeQuery();
while(resultSet.next()){
//获取"id"这一列的数值
int id = resultSet.getInt("id");
//获取"name"这一列的数值
String name = resultSet.getString("name");
System.out.println("id: "+id);
System.out.println("name: "+name);
}