前言👀~
上一章我们介绍了数据库的索引与事务,本章节我们介绍JDBC编程,使用java代码和数据库打交道
如果各位对文章的内容感兴趣的话,请点点小赞,关注一手不迷路,如果内容有什么问题的话,欢迎各位评论纠正 🤞🤞🤞
个人主页:N_0050-CSDN博客
相关专栏:java SE_N_0050的博客-CSDN博客 java数据结构_N_0050的博客-CSDN博客
MySQL JDBC编程
JDBC编程:
通过 java代码 操作 mysql数据库 统一所有操作数据库的接口 可以理解为这是java连接数据库的规范
数据库编程,是需要数据库服务器提供一些API(Application Programming Interface)应用程序编程接口供程序员去使用的,然后就能数据库进行交互,可以理解为一组已经实现的类和一组(函数或方法)或库
JDBC的详细解释:如果上述这样不能理解,可以这样理解,java提供了一个标准的API(jdbc由一些类和接口组成)里面定义了与数据库交互的标准方法,然后各大数据库厂商照着这个标准(可以说是实现了这个接口)各自设计了一个驱动程序,开发人员可以通过这个驱动程序就可以操作对应的数据库了,其实开发人员在调用这个API(jdbc)的时候,是通过这个驱动程序(把java中的请求转为对数据库能理解的原生API调用),然后调用数据库原生的API去操作数据库的
驱动程序的理解:数据库厂商提供的驱动程序可以类比为适配器。假设你的电脑只有Type-C接口,但你的键盘或鼠标使用的是Type-B接口。为了在电脑上使用这些设备,你需要一个适配器,该适配器一端有Type-C接口连接电脑,另一端有Type-B接口连接你的键盘或鼠标。这样,适配器就可以让你的电脑和外设成功连接并正常工作。
耦合:可以想想事务的隔离性,事务之间的影响越小,隔离性越高,耦合也差不多这个意思就是如果我写了两段代码,修改了其中一段代码另外一段代码疯狂报错,那这个称为高耦合,反之,则称为低耦合
内聚:可以这样理解,就比如我们在写一个功能一个模块的时候,如果我们不集中写到一起,东写写西写写,代码看起来很乱,找的时候也麻烦,找还能找出跟这个模块没有什么关系的代码,这种可以称为低内聚,反之,则称为高内聚
操作步骤
1.获取数据源:
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("1234");// 两种写法
// MysqlDataSource mysqlDataSource = new MysqlDataSource();
// mysqlDataSource.setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
// mysqlDataSource.setUser("root");
// mysqlDataSource.setPassword("1234");
为什么选择这种写法?
DataSource是JDBC中的一个接口里面提供获取连接数据库的方法,MySQLDataSource是MySQL厂商提供的一个实现了DataSource的类,不同的数据库厂商有各自实现DataSource的类
上面是进行向上转型,先在堆上创建一个MySQLDataSource对象分配内存空间,然后把它的引用赋值给dataSource这个父类引用,然后这个父类引用指向这个对象,下面是进行向下转型,把父类的类型转为子类的类型,总结一下这样做是因为不同数据库厂商提供的实现类不一样,这样实现了低耦合
路径解释
jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false
URL:专业点说网络上的资源位置,简单点说就是网址
127.0.0.1这是一个特殊的IP地址每台电脑都有这个环回IP,"环回IP" 环回就是自己把数据发给自己,这里的jdbc程序和mysql程序都在自己的主机上使用环回IP即可,如果在不同的主机的话,就需要对应主机的IP
3306:端口号,好比收件人电话,也可以这样理解,食堂对应的窗口
2.建立连接
// 2.和数据库服务器建立连接 这样后续才能和数据库有 请求-响应 的交互Connection connection = dataSource.getConnection();
3.构造SQL语句与预处理SQL语句
// 3.构造sql语句
// String sql = "insert into class values(1,'老三')";
// String sql = "insert into class values(" + id + ",'" + name + "')"; 不推荐可能会造成sql注入String sql = "insert into class values(?,?)"; // 使用占位符PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setInt(1, id); //这个数字表示要替换上面的第几个问号(?),替换的字段是什么 从1开始 没有0preparedStatement.setString(2, name);
Prepared Statement:这里的preparedstatement表示会对这个sql语句进行预处理,其实可以直接把这个字符串格式的sql语句传给数据库服务器进行处理,mysql数据库会对你的语句进行解析和校验,但数据库服务器是服务多个客户端,这个过程的开销和负担很大,所以我们直接在客户端对sql语句进行解析和校验,然后再发到数据库服务器
4.执行SQL语句
首先是进行CRUD操作的代码
// 4.执行sql 把sql语句发给服务器 返回的是一个整数 表示受影响的行数int n = preparedStatement.executeUpdate();System.out.println(n);
这个n表示受影响的行数,如图在客户端进行操作的返回结果
接着就是进行查询操作的代码
// 4.执行sql 这里用的是查询 返回的是一个结果集(一张临时表) 在临时表上会有一个光标 初始化位置指向列ResultSet resultSet = preparedStatement.executeQuery();while (resultSet.next()) {int id = resultSet.getInt("id"); // 根据列名获取数据String name = resultSet.getString("name");System.out.println("id=" + id + ",name=" + name);}
这时候会返回的是一个结果集,也就是一张临时表,我们使用resultSet并且进行循环
5.释放资源,关闭连接
// 5.释放资源,关闭连接 后获取的资源 先释放preparedStatement.close();connection.close();
这个步骤注意的地方就是后获取的资源要先进行释放
以上便是本章的内容,JDBC虽然现在不怎么用了,但现在的一些对数据库进行操作的框架都是基于jdbc的,我们还是要有一定的了解💕