文章目录
一、JDBC是什么?
所谓的JDBC编程就是通过java代码来操作数据库。数据库编程是需要数据库服务器,提供一些API,供程序员调用。
JDBC全称为Java Database Connectivity,也就是数据库连接。是Java语言用于连接和操作数据库的标准API,相当于Java程序与数据库之间的“翻译官”,它是一套Java提供的标准接口(规则),让开发者能用统一的方式操作不同数据库(如MySQL、Oracle)。API全称为Application Programming Interface,也就是应用程序编程接口,主要是一组类或者函数提供给程序员,让程序员进行调用,完成一些功能。
为什么需要API呢?市面上有好几个数据库软件,你有你的语法方式,我有我的语法方式,那程序员使用java编程还需要每个软件都需要学习一下,太累了。为了统一,Java 定义了统一的 JDBC API 接口(如 Connection、Statement),要求数据库厂商提供符合该接口规范的驱动程序。驱动程序直接实现这些接口方法,并负责将 JDBC 调用转换为数据库的私有通信协议(如 MySQL 的 TCP/IP 协议)。程序员只需学习 JDBC 接口的使用方式,无需关注底层数据库差异,即可通过 Java 代码操作不同数据库。
简单的来说驱动程序就是一个翻译官,使用mysql给java发送数据,java看不懂,于是通过驱动程序翻译就能够使java看懂,同时Java进行编程,发送数据给mysql服务器,mysql服务器不了解,也是通过驱动程序进行翻译转换为命令驱动mysql进行操作。
二、JDBC编程
2.1 驱动安装
要想在程序中操作mysql就需要你先安装mysql的驱动包,并且要把驱动包引入到项目中去。
下载地址为:https://mvnrepository.com/
在这里需要注意mysql服务器是什么版本就下载哪个系列的驱动包。
在这里安装好后就会有一个jar包。
2.2 将jar包引入到项目中
首先建立一个工程项目,新建一个lib包,这个取名随意。
在这里将jar包复制到当前项目目录中。
将这个目录标记为库
2.3 代码阶段
新建一个java文件
2.3.1 创建数据源
先创建一个DateSource,描述数据源头==》描述数据库服务器所在的位置。也就是java想要跟数据库发送命令得知道数据库的在哪里。
但是Datesource是一个接口,也就是java的接口,那么接口就得使用类来实现,这里我们使用的是mysql服务器,就实例化一个mysql的数据库源头,这为什么这样做呢?就比如你的手机是苹果手机,我的是安卓手机,但是我只有一个头,那么需要插上我想要的接口头才能进行充电。同样的,java与mysql服务器进行接口连接,那么就需要适配mysql的接口头的样子,所以使用该类进行实例化。
DataSource dataSource = new MysqlDataSource();
有了这么一个接口对象,那么接下来就需要找到mysql服务器的位置,并且给哪个服务器发送密码都需要进行设置。
//指定位置
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
//指定用户
((MysqlDataSource)dataSource).setUser("root");
//指定密码
((MysqlDataSource)dataSource).setPassword("2222");
所谓的url是计算机中非常重要的概念,也就是人们日常所说的网址,表示网络上的资源位置。mysql是一个客户端服务器结构的程序,通过网络进行交互的。
2.3.2 建立连接
在这里找到了mysql服务器的位置,并找到那个服务器发送了密码,现在就需要建立连接。为什么要建立连接。就比如你打电话给马云,马云说谁啊不认识,挂了,还想要套我消息。然后你打给你好兄弟,他就知道这是你就接通了。这也是同样的原理,mysql服务器需要对你发送的数据进行校验,地址是不是对的,账户是不是对的,密码是否正确。如果错误就不接受,然后进行报错,也就是别人挂你电话的那句英文sorry什么的。
Connection connection = dataSource.getConnection();
2.3.3 构建一个sql
String sql = "insert into student values(1,'张三')";
PreparedStatement statement = connection.prepareStatement(sql);
在这里sql就是一个之前学习的sql语句了
prepared:准备好的/预处理的 statement:语句
其实也是有办法,把字符串格式的sql发给mysql服务器,但是这样做不好,字符串sql有可能是存在语法错误之类的mysql服务器就需要对sql进行解析和校验,mysql服务器服务于多个客户端,此时总的负担就很大
connection.prepareStatement预处理则是先解析检查sql,看看sql是不是有啥问题。解析完毕之后也会得到一个结构化数据,直接把解析好的结构化数据发给数据库服务器,服务器就省下了这部分解析的工作。
2.3.4 把sql发送给服务器
int n = statement.executeUpdate(sql);
把sql发给服务器,针对查询返回值是一个整数,n表示影响的行数。
使用java操作数据库有两种执行SQL的方法:
executeQuery() 方法执行后返回单个结果集的,通常用于select语句
executeUpdate()方法返回值是一个整数,指示受影响的行数,通常用于update、insert、delete
语句。是一个写的操作
statement.executeQuery();是关于读的操作,也就是查询都是通过这个进行查询。通过该方法进行查询返回的是一个结果集合。ResultSet对象它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法提供了对这些行中数据的访问。
ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet的next()方法 ,如果我们想要得到ResultSet里的所有记录,就应该使用while循环。得到结果集合需要使用next方法进行遍历,next方法原理和小编在数据结构中的顺序表所写的迭代器方法原理基本一致,大家可以去查看一下。
2.3.5 释放资源
释放资源(关闭结果集,命令,连接),在这里需要释放资源使用,你使用了接口需要对资源进行释放。
resultSet.close(); //如果使用了查询操作需要关闭该资源
statement.close();
connection.close();
三、使用java实现增删查改各个功能
3.1 插入方法
public class Insert {
public int id;
public String name;
public Insert() {
}
public void insert(int id,String name) throws SQLException {
this.id = id;
this.name = name;
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("1964732");
Connection connection = dataSource.getConnection();
String sql = "insert into student values(?,?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,id);
statement.setString(2,name);
System.out.println("statement =" + statement);
int n = statement.executeUpdate(); //针对insert,update,delete
System.out.println("共插入" + n + "条数据");
//关闭连接释放资源
statement.close();
connection.close();
}
}
3.2 删除方法
public class Delete {
public int id;
public String name;
public Delete() {
}
public void delete(int id) throws SQLException {
this.id = id;
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("1964732");
Connection connection = dataSource.getConnection();
String sql = "delete from student where id = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,id);
int i = statement.executeUpdate();
System.out.println("共删除 " + i + " 行");
statement.close();
connection.close();
}
public void deleteAll() throws SQLException {
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("1964732");
Connection connection = dataSource.getConnection();
String sql = "delete from student";
PreparedStatement statement = connection.prepareStatement(sql);
int i = statement.executeUpdate();
System.out.println("共删除 " + i + " 行");
statement.close();
connection.close();
}
}
3.3 查找方法
public class Select {
public int id;
public String name;
public Select() {
}
public void Select() throws SQLException {
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("1964732");
Connection connection = dataSource.getConnection();
String sql = "select * from student";
PreparedStatement statement = connection.prepareStatement(sql);
ResultSet resultSet = statement.executeQuery();
while(resultSet.next()) {
int id = resultSet.getInt(1);
String name = resultSet.getString(2);
System.out.println("id = " + id + ",name = " + name);
}
resultSet.close();
statement.close();
connection.close();
}
}