您的位置:首页 > 编程语言 > Java开发

java之jdbc初探

2013-12-07 00:17 387 查看
Class——20

 

事物(ACID)

原子性:组成事物的处理语句形成了一个逻辑单元,不能只执行其中的一部分。

一致性:在数据处理执行前后,数据库是一致的(数据库数据完整性约束)。

隔离性:一个事物处理对另一个事物处理的影响。

持续性:事务处理的结果能够被永久保存下来。

简单的三步骤:

  connection.setAutoCommit(false);

  connection.commit();//提交事物

  connection.rollback();//回滚事物

Tip;如果不能回滚,那有可能是数据库引擎问题。一般innoDB对大部分数据库特性都是支持的。

 

Class——21

 

回滚不一定非要完全把整个事物回滚,比如你从北京去上海,你已经飞到上海了,又紧急通知要飞往海南,那就没必要回到北京再去海南,而直接从上海去海南,这里就引出了一个概念:保存点。 
你想让程序回滚的哪里,就在哪里设置保存点。

Savepoint sp = null;

connection.setAutoCommit(false);

    ………

       ………..

sp= connection.setSavepoint();

 当出现异常需要回滚的时候,则要把保存点的引用传递给回滚函数

  connection.rollback(sp);

   connection.commit();

切记,这里一定要提交,因为保存点之前也有操作。所以不提交则保存点之前的操作就没有执行。

 

Class——22

 

Q:如何解决多个数据库参与的事物处理?

     JAVAEE为处理多个数据库参与的事物处理指定了一套规范(专门处理这种情况的API),是用JTA容器实现事物。Tomcat不支持该特性,高级的服务器才有这种支持,比如weblogic..

   该JTA容器就像一个指挥官,协调各个类型的服务器共同完成程序的运行。

  分成两个阶段提交:

    javax.transaction.UserTransaction tx = (UserTransaction)ctx.lookup(“jndiName”);

    tx.begin();

//connection1 ,connection2(可能来自不同的数据库)……..

  tx.commit();

  tx.rollback();

这个东西比较复杂,所以张勇老师在视频里边只是简单的介绍了一下。

 

 

Class——23

 

隔离界别

 

脏读(dirty reads)


一个事务读取了另一个未提交的并行事务写的数据。

不可重复读(non-repeatablereads)

一个事务重新读取前面读取过的数据,发现该数据已经被另一个已提交的事务修改过。

幻读(phantom read)


一个事务重新执行一个查询,返回一套符合查询条件的行,发现这些行因为其他最近提交的事务而发生了改变。

隔离级别越高,系统的并发性越差。

Mysql
查看隔离级别语句:select @@tx_isolation;


Mysql修改隔离级别语句:

   settransaction isolation level read uncommitted;、

                                                      read committed;

                                                      repeatable read;

                                                       serializable;

 提交:直接输入 commit;

回滚:直接输入 rollback;

 

Class——24

Jdbc 取主键

 

String sql=”insert into user(name ,birthday,money)values(‘name1’,’1989-05-05’,400)”;

Ps=conn.preparedStatement(sql,Statement.RETURN_GENERATED_KEYS);

Ps.executeUpdate();

Rs= Ps.getGeneratedKeys();

 有时候你插入信息的时候,需要把信息的主键加到信息里头,因为如果你不加,那么新信息的主键有可能是空,这当信息重复或者相似度很高的情况下是非常有必要的。

 

Class——25

批处理:可以大幅度提升增删改的速速。

String sql = “insert into user(uname,birthday,money)values(?,?,?)”;

Ps = conn.preparedStatement(sql,Statement.RETURN_GENERATED_KEYS);

For(int i = 0; i<100;i++){

    Ps.setString(1,”name”+i);

    Ps.setDate(2,newDate(System.currentTimeMillis()));

    Ps.setFloat(3,100f+i);

    Ps.addBatch();

}

 Int[]  eb = ps.executeBatch();

 

 

Class——26

package com.tony.jdbc;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

 

public class ScrollTest {

  public static voidmain(String[] args) throws ClassNotFoundException, SQLException {

         scrollMethod();

  }

 

  static void scrollMethod()throws ClassNotFoundException, SQLException {

        Connection conn = null;

        Statement st = null;

        ResultSet rs = null;

        try {

             conn =SinglejdbcTools.getInstance().getConnection(); //
调用singlejdbcTools;

             st =conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);//方法的第一个参数是说结果集是可滚动的,对数据库的变化时不可感知的,还有另一种方法
,ResultSet.TYPE_SCROLL_SENSITIVE
对数据库的变化是可感知的。但是不同的数据库不一定完全对jdbc的定义规则符合。所以这个方法对于不同的数据库不同的版本不一定起作用,只有在实践中去验证。

             //st =conn.createStatement();

             rs =st.executeQuery("select id,name,sex,age from person");

            
rs.absolute(20);//
结果集定义到第二十行开始操作。

             int i = 0;

             while(rs.next()&&i<10) {

                   i++;

                   System.out.println(rs.getObject(1)+"\t"+ rs.getObject(2) +"\t"+ rs.getObject(3)

                              +rs.getObject(4));

             }

             System.out.println("------------------------------");

       
       rs.absolute(6);//
注意:这里的定义到弟六行,仅仅是相对于结果集,与之前的对结果集的操作没有关系。比方说,上面显示的是从第二十行开始显示十行数据,但是这里的6,不是相对于这十行,而是相对于结果集。

             int  m = 0;

             while(rs.previous()&&m<5){

                   m++ ;

System.out.println(rs.getObject(1)+"\t"+ rs.getObject(2) +"\t"+ rs.getObject(3)

                              +rs.getObject(4));

             }

        } finally {

             jdbcTools.free(conn,st, rs);

        }

  }

}

 

Class——27

Part1:可更新的结果集

st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPTABLE);//第二个参数可以对结果进行更新操作

 
比如:rs.update……..这个方法,一般更新的数据,一定是某一行的一个数据,所以

更新完之后,要调用 rs.updateRow();

  
这个方法不太常用,一般不在查询语句里边对数据进行更新,这不符合java的封装特性。

 

Class——28

数据库的元数据信息。

所谓数据库元数据,既数据库的名字,数据库的版本,数据库驱动的版本等基本信息。

  staticvoid DatabaseMetaDataMethod()throws
SQLException{

     Connection conn =
null;

     PreparedStatement ps =
null ;

     ResultSet rs =
null;

      try{

        conn = jdbcTools.getConnection();

          DatabaseMetaDatadbmd = (DatabaseMetaData) conn.getMetaData();

         System.out.println(dbmd.getDatabaseProductName());

         System.out.println(dbmd.getDatabaseMajorVersion());

         System.out.println(dbmd.getDatabaseMinorVersion());

         System.out.println(dbmd.getDatabaseProductVersion());

         System.out.println(dbmd.supportsTransactions());

         
for
(int i =1 ; i < 5 ; i++){

             System.out.println("isolationlevel "+i+"
is :"+dbmd.supportsTransactionIsolationLevel(i)+" 
supported");

         }

      }

      finally{

        jdbcTools.free(conn, ps, rs);

      }

  }

还有好多方法,没事可以自己试一试。

一般可以通过调取数据库元信息而直到是哪个数据库,不同的数据库的元信息不同

Class——29

参数的元数据信息

package cn.itcast.jdbc;

 

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

public class ParameterMetaTest {

   publicstatic void main(String[] args) throws SQLException {

          Object[]params = new Object[] { "lisi", 100f };

          read("select* from user where name=? and  money >?", params);

   }

   staticvoid read(String sql, Object[] params) throws SQLException {

          Connectionconn = null;

          PreparedStatementps = null;

          ResultSetrs = null;

          try{

                 conn= JdbcUtils.getConnection();

                 ps= conn.prepareStatement(sql);

//                     ParameterMetaDatapmd = ps.getParameterMetaData();

//                     intcount = pmd.getParameterCount();

                 for(int i = 1; i <= params.length; i++) {

                        //System.out.print(pmd.getParameterClassName(i) + "\t");

                        //System.out.print(pmd.getParameterType(i) + "\t");

                        //System.out.println(pmd.getParameterTypeName(i));

                        ps.setObject(i,params[i - 1]);

                 }

                 rs= ps.executeQuery();

 

                 while(rs.next()) {

                        System.out.println(rs.getInt("id")+ "\t"

                                      +rs.getString("name") + "\t" +rs.getDate("birthday")

                                      +"\t" + rs.getFloat("money"));

                 }

 

          }finally {

                 JdbcUtils.free(rs,ps, conn);

          }

   }

 

}

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: