JDBC(二)
三层架构的一些基本报结构如下:
domain包:下面是一些实体bean,属性为private,提供属性相对应的set和get方法。一般对应于数据库中的一张数据表,属性对应于数据表中的列。
dao包,数据访问层的接口,控制实体bean的CRUD操作和其他的一些业务逻辑,存储的都是接口。
dao.impl包,数据访问层接口的实现。
service包,业务逻辑层,调用数据访问层。
JDBC属于数据访问层的技术,JDBC的CRUD出现异常时不能仅是try,catch,否则上层的业务逻辑层不知道已经出现了错误,所以在CRUD出错时还需要向上抛出异常。
JDBC的SQLException是编译时异常,必须要进行处理,而且和JDBC进行了耦合,Hibernate抛出的就不是SQLException。所以向上抛出的不应是SQLException,而应该是运行时异常(RuntimeException)。
public static void updateObject(String sql, String[] params) throws DaoRuntimeException {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = DBConnectionManager.getConnection();
pstmt = conn.prepareStatement(sql);
for (int i = 0; params != null && i < params.length; i++) {
pstmt.setString(i + 1, params[i]);
}
rs = pstmt.executeUpdate();
} catch (Exception e) {
logger.info("Execute sql : " + sql + " fail!!!");
throw new DaoRuntimeException(e.getMessage(),e);
} finally {
DBConnectionManager.free(conn, pstmt, rs);
}
事务的四个特性ACID:
原子性:automicity,操作要么全执行,要么全部执行,不能执行一部分。
一致性:consistency,数据库数据完整性约束。
隔离性:isolcation,一个事务对另一个事务不会产生影响。
持久性:durablity,事务的结果可以被持久的保留下来。
JDBC对事务的主要操作:
connection.setAutoCommit(false)//打开事务
//多条CRUD操作
connection.commit()//提交事务
connection.rollback()//回滚事务
还可以回滚至特定的保存点,
SavePoint sp = conection.setSavePoint();
connection.rollback(sp);
事务的操作如果跨越了多个数据源,还需要用到JTA,使用支持JTA的容器如weblogic,websphere提供的JNDI服务去完成。
脏读:一个事务读到了另一个事务未提交的数据。
不可重复读:一个事务重复读取的操作读到的数据不一致,是其他的事务修改了所读取的数据所导致的。
幻读:一个事务读到了另一个事务已提交的数据。
数据库的隔离级别又分为:读未提交,读已提交,可重复读,可串行化
读未提交可能产生:脏读,不可重复读,幻读
读已提交可能产生:不可重复读,幻读
可重复读可能产生:幻读,可以用快照技术实现,存储读取的数据。
可串行化不会有脏读,不可重复读,幻读
不同数据库的隔离级别是不同的,MySQL默认的是可重复读。隔离级别越高,占用资源越多,数据正确性越高。
connection.setTransactionIsocation(Connection.TRANSACTION_REPEATABLE_READ)。不设置时就是用数据库默认的隔离级别。
JDBC调用存储过程。
一个简单的存储过程如下:
demiliter |
drop procedure if exists addUser |
create procedure addUser(in pname varchar(40),in birthday date,out pid int)
begin
insert into user(name,birthday) values (pname,birthday);
select last_insert_id into pid;
end |
demilter;
String sql = "{ call addUser(?,?,?)}";
CallableStatement cs = conn.prepareCall(sql);
cs.registerOutParameter(3,Type.Integer);
cs.setString(1,"new user");
cs.setDate(2,new java.sql.Date(System.currentTimeMills()));
cs.executeUpdate();
int id = cs.get(3);
批量处理,大量的SQL语句时需要注意:
PreparedStatement.executeBatch();,下面是执行1000条SQL的例子。还需要考虑到一次发送的SQL语句集合包的大小,不能一次发送的数量太大,会导致内存溢出。
大量的插入语句insert into () values()()()效率很高。
public static void updateObject(String sql, String[] params) throws DaoRuntimeException {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = DBConnectionManager.getConnection();
pstmt = conn.prepareStatement(sql);
for(int round =0;round <1000;round ++){
for (int i = 0; params != null && i < params.length; i++) {
pstmt.setString(i + 1, params[i]);
}
psmt.addBatch();//statment对应的是psmt.addBatch(String sql)
}
rs = psmt.executeBatch();//rs = pstmt.executeUpdate();
} catch (Exception e) {
logger.info("Execute sql : " + sql + " fail!!!");
throw new DaoRuntimeException(e.getMessage(),e);
} finally {
DBConnectionManager.free(conn, pstmt, rs);
}
可滚动的结果集,ResultSet即可以实现rs.next(),也可以实现rs.privious()向前滚动,绝对定位rs.absolute(4)到第4条记录。
st = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
可滚动结果集可用于MySQL的分页,从第100条记录开始取50条记录
rs.absolute(100);
int i=0;
while(rs,next() && i<50){
rs.getObject("name");
}
MySQL的语法也直接就可以支持分页select id,name from user limit 100.50;
JDBC(二)的更多相关文章
- JAVA基础-JDBC二(常用的开源工具)
一.连接池 在实际的开发应用中,我们常常会对数据库进行大量的高并发的访问,而最原始的连接和操作方式并不能满足这种大量的访问,程序员为了追求更方便.更快捷.更科学安全的开发.第三方的工具类和Dao层的框 ...
- JDBC二查询(web基础学习笔记八)
一.建立数据库 --创建news表空间 CREATE TABLESPACE tbs_news DATAFILE 'F:\ORACLE\news.dbf' SIZE 10M AUTOEXTEND ON; ...
- JDBC二部曲之_入门
JDBC 1 什么是JDBC? JDBC(Java DataBase Connectivity),即Java数据库连接!也就是说,Java程序员可以使用JDBC API来操作数据库. 最早JDBC是J ...
- java JDBC (二) 防止注入/参数化
package cn.sasa.demo2; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Pr ...
- java基础之JDBC二:原生代码基础应用
JDBC的基础应用CURD: 增删改 public void noQuery() { Connection conn = null; Statement stat = null; try { //注册 ...
- JDBC二部曲之_事物、连接池
事务 事务概述 事务的四大特性(ACID) 事务的四大特性是: l 原子性(Atomicity):事务中所有操作是不可再分割的原子单位.事务中所有操作要么全部执行成功,要么全部执行失败. l 一致 ...
- JDBC(二)
## 详解JDBC各个对象 1.DriverManager对象:驱动管理对象 * 功能: 1.注册驱动:告诉程序该使用哪个数据jar包 static void registerDriver(D ...
- mysql的jdbc入门学习小结
转自:专注JavaWeb开发 http://www.javaweb1024.com/data/MySQL/2015/04/25/618.html 一.jdbc基本概念jdbc : Java Datab ...
- Java基础 JDBC
一,前言 数据库是开发中必不可少的一个工具,那么java如何操作数据库呢,那就是我们的JDBC了,接下来我们将会好好聊一下这个JDBC. 二,JDBC 2.1 JDBC概述 JDBC(Java Dat ...
- JDBC(3):PreparedStatement对象介绍
一,PreparedStatement介绍 PreperedStatement是Statement的子类,它的实例对象可以通过Connection.preparedStatement()方法获得,相对 ...
随机推荐
- python笔记一(正则表达式)
#!/usr/bin/env python # -*- coding: utf-8 -*- # 1 如果直接给出字符,则表示精确匹配 # 2 \d 表示数字, \w 表示字母或数字, . 可以匹配任意 ...
- [国嵌攻略][109][Linux系统调用]
系统调用 函数实现体在内核空间,提供给应用程序来使用,就是一个系统调用. 工作流程 1.通过软中断(swi)从用户空间切换到内核空间.entry-common.S中的ENTRY(vector_swi) ...
- Spring注解依赖注入的三种方式的优缺点以及优先选择
当我们在使用依赖注入的时候,通常有三种方式: 1.通过构造器来注入: 2.通过setter方法来注入: 3.通过filed变量来注入: 那么他们有什么区别吗?应该选择哪种方式更好? 三种方式的区别小结 ...
- 从零开始学习前端开发 — 18、BFC
一. BFC的概念 BFC--block formating context的缩写,中文译为"块级格式化上下文" 二.如何触发BFC 1.设置float除none以外的值(left ...
- 邓_php面试【003】——完整版
php面试题汇总四(基础篇附答案) 1. 什么事面向对象?主要特征是什么? 面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰.主要特征:封装.继承.多态. 2. SESSION ...
- 7系列高速收发器总结 GTP IP核使用篇
上一篇7系列收发器博文讲解了GTP IP核的基本配置,本文继续分析如何将它使用起来.生成IP核后打开example design,先看看工程中包含的文件结构. 顶层文件下包含了gtp ip核系统顶层文 ...
- 【问题解决】Eclipse中 ctrl+空格 content assist
改一下你的快捷键设置:window->perferences-->keys--->查找 content assist--->把这个地方改成你想要的就可以了.!
- HTML怎么设置字与字之间的间距代替空格
空格:   CSS: letter-spacing字与字 word-spacing词与词 行距:line-height:1.5; 段落:<p style="margin ...
- linux_远程连接
为什么要远程连接linux服务器? 温度.湿度.电力各种影响,有的企业使用阿里云服务器,更加接触不到机房,所有需要通过远程连接服务器来进行管理 IP地址? 互联网上的计算机,都会有一个唯一的32位地址 ...
- 6_css选择器
如何应用css样式? 找标签 写样式 如何找出标签? class选择器 .类名(注意前面点){ 样式 } .a{ color: green; } <p class="a"&g ...