JDBC详解

JDBC没有出现之前,java程序是怎么连接数据库的如:

 

 


 

在开发应用的时候,我们要为连接不同的数据,编写不同的java程序,这样就带给了我们移植性的困难。

 

 

 

 

实现原理讲解:

  第一步:加载驱动 Class.forName("com.jdbc.driver.Driver"), 这是mysql提供的驱动包,Driver类中有一个静态模块,当程序加载的时候静态模块中的程序就会自动执行

而这个Driver类继承了NonRegisteringDriver,NonRegisteringDriver实现了本地的Deriver类public Connection connect(String url, Properties info)方法。

              static
                  {
                    DriverManager.registerDriver(new Driver());
                  }

              用来注册驱动

  public static synchronized void registerDriver(Driver driver)
        throws SQLException
    {
        if(!initialized)
            initialize();
        DriverInfo driverinfo = new DriverInfo();
        driverinfo.driver = driver;
        driverinfo.driverClass = driver.getClass();
        driverinfo.driverClassName = driverinfo.driverClass.getName();
        drivers.addElement(driverinfo);
        println((new StringBuilder()).append("registerDriver: ").append(driverinfo).toString());
    }

红色的字体是把Driver类信息传递给DriverInfo(相当于就是一个Driver),当我们要获取连接的时候其实是这个DriverInfo对象调用Connect()方法。然后把这个Driver发到一个容器中(drivers),这样就注册了驱动(简单吧,呵呵)。

 

 

 

 

 

第二步:创建连接DriverManager。getConnection(String url,String username,String password)这个方法内部是条用了connect(String url,Properties info)这个方法。

 

 

 

 

                            (这个是jdbc程序的一般过程)

 

 

 

 JDBC事务处理:

 

 

 

 事务是具备以下特征(ACID)的工作单元:
(1) 原子性
 事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行。
原子操作,也就是不可分割的操作,必须一起成功一起失败。
(2) 一致性
事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。这种特性称为事务的一致性。假如数据库的状态满足所有的完整性约束,就说该数据库是一致的。
(3) 分离性
分离性指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被其它企图进行修改的事务看到。
(4) 持久性
持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即一旦一个事务提交,DBMS保证它对数据库中数据的改变应该是永久性的,耐得住任何系统故障。持久性通过数据库备份和恢复来保证。

 

 

 

 

2 事务处理三步曲
① connection.setAutoCommit(false); //把自动提交关闭
② 正常的DB操作 //若有一条SQL语句失败了,自动回滚
③ connection.commit() //主动提交
或 connection.rollback() //主动回滚

 

 

 

 

 3 JDBC事务及事务隔离级别
JDBC事务并发产生的问题:
① 脏读(Dirty Reads) 一个事务读取了另一个并行事务还未提交的数据。
② 不可重复读(UnRepeatable Read) 一个事务再次读取之前的数据时,得到的数据不一致,被另一个已提交的事务修改。
③ 幻读(Phantom Read) 一个事务重新执行一个查询,返回的记录中包含了因为其它最近提交的事务而产生的新记录。
为了避免以上三种情况的出现,则采用
事务隔离级别:
TRANSACTION_NONE
不使用事务
TRANSACTION_READ_UNCOMMITTED
可以读取未提交数据
TRANSACTION_READ_COMMITTED
可以避免脏读,不能够读取没提交的数据,最常用的隔离级别 大部分数据库的默认隔离级别
TRANSACTION_REPEATABLE_READ
可以避免脏读,不可以重复读取
TRANSACTION_SERIALIZABLE
可以避免脏读,不可重复读取和幻读,(事务串行化)会降低数据库效率
以上的五个事务隔离级别都是在Connection类中定义的静态常量,使用setTransactionIsolation(int level) 方法可以设置事务隔离级别。
比如:con.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);

 

 

 

 

SQL数据类型及其相应的Java数据类型
SQL数据类型 Java数据类型 说明 -------------------------------------------------------------------------------------------------------------------------------------- INTEGER或者INT int 通常是个32位整数 SMALLINT short 通常是个16位整数 NUMBER(m,n) Java.sql.Numeric 合计位数是m的定点十进制数,小数后面有n位数
DECIMAL(m,n) 同上 DEC(m,n) Java.sql.Numeric 合计位数是m的定点十进制数,小数后面有n位数 FLOAT(n) double 运算精度为n位二进制数的浮点数 REAL float 通常是32位浮点数 DOUBLE double 通常是64位浮点数 CHAR(n) String 长度为n的固定长度字符串
CHARACTER(n) 同上 VARCHAR(n) String 最大长度为n的可变长度字符串 BOOLEAN boolean 布尔值 DATE Java.sql.Date 根据具体设备而实现的日历日期 TIME Java.sql.Time 根据具体设备而实现的时戳 TIMESTAMP Java.sql.Timestamp 根据具体设备而实现的当日日期和时间 BLOB Java.sql.Blob 二进制大型对象 CLOB Java.sql.Clob 字符大型对象 ARRAY Java.sql.Array

 

 

 

 

 

 

 1 DataSourse(数据源)
定义:
1、包含了连接数据库所需的信息,可以通过数据源获得数据库连接,有时由于某些连接数据库的信息会变更,所以经常使用包含数据库连接信息的数据源。
2、一个标准的数据库连接工厂,作为DriverManager的替代项,保存与数据库相关的信息,可以将数据库的连接信息放在一个共享的空间进行提取,不用在本地安装。支持JNDI的绑定,支持连接池,支持分布式服务,用getConnection方法可获得与数据库的连接。数据源应该由管理员创建(目的是为了保证数据库的安全)。所以数据源对象一般放在JNDI
tarena
pms
service
dao
entity
util
impl
PersonDao.java
PersonDaoOraImpl.java
PersonDaoMysqlImpl.java
AbstractPersonDao.java
PersonService.java
Person.java
JdbcUtil.java DaoFactory.java
ConnectionFactory.java
dao.properties
dbconfig.properties
对时间的操作:
ps.setDate(1, Data.valueOf(“2007-5-1”));
ps.setTimestamp(2, new Timestamp(System.currentTimeMillis())); //对系统时间的截取
18
服务器中。
通过JNDI获得绑定的资源
public static Object lookup(String context) throws NamingException
{
Properties pro = new Properties();
//Weblogic的JNDI服务器参数
pro.put(InitialContext.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
pro.put(InitialContext.PROVIDER_URL, "t3://localhost:7001");
Context ctx = new InitialContext(pro);
return ctx.lookup(context);//通过指定的字符串获得先前绑定的资源。
2 JNDI(命名目录服务器)
定义:是Java的命名目录服务器。而JDBC是Java的数据库访问接口。
跟JDBC是平级的关系,是两个独立的JNDI;JDBC存储的数据都是以二维表的接口来大规模存储数据。而JNDI存储的是差异性比较大的Java对象。JDBC取数据时用Sql语言访问数据。JDBC API依赖于驱动程序,而JNDI依赖于服务提供者。JDBC一般把数据存储到关系型数据库,而JNDI一般把数据存储到小型数据库、文件、甚至是注册表中。JNDI相当于一个电话本。允许程序将一个对象和一个命名绑定到目录树上。
(JNDI的方法是在javax.naming包下,
接口是Context,实现类是InitialContext)
bind(String name, Object obj) 将名称绑定到对象资源,建立指定的字符串和对象资源的关联
lookup(String name) ,通过指定的字符串获得先前绑定的资源
以下是将资源和JNDI命名绑定的方法
public static void bind(String context, Object obj) throws NamingException
{
Properties pro = new Properties();
//Weblogic的JNDI服务器参数
pro.put(InitialContext.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
pro.put(InitialContext.PROVIDER_URL, "t3://localhost:7001");
Context ctx = new InitialContext(pro);
ctx.bind(context, obj);//建立指定的字符串和对象资源的关联
}
19
3 连接池
在内存中用来保存一个个数据库连接的对象。
访问数据库时,建立连接和拆连接需要花费较长时间,通过以连接池直连的方式获取连接,不需要注册驱动程序,可以大量的节省销毁和创建连接的资源消耗提高访问数据库的效率。
注:通过连接池获得的Connection,当执行con.close()时,不是关闭连接,而是表示将连接释放回连接池。连接池是一个很复杂的软件,所以是由服务器厂商实现。
4 分布式的事务管理器JTA
分布式事务是通过多个异地数据库执行一组相关的操作,要保证原子操作的不可分,也不用再自己写commit,和rollback,全部都交给中间服务器(TM)来处理。(两阶段提交),也 就是在中间服务器发送sql语句等待数据库回应,都回应操作成功才提交,否则同时回滚。
TM(事务管理器)
con1 commit DB1
commit
con2 commit DB2
1、regester
2、TMexecute()
3、commitTM
4、TMcommitDB
5 RowSet
行集,这是一个JavaBean(事件机制),它增强了ResultSet的功能,包装了Connection、Statement、ResultSet、DriverManage。通过RowSet可以获得数据源,设置隔离级别,也可以发送查寻语句,也实现了离线的操作遍历,RowSet也支持预编译的Statement。
RowSet中的方法大致上和ResultSet相同,当需要使用时请查阅JAVA API参考文档。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值