三层架构的一些基本报结构如下:

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(二)的更多相关文章

  1. JAVA基础-JDBC二(常用的开源工具)

    一.连接池 在实际的开发应用中,我们常常会对数据库进行大量的高并发的访问,而最原始的连接和操作方式并不能满足这种大量的访问,程序员为了追求更方便.更快捷.更科学安全的开发.第三方的工具类和Dao层的框 ...

  2. JDBC二查询(web基础学习笔记八)

    一.建立数据库 --创建news表空间 CREATE TABLESPACE tbs_news DATAFILE 'F:\ORACLE\news.dbf' SIZE 10M AUTOEXTEND ON; ...

  3. JDBC二部曲之_入门

    JDBC 1 什么是JDBC? JDBC(Java DataBase Connectivity),即Java数据库连接!也就是说,Java程序员可以使用JDBC API来操作数据库. 最早JDBC是J ...

  4. java JDBC (二) 防止注入/参数化

    package cn.sasa.demo2; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Pr ...

  5. java基础之JDBC二:原生代码基础应用

    JDBC的基础应用CURD: 增删改 public void noQuery() { Connection conn = null; Statement stat = null; try { //注册 ...

  6. JDBC二部曲之_事物、连接池

    事务 事务概述 事务的四大特性(ACID) 事务的四大特性是: l  原子性(Atomicity):事务中所有操作是不可再分割的原子单位.事务中所有操作要么全部执行成功,要么全部执行失败. l  一致 ...

  7. JDBC(二)

    ##  详解JDBC各个对象 1.DriverManager对象:驱动管理对象 *  功能: 1.注册驱动:告诉程序该使用哪个数据jar包 static  void  registerDriver(D ...

  8. mysql的jdbc入门学习小结

    转自:专注JavaWeb开发 http://www.javaweb1024.com/data/MySQL/2015/04/25/618.html 一.jdbc基本概念jdbc : Java Datab ...

  9. Java基础 JDBC

    一,前言 数据库是开发中必不可少的一个工具,那么java如何操作数据库呢,那就是我们的JDBC了,接下来我们将会好好聊一下这个JDBC. 二,JDBC 2.1 JDBC概述 JDBC(Java Dat ...

  10. JDBC(3):PreparedStatement对象介绍

    一,PreparedStatement介绍 PreperedStatement是Statement的子类,它的实例对象可以通过Connection.preparedStatement()方法获得,相对 ...

随机推荐

  1. HDU1465-装错信封-递推

    不容易系列之一 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  2. solr服务的搭建(以solr4.1实现)

    1.准备工作:一个干净的Tomcat,solr-4.10.3. 2.新建一个文件夹我这里命名为solr,将Tomcat和solr-4.10.3放进去.新建一个solrhome的文件夹,里面放的是sol ...

  3. Dora.Interception, 一个为.NET Core度身打造的AOP框架[3]:Interceptor的注册

    在<不一样的Interceptor>中我们着重介绍了Dora.Interception中最为核心的对象Interceptor,以及定义Interceptor类型的一些约定.由于Interc ...

  4. .30-浅析webpack源码之doResolve事件流(1)

    这里所有的插件都对应着一个小功能,画个图整理下目前流程: 上节是从ParsePlugin中出来,对'./input.js'入口文件的路径做了处理,返回如下: ParsePlugin.prototype ...

  5. JavaScript八张思维导图—操作符

    JS基本概念 JS操作符 JS基本语句 JS数组用法 Date用法 JS字符串用法 JS编程风格 JS编程实践 不知不觉做前端已经五年多了,无论是从最初的jQuery还是现在火热的Angular,Vu ...

  6. removeClass()

    定义和用法 removeClass() 方法从被选元素移除一个或多个类. 注释:如果没有规定参数,则该方法将从被选元素中删除所有类. 语法 $(selector).removeClass(class) ...

  7. 数据结构与算法(c++)——双缓存队列

    "双缓存队列"是我在一次开发任务中针对特殊场景设计出来的结构.使用场景为:发送端持续向接收端发送数据包--并且不理会接收端是否完成业务逻辑.由于接收端在任何情况下停止响应即可能产生 ...

  8. 邓_ Php·魔术方法

    ================================================ 1.__tostring()   用于定义输出对象引用时调用  常用于打印一些对象的信息 必须有返回值 ...

  9. linux mysql 忽略大小写

    修改/etc/my.cnf 2)在[mysqld]下加入一行:lower_case_table_names=1 3)重新启动数据库即可.

  10. python_如何使用生成器实现可迭代对象?

    案例分析: 实一个可迭代对象的类,它能迭代出给定范围内所有的素数: pn = Number(1, 30) for k in pn: print(k) 结果为:2,3,5,7,11,13,17,19,2 ...