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
浙公网安备 33010602011771号