ava与数据库交互的主要API是jdbc。jdbc的主要目的是:
1.通过使用SQL或者专有的SQL扩展,程序员可以利用java语言开发访问数据的应用。
2.数据库开发商或者数据库工具开发商改进数据库驱动程序
 
jdbc通用的使用方式如下:
Class.forName(jdbcDriverName);  Connection conn= DriverManager.getConnection(url,user,password);
 
根据数据库和驱动不同,下面是一些常用数据库的jdbc:
1.mysql:
   Class.forName("com.mysql.jdbc.Driver");
   Connection conn=
              DriverManager.getConnection("jdbc:mysql://localhost:3306/database","user","password");
2.oracle(thin):
   Class.forName("Oracle.jdbc.driver.OracleDriver");
   Connection conn=
              DriverManager.getConnection("jdbc:oracle:thin@localhost:1521/database","user","password");
3.DB2:
   Class.forName("com.ibm.db2.jdbc.app.DB2Driver");
   Connection conn=
              DriverManager.getConnection("jdbc:db2://localhost:50000/sample","user","password");
其他类型数据库与java一起使用的频率就比上面这些出现的频率小多了。
在配置jdbc驱动的时候,oracle与mysql的配置是一样,但是DB2有些不同,因为DB2的jdbc有三个jar包,在配置的时候要如下操作:
1. 将 db2jcc.jar 和 db2jcc_license_cu.jar 配置在环境变量classpath下。
2. 将 db2jcc.jar 和 db2jcc_license_cu.jar复制在你所用的应用服务器中工程下的WEB-INF/lib包下
3.jdbc中数据库地址URL为:jdbc:db2://localhost:50000/sample
4.数据库驱动类为:com.ibm.db2.jdbc.jcc.DB2Driver
5.使用正确的user和password进行连接测试
 
执行SQL的操作
  要执行SQL,首先要创建一个Statement对象来进行SQL操作。创建方法如下:
Statement st=conn.createStatement();
Statement执行操作SQL的方法有三个,分别是:
st.execute(String sql):执行任意的SQL语句,它通常用于用户提供的交互式查询,服务于技术人员
st.executeUpdate(String sql):执行插入,更新,删除语句,以及表的创建删除语句,返回sql语句影响的数据的行数
st.executeQuery(String sql):只执行查询操作,返回结果集ResultSet。
 
为什么不能只提供execute(String sql)方法?
因为在正常的情况下,查询操作比其他的操作更频繁。单独提供方法可以更好地优化它。
 
当查询操作时,可以使用如下的方式进行取出查询到的数据:
ResultSet rs=st.executeQuery(sql);
while(rs.next()){
     //rs.getString(1);类似的操作
}
注意:由于每一次查询都会产生这样的结果集,所以在使用完之后要立即关闭这个ResultSet,产生它的Statement,或者进一步关闭Connection。以免大量查询操作导致内存不足。如果这个连接conn使用的时间很短,可以直接关闭conn就可以了。
 
预处理方式的查询(prepared statement)
在sql参数中使用“?”来代替从现实情况中取到的实际参数值,再用它生成prepareStatement对象,然后通过prepare statement的方法来进行替换占位符“?”,所有的占位符替换完成后,才进行执行。下面是代码示例:
String sql="select * from person where name=? and age=?";
PreparedStatement pst=conn.createPreparedStatement(sql);
pst.setString(1,"wangxiao");
pst.setInt(2,25);
ResultSet rs=pst.executeQuery();
 
读写LOB问题
在SQL中,二进制大对象称为BLOB,字符型大对象称为CLOB。要读取LOB,需要执行select语句,然后在ResultSet上调用getBlob和getClob方法,这样可以获取BLOB或者CLOB类型的对象。要从BLOB中获取二进制数据可以调用getBytes或者getInputStream。类似的获取CLOB对象,,就可以调用getSubString或者getCharacterStream来获取其中的字符数据。下面是一段BLOB从数据库读出和写入的代码片段:
从数据库读取:
        PreparedStatement pst = conn.prepareStatement("select cover from book where isbn=?");
        pst.setString(1, "isbn");
        ResultSet res = pst.executeQuery();
        if (res.next()) {
            Blob blob = res.getBlob(1);
            Image image = ImageIO.read(blob.getBinaryStream());
        }
向数据库写入:
        Blob blob=conn.createBlob();
        int offset=0;
        OutputStream out=blob.setBinaryStream(offset);
        RenderedImage image=null;// set the source of store
        ImageIO.write(image, "PNG", out);
        PreparedStatement pst=conn.prepareStatement("insert into cover values (?,?)");
        pst.setString(1,"isbn");
        pst.setBlob(2, blob);
        pst.executeUpdate();
 
SQL转义问题
这个问题涉及到日期和时间的字面量,调用标量函数,调用存储过程,外连接,like中用到的转义字符。最普遍的情况就是时间字符串,时间戳的问题。
 
多结果集的处理
在执行存储过程或者在试用允许在单个查询中提交多个select语句的数据库时,查询可能返回多个结果集。下面是获取所有结果集的步骤:
1.试用execute方法来执行SQL语句
2.获取第一个结果集或者更新计数
3.重复调用getMoreResults方法移动到下一个结果集
4.当不存在更多的结果集或更新计数时完成操作。
boolean done=false;
boolean isResult=statement.execute(command);
while(!done){
   if(isResult){
      ResultSet result=statement.getResultSet();
      //do something with result
   }else{
      int updateCount=statement.getUpdateCount();
      if(updateCount>=0){
         //do something with update
      }else{
        done=false;  
      }
   }
   isResult=statement.getMoreResults();
}
 
获取新建数据行的自动生成键
statement.executeUpdate(insertSql,Statement.RETURN_GENERATED_KEYS);
ResultSet rs=statement.getGeneratedKeys();
int key;
if(rs.next()){
  key=rs.getInt(1);
}
 
可滚动和可更新的结果集
我们非常疑惑,有了上面的固定的结果集ResultSet之后,这一部分真的需要吗?
我经过仔细的查阅资料文档后发现,这个可滚动的结果集是用于不断同步数据库表单中数据的时候使用的。但是有限定条件用于一张表的可视化显示,用户会用到在结果集上前后移动。
使用可滚动结果集的语法:
Statement st=conn.createStatement(type,concurrency);
PreparedStatement pst=conn.preparedStatement(command,type,concurrency);
ResultSet rs=st.executeQuery(sql);
这样的rs里面会带有一个光标,可以前后移动。
如果是可更新的结果集,要要求更严格一些,有些数据库不一定能够支持这种形式。这种操作会始终连接着数据库,效率是个问题。
 
行集
行集的出现就是为了解决可更新结果集长时间连接数据库的问题。行集有很多种实现类型,有CachedRowSet,WebRowSet,jdbcRowSet,FilterdRowSet,JoinRowSet.下面是CachedRowSet的启用语法:
ResultSet rs=st.executeQuery(sql);
CachedRowSet crs=new com.sun.rowset.CachedRowSetImpl();
crs.populate(rs);
conn.close();
//使用crs操作
 
元数据
元数据在SQL中是用来描述数据库或其组成部分的数据。我们可以获得三类元数据:关于数据库的元数据,关于结果集的元数据,关于预备语句参数的元数据。这个元数据在百度上百度一下,可以看到它的标准定义,它是描述基本数据信息的数据。操作元数据的语法如下:
DatabaseMetaData meta=conn.getMetaData();
ResultSet mrs=meta.getTables(null,null,null,new String[]{"TABLE"});
元数据结果集中第一列代表了表目录,第二列代表了表结构模式,第三列表名,第四列表类型,第五列关于表的注释。
 
事物
这个是数据库操作中常用到的数据操作保障,一般情况下要在jdbc操作失败的时候进行回滚操作,前提是jdbc操作不是自动提交事物的。
取消事物自动提交的语法是:
conn.setAutoCommit(false);
提交语法:conn.commit();
回滚语法:conn.rollback();
当一个处理过程中涉及到很多步骤的非查询操作的时候,可以设立保存点,以更好地控制回滚操作。
使用语法说明:
//step1 jdbc operations
Savepoint svpt=conn.setSavepoint();
//step2 jdbc operations
if(...)conn.rollback(svpt);//如果step2操作失败的话
//other operations
conn.commit();
 
批量更新
当一起执行多个非查询操作的时候,可以考虑是用批量更新的方式来提高效率。这种效率随着操作语句数量的增多而提高的更多。批量操作在处理异常时可以作为单个事物操作。具体使用,查询batch update.

Java数据库编程的更多相关文章

  1. java面向对象下:Java数据库编程

    19.Java数据库编程: JDBC概述:        JDBC(Java Database Connection)是java中提供的一套数据库编程API,它定义了一套用来访问数据库的标准Java类 ...

  2. java数据库编程——读写LOB、可滚动和可更新的结果集、元数据

    java 数据库编程 1. 读写LOB 除了数字.字符串和日期之外,许多数据库还可以存储大对象,例如图片或其它数据.在SQL中,二进制大对象称为BLOB,字符型大对象称为CLOB. 要读取LOB,需要 ...

  3. 菜鸡的Java笔记 java数据库编程(JDBC)

    java数据库编程(JDBC)        介绍 JDBC 的基本功能            content (内容)        现在几乎所有的项目开发过程之中都不可能离开数据库,所以在java ...

  4. Java数据库编程、XML解析技术

    数据库编程 JDBC概述 是Java Database Connecive,即数据库连接技术的简称,它提供了连接各种常用数据库的能力. 是一种用于执行SQL语句的Java API,可以为多种关系数据库 ...

  5. java 数据库编程 学习笔记 不断更新

    最近开始学习java,感觉java的数据库编程需要发个随笔记录一下,话不多说 切入正题. 一.数据库访问技术的简介 应用程序  →  执行SQL语句 →数据库 → 检索数据结果 → 应用程序   ( ...

  6. JAVA数据库编程、JAVA XML解析技术

    JDBC概述 JDBC是JAVA中提供的数据库编程API curd :数据库增删改 链接字符串:String url = "mysql :/localhost :3306/jdbc/&quo ...

  7. JDBC与JAVA数据库编程

    一.JDBC的概念 1. JDBC (Java DataBase Connectivity) Java数据库连接 a) 主要提供java数据库应用程序的API支持 2. JDBC的主要功能 a) 创建 ...

  8. JAVA数据库编程(JDBC技术)-入门笔记

    本菜鸟才介入Java,我现在不急着去看那些基本的语法或者一些Java里面的版本的特征或者是一些晋级的知识,因为有一点.Net的OOP编程思想,所以对于Java的这些语法以及什么的在用到的时候在去发现学 ...

  9. JDBC与Java数据库编程基础

    一.JDBC 概述 1.什么是JDBC 称为Java数据库连接,它是一种用于数据库访问的应用程序API,由一组用Java语言编写的类和接口组成,有了JDBC就可以用同一的语法对多种关系数据库进行访问, ...

  10. Java数据库编程及Java XML解析技术

    1.JDBC概述 A.  什么是JDBC? Java DataBase Connectivity:是一种用于执行SQL语句的Java API,它由一组用Java语言编写的类和接口组成.通过这些类和接口 ...

随机推荐

  1. Chart图形 [GDI+] OWCChart统计图的封装类 (转载)

    点击下载 OWCChart.zip 利用OWC11进行作统计图的封装类. /// <summary> /// 类说明:进行作统计图的封装类 /// 联系方式:361983679 /// 更 ...

  2. ROW_NUMBER () 与 PARTITION组合拳

    --在一个Book表里面里有字段AuthorID与Author表关联,现在要求按PublishDate字段倒序排列,列出每个作者的前五本书.要求有没有一条语句搞定的--可用游标或者临时表--最好解决方 ...

  3. C#编程使用到的几种调试方式

    一.前言: 使用C#语言从08年算起,到现在也有6个年头的时间了. 但 是会使用调试进行辅助编程的时间,却只有5个年头,其中第一年里面,只能傻傻地敲着老师给的案例,不会写就一遍一遍重复手写编码,上机练 ...

  4. shell脚本学习之$0,$?,$!等的特殊用法

    变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行的命令的结束代码(返回值) $- 使用Set命令设定的Flag一览 ...

  5. 隐藏TabBar的一些方法小结(适用与各种情况)

    在项目中经常遇到隐藏tabBar,实力很多种方法,可以解决不同情况下问题 使用中涉及到view的层次关系,下面的使用方法 1.2不做说明:在使用3.4方法时注意要在tabBar所在的rootView中 ...

  6. Powershell profile.ps1 cannot be loaded because its operation is blocked by software restriction policies

    Powershell profile.ps1 cannot be loaded because its operation is blocked by software restriction pol ...

  7. max取得数组的最大值

    var arr = [1,2,3,4,5,2,2,4,52,5,6,5,4,4]; var maxNum = Math.max.apply(Math,arr); var maxIndex = arr. ...

  8. MFC error C2065: “IDD_DIALOG1” : 未声明的标识符 转载

    error C2065: “IDD_DIALOG1” : 未声明的标识符 1.编译时提示error C2065: “IDD_DIALOG1” : 未声明的标识符 2.错误的可能原因及解决方法如下: 原 ...

  9. (转)Android开发:性能最佳实践-管理应用内存

    翻自:http://developer.android.com/training/articles/memory.html 在任何软件开发环境中,RAM都是宝贵的资源,但在移动操作系统中更加珍贵.尽管 ...

  10. ajax只是一个称呼

    记得刚入行的时候,看到ajax,即异步的javascript和xml这样一个概念,一点感觉都没有.参加工作前的第一轮面试,被问到有没有自己实现过ajax,我觉得自己实现肯定很复杂吧. 从名字理解 从名 ...