JDBC,即Java Database Connectivity,java数据库连接。是一种用于执行SQL语句的Java API,它是Java中的数据库连接规范。这个API由 java.sql.,javax.sql. 包中的一些类和接口组成,它为Java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问。
由于MySQL是一个CS(client/sever)结构的系统,即需要客户端和服务器交互的系统。若不使用MySQL的客户端,我们需要自己通过代码来实现MySQL客户端来代替MySQL自带的客户端。但是客户端不是凭空产生的,真正要我们去实现是很复杂的。因此数据库会提供一些API(application programming interface)来方便我们去实现。
数据库的种类有很多,例如MySQL、Oracle、SQL Sever 等等,它们提供的API各不相同,API实际上不是真正的接口,它是一组函数/类/方法 让用户去使用,在此处,接口是一个非常广义的概念,它跟Java语法中的接口没有直接关系。
正是因为不同的数据库提供的API各不相同,因此Java中引入了JDBC,它能够将不同数据库提供的API都转化为Java中为我们提供的API——JDBC,它相当于涵盖了各种数据库操作的操作方式,把不同数据库的API给统一到了一起。
但是将不同数据库的API都转换为JDBC,需要一个“中间转换器”,这个中间转换器就是数据库驱动程序,它能把不同种类的API转换成JDBC风格的API。就好比先前有很多格式的充电头,若到现在,可以用“转接头”来换我们手机的插头接口。那么数据库驱动程序就是“转接头”。
不同的数据库需要分别提供不同的驱动程序,在Java中这样的驱动程序是一个独立的“jar包”。这个jar包是发布Java程序常见方式。未编译的程序是.java文件,编译后变为.class文件。jar包里面都是一些.class文件(类似于.rar/.zip),将这些.class文件打成一个压缩包。
需要的驱动程序可以到maven仓库官网中去下载:maven仓库官方地址
但是mysql jdbc driver的版本是非常多的,下载的jar包版本必须要和你的mysql服务器版本一致。mysql服务器的版本查看方式:
查找“服务”,找到MySQL服务器,点击属性:
MySQL的版本为5.7,那么可以在官网中下载5.几的版本都可以。
要想使用jar包,就需要把jar包中导入到IDEA中,让代码能够访问到jar中的类。
a) 先在主文件上创建一个Directory
b) 创建好Directory之后,将我们的jar包复制粘贴到该Directory中,粘贴只需将光标点中创建的Directory包后ctrl+v复制即可。
c) 配置项目的一些属性,让项目能够找到jar包。
选择现在文件路径下的文件夹即可。
还有另外一种方法,右键新创建的Directory,add as library,再点击ok即可。
如果在代码中能够访问到jar包中的类,就算添加成功。
例如:在MySQL客户端中在某个数据库中已经创建好Student表的情况下:
下面的注释根据这个代码来解释的。
public class Test {
public static void main(String[] args) throws SQLException {
// 1.创建DataSource对象(DataSource对象生命周期应该是要跟随整个程序)
DataSource dataSource = new MysqlDataSource();
//接下来需要针对dataSource进行一些配置,以便后面能够顺利的访问到数据库服务器
//主要配置三方面信息,URL,USER,PASSWORD,需要向下转型(父类引用转换为子类引用的实例)
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/student?characterEncoding=utf-8&useSSL=true");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("111111");
//2.和数据库建立连接,建立好连接之后就可以进行后续的数据传输了
// 建立连接的意义是为了验证当前的网络通信是否正常
// 如果不正常就会抛出SQLException异常
// connection对象生命周期应该是较短的,每个请求创建一个新的connection
Connection connection = dataSource.getConnection();
//3.拼装SQL语句,用到PrepareStatement对象
// 先以插入数据为例
// 当前示例中要插入的数据内容都是写死的,其实也可以让程序在运行时获取到
// 动态地拼接上去
int id = 1;
String name = "曹操";
int classId = 10;
//?是一个占位符,可以把具体的变量的值替换到?位置
String sql = "insert into student values(?,?,?)";
PreparedStatement statement = connection.prepareStatement(sql);
//1,2,3相当于?的下标(从1开始算)
statement.setInt(1,id);
statement.setString(2,name);
statement.setInt(3,classId);
System.out.println("statement: "+ statement);
//4.拼装完毕之后,可以执行SQL了
//insert delete update都是使用executeUpdate方法来执行
//select就使用executeQuery来执行
//返回值表示此次操作修改了多少行
int ret = statement.executeUpdate();
System.out.println("ret: "+ret);
//5.执行完毕后,关闭释放相关资源
//一定是后创建的被释放,顺序不能搞错
statement.close();
connection.close();
}
}
a) DataSource dataSource = new MysqlDataSource();
中DataSource是Java自带的类,但MysqlDataSource
是jar包中的类,因此如果导入成功才能真正导入它。
注:dataSource的生命周期应该是要跟随整个程序的。
b) ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/student?characterEncoding=utf-8&useSSL=true");
解释如下:
注意:在MySQL自带的数据库中需要创建好student名字的数据库,并且还需要创建好student名字的表才能成功执行。
在写characterEncoding字符集时,即使my.ini文件配置的是utf8
mb4,也要写为utf-8,否则会执行错误。因为JDBC要兼容多种数据库,而utf8mb4编码是MySQL独有的。
每个标点符号的顺序和个数都不能打错!!
c) ((MysqlDataSource)dataSource).setUser("root"); ((MysqlDataSource)dataSource).setPassword("111111");
第一行输入的是用户名,每个电脑上的用户名都是不变的——root。
第二行输入的是密码。
注意:两行中的形成都是字符串的形式,因此要带上双引号。
d) Connection connection = dataSource.getConnection();
通过dataSource来获取Connection对象,Connection就是为了测试当前是否准备就绪,能否进行后续的通信。因此当连接失败时,编译器能够告诉你那么就通过抛出异常来处理。
注意:
1.Connection是连接的意思,不能写作链接(Link)。
2. 在导入Connection类中注意不要导错包,需要导的包是java.sql中的包。
核心就是根据不同的场景拼装成不同的SQL,其它逻辑都基本上不发生变化。
public class JDBCSelect {
public static void main(String[] args) throws SQLException {
// 1.创建DataSource对象(DataSource对象生命周期应该是要跟随整个程序)
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/student?characterEncoding=utf-8&useSSL=true");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("111111");
//2.创建Connection对象,和数据库建立连接
Connection connection = dataSource.getConnection();
String sql = "select * from student";
//3.借助PrepareStatement拼装SQL语句
PreparedStatement statement = connection.prepareStatement(sql);
//4.执行 SQL 语句
ResultSet resultSet = statement.executeQuery();
//5.遍历结果集,遍历过程和使用迭代器遍历集合类有点相似
// 结果集相当于一张表,这个表里面有很多行,每一行是一条记录(又包含很多列)
// next()一方面是判定当前释放存在下一行,另一方面如果存在下一行就获取到这一行
// 可以直观的把 resultSet 对象想成一个”光标“
while(resultSet.next()) {
//resultSet 的光标指向了当前行,就可以把当前行中的列数据都获取到
//当前表中的每一行包含三个列,id,name,classId,可以根据列名来获取对应的列数据,此处参数中的写的列名必须和数据库表中的列名完全一致,顺序可以不同
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
int classId = resultSet.getInt("classId");
System.out.println("id:"+id+" name:"+name+" classId:"+classId);
}
//6.关闭资源,后创建的对象先关闭
resultSet.close();
statement.close();
connection.close();
}
}
resultSet的next方法可以这样理解:
在Java JDBC编程中对数据库的操作均使用JDK自带的API统一处理,通常与特定数据库的驱动类是完全解耦的。所以掌握Java JDBC API (位于 java.sql 包下) 即可掌握Java数据库编程。
DataSource用于配置如何连接MySQL。
Connection接口实现类由数据库提供,获取Connection对象通常有两种方式:
// 加载JDBC驱动程序
Class.forName("com.mysql.jdbc.Driver");
// 创建数据库连接
Connection connection = DriverManager.getConnection(url);
DataSource ds = new MysqlDataSource();
((MysqlDataSource) ds).setUrl("jdbc:mysql://127.0.0.1:3306/student?characterEncoding=utf-8&useSSL=true");
((MysqlDataSource) ds).setUser("root");
((MysqlDataSource) ds).setPassword("111111");
Connection connection = ds.getConnection();
PreparedStatement对应到一个SQL语句。
主要掌握两种执行SQL的方法:
ResultSet表示select查找的结果的结果集。
ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet的next()方法 ,如果我们想要得到ResultSet里的所有记录,就应该使用while循环。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/ZJRUIII/article/details/122993355
内容来源于网络,如有侵权,请联系作者删除!