Java JDBC

JDBC
一、常用操作类:
	DriverManager
	Connection
	Statement
	prepareStatement
	ResultSet
二、JDBC连接数据库步骤(以MYSQL为例)

1、加载JDBC驱动程序:
	通过Class类的forName方法实现,并将驱动地址放进去
	成功加载后,会将Driver类的实例注册到DriverManager类中。
2、提供JDBC连接的URL 、创建数据库的连接
	要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象,
	该对象就代表一个数据库的连接。
	使用DriverManagergetConnection()方法传入指定的欲连接的数据库的路径、数	据库的用户名和密码。
Connection con=DriverManager.getConnection(url , username , password);
&&&:"jdbc:mysql://localhost/test?user=root&password=123&useUnicode=true&characterEncoding=utf-8;
3、创建一个Statement
要执行SQL语句,必须获得java.sql.Statement实例
执行静态SQL语句。通常通过Statement实例实现。
执行动态SQL语句。通常通过PreparedStatement实例实现。
String sql = “”;
Statement st = con.createStatement() ;
PreparedStatement pst = con.prepareStatement(sql) ;
4、执行SQL语句
Statement接口提供了executeQuery、executeUpdate、execute三种方法
executeQuery:执行select语句,返回ResultSet结果集
ResultSet rst = pst.executeQuery();
  executeUpdate:执行insert、update、delete语句
pst.executeUpdate();
5、关闭JDBC对象
操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源。

三、数据源的理解
1 DataSource 对象所表示的物理数据源的连接。作为 DriverManager 工具的替代项,DataSource 对象是获取连接的首选方法。
2 DataSource接口由驱动程序供应商实现,共有三种类型的实现:
基本实现,生成标准的 Connection 对象;连接池实现,生成自动参与连接池的 Connection 对象。此实现与中间层连接池管理器一起使用;分布式事务实现,生成一个 Connection 对象,该对象可用于分布式事务,大多数情况下总是参与连接池。此实现与中间层事务管理器一起使用,大多数情况下总是与连接池管理器一起使用。

四、数据库连接池
1程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。
2数据库连接池的运行机制:1)程序初始化时创建连接池;2)使用时向连接池申请可用连接;3)使用完毕,将连接返还给连接池;4)程序退出时,断开所有连接,并释放资源。
3常用的连接池:DBCP:比较稳定;C3P0: 性能比较高;

五、Preparedstatement和statement的区别
1Statemnet 发送完整的SQL 语句到数据库不是直接执行而是由数据库先编译,再运行。PreparedStatement继承于Statement 接口,除了具备Statement所有功能,还可以对SQL 语句进行预编译,也就是是先发送带参数的SQL 语句,再发送一组参数值。
2PreparedStatementStatement 而言:
同构的SQL语句,PreparedStatement 的效率要比Statement 高;
对于程序员而言,代码比较容易维护;
有较好的安全性,如:可以在一定程度上防止SQL 注入(SQL Injection)。

同构:两个SQL 语句可编译部分是相同的,只有参数值不同。
异构:整个SQL 语句的格式是不同的。

六、ResultSet
ResultSet接口是查询结果集接口,它对返回的结果集进行处理。
使用Connection对象获得一个StatementStatement中的executeQuery(String sql)方法可以使用select 语句查询,并且返回一个结果集ResultSet,通过遍历这个结果集,可以获得select语句的查寻结果,ResultSetnext()方法会操作一个游标从第一条记录的前面开始读取,直到最后一条记录。
七、JDBC调用存储过程
CallableStatement用于执行 SQL 存储过程的接口。通过Connection.prepareCall(java.lang.String) 创建一个 CallableStatement 对象来调用数据库存储过程。CallableStatement 对象提供了设置其 IN 和 OUT 参数的方法,以及用来执行调用存储过程的方法。使用返回的 CallableStatement 对象创建的结果集在默认情况下类型为 TYPE_FORWARD_ONLY,并带有 CONCUR_READ_ONLY 并发级别。
八、JDBC插入、查询时间类型的处理
1Java中使用的时间类型为java.util.Date,数据库中的时间类型为java.sql.Date,,java.sql包下有三个与数据库相关的日期时间类型,分别是:
Date:表示日期,只有年月日,没有时分秒;
Time:表示时间,只有时分秒,没有年月日;
Timestamp:表示时间戳,有年月日时分秒,以及毫秒。
2、把数据库的三种时间类型赋给java.util.Date,不用转换,因为java.sql.Datejava.util.Date的子类;
3java.util.Date转换成数据库的三种时间类型时,需要先通过getTime()方法将java.util.Date转化为long类型再转换为java.sql.Datejava.sql.Date date=new java.sql.Date(new Date().getTime());
九、事务概述
在数据库中,所谓事务是指一组逻辑操作单元即一组sql语句。当这个单元中的一部分操作失败,整个事务回滚,只有全部正确才完成提交。
事务的ACID属性
1. 原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2. 一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另外一个一致性状态。(数据不被破坏)
3. 隔离性(Isolation)
事务的隔离性是指一个事务的执行不能被其他事务干扰.
4. 持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的.即使系统重启数据也不会丢失;
在JDBC中,事务默认是自动提交的,每次执行一个 SQL 语句时,如果执行成功,就会向数据库自动提交,而不能回滚,为了让多个 SQL 语句作为一个事务执行:
(1)执行语句前调用 Connection 对象的 setAutoCommit(false)以取消自动提交事务;
(2)在所有的 SQL 语句都成功执行后,调用 commit()方法提交事务;
(3)在出现异常时,调用 rollback()方法回滚事务。
十、jdbc分段批量提交的时候出现异常怎么处理?
通过Map来解决性能问题。首先在分段批量提交的时候,我们不采用事务,这样就保证了合法的数据就自动提交,不合法的数据就自己自动进行回滚,为了避免不合法数据影响后续合法数据的提交,采用定义业务规则字典表,实现对数据的验证,将不合法的数据记录下来,供用户进行后续处理,而合法的数据就全部提交。
十一、jdbc批量处理数据
批量处理数据:(代码优化:提高程序执行性能)
降低了java程序代码(客户端)和数据库之间的 网络通信的次数。
在jdbc中进行批量插入的核心API为 addBatch,executeBatch
大数据量的插入问题:(jdbc,hibernate,ibatis)
1.每次只插入一条和数据库交互多次(很耗时间)
2.批量插入和数据库只交互一次(内存溢出)
3.分段批量插入(推荐)
jdbc批量处理数据是通过PreparedStatement对象的 addbatch(), executebatch() clearbatch()进行和数据库的交互。通常我们使用分段批量处理的方式 这样可以提高程序的性能 ,防止内存溢出。
1.每个sql语句都和数据库交互一次(非批量操作)
2.只和数据库交互一次(批量操作)(内存溢出)
当数据达到一定额度的时候就和数据库进行交互,分多次进行(分段批量操作)
(500或者1000)
pst.addBatch();
if (i > 0 && i%1000 == 0) {
pst.executeBatch();
pst.clearBatch();
}

 
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

z1427094386

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值