JDBC

JDBC

引:在学习数据库后,我们是否想到,数据库的作用是存储数据,可是我们在写代码的时候,怎么将代码里的数据给保存到数据库里呢
整个JDBC是一个面向接口编程的过程

一.什么是JDBC?

​ 1)是一个独立于数据库系统的一个接口规范

二.怎么使用jdbc

1)JDBC程序编写步骤:

导入java.sql包---找到mysql的驱动----创建Connection对象---创建Statement对象(就像班长,老师布置任务,班长去安排执行sql语句)----(如果是查询就要有,因为在mysql里查询下面就会有结果集的出现)ResultSet对像---关闭Resultset对象---(如果只单纯的增删改(更新)就不需要用ResultSet对象)---关闭Statement对象---关闭Connection对像---结束

引:具体该怎么操作呢?

2)用的什么jar包的什么类——Driver(驱动类)

3) 连接时用的是

——Driver类的方法connet,参数是啥(url -jdbc:mysql://localhost:3306/数据库 (得知道你是哪个数据库),账号密码(得确认使用这个数据库))

4)连接数据库的方式:

​ 方式一:1.直接用Driver类获取 Driver driver=new com.mysql.jdbc.Driver();2. 获取连接
​ 方式二:通过反射获取com.mysql.jdbc.Driver,提高了移植性
​ 方式三:使用DriverManager替换Driver(管理驱动组),需要1.获取Driver类,2.注册驱动,3.DriverManager的getconnection()

获取连接——API查文档
方式四:在三的基础上做了优化,不需要注册驱动,但尽量还是要加载Driver类
方式五:(最终版):使用DriverManage,使用配置文件(配置url,user和password以及当前数据库在Driver里的实现类等信息)
好处:
1.使代码分离解耦
2.修改时只需要修改配置文件,利于打包
注:(加在url下)// serverTimezone=GMT%2B8 中文编码
// rewriteBatchedStatements=true 配置批量处理时的设置

引:既然都连接到数据库了,那CURD操作该怎么实现呢

4)CURD操作(PreparedStatement)
	如何使用?——(增删改)
		1.获得连接
		2.预编译sql语句
		3.填充占位符 
		4.执行操作(execute)
		5.关闭资源
		——(查)
		1.获得连接
		2.sql语句
			预编译sql语句
			填充占位符
		3.查数据		
			.获得结果集(executeQuery())
			.获得元数据(getMetaData())
			.结果集的方法next(),获取下一行的数据(如果下一行没有数据返回false)
			.获取字段列值getObject(x)x为第几列输出,获取别名getColumnLabel()(没有别名默认列名)
			(也可以).通过反射将数据指定对象属性赋值类里(getDeclaredField()),通过类tostring输出数据
		4.关资源

注:ORM思想:
一个数据表代表一个类
表中一条数据对应java的一个对象
表中一个字段代表一个属性

引:数据库怎么存图片和视频(Blob类型)

5).PreparedStatement操作Blob类型

​ 增删改:与普通的增删改就是在填充占位符时,设置一个输入流(输入图片或视频),然后填充到占位符里

引·:在插入的时候只能一条条插入是不是太慢了

6)批量操作数据库

​ 由于查询本来就是批量的,而delete和update不加约束同样是批量
​ 所以批量操作主要是批量插入(普通批量插入很慢)
​ 优化方法:主要使用的方法 : (使用的限制,再url连接后加入rewriteBatchedStatements=true)
​ 1."攒"sql
​ statement.addBatch();
​ 2.给限制条件再执行batch
​ statement.executeBatch();
​ 3.清空batch
​ statement.clearBatch();
引:那么还能不能再次优化呢?
​ 因为每次执行statement.executeBatch();都会将数据提交至数据库,那么我们是否可以将数据保存完再提交呢?
​ 1.关闭自动连接
​ connection.setAutoCommit(false);
​ 2.到结束时再提交
​ connection.commit();

三.JDBC操作数据库有事务的增删改查

​ 1)何为事务:见mysql
​ 2)如何做到?事务的处理原则(见mysql)
​ 3)实操:
​ ——1、由于事务是一组逻辑单元(一个或多个DML操作),所以它们需要一个共同的数据库连接
​ 2、关掉连接的自动提交,并在结束时提交

	        3. 当有异常时,会事务回滚

**引:前面我们说过了要有一种ORM思想,那么现在我们在此基础上,创建一个DAO类(DAO层(后端业务逻辑与数据库持久化数据的一个中间层))

四,DAO类里呢有我们对数据库操作的一些方法,那么我们该怎么调用呢?

​ ——处理不同表的时候,每个表都去调用这个类里的方法嘛?
​ ——不不不,我们可以像之前有的ORM思想一样,每个表就是一个类,那么是不是也可以每一个表有一个接口(定义要用到的方法)和实现类(实现接口和继承类)
​ ——这样的话,就会有一个整体的流程,JDBCutily(工具类)提供连接和关闭数据库,DAO基类提供具体实现的方法,表接口提供当前表需要的方法,表实现类具体实现功能

引:当有多个需求连接时,一个一个启动关闭就太慢且浪费资源

五.数据库连接池

同理:java同样提供了一个实现数据库连接池的接口
那么不同的连接池也必须提供不同连接的jar包

1.使用连接池连接与普通连接有什么区别?
无非就是换了个接口,换了个jar包(Druid包)
相同点:同意的需要数据库url,name,password以及连接jar包

六.dbutils包(文件夹有文档)
我日学到这突然发现有一个jar包(dbutils)帮我们把CRUD都实现了,呜呜白学~(其实前面收获还是很大滴!)————好一个面向jar包编程
1.我们使用的时包里的QueryRunner类
a.方法update增删改,
b.query查询,参数ResultSetHandler rsh为结果集(有好多子接口,beanHeader是对应类常用的那种,如果你查询的是多条记录就用BeanListHandler,param是填充占位符参数,例如像count(*)这类特殊值用ScalarHandler类结果集)

posted @ 2022-03-14 18:37  又菜又ai  阅读(166)  评论(0)    收藏  举报