jdbc初步(转)

 

1. Jdbc的六个编程步骤

1. 注册一个驱动

注册驱动程序有三种方式:

方式一:Class.forName(“oracle.jdbc.driver.OracleDriver”);

JAVA 规范中明确规定:所有的驱动程序必须在静态初始化代码块中将驱动

注册到驱动程序管理器中。

方式二:Driver drv = new oracle.jdbc.driver.OracleDriver();

DriverManager.registerDriver(drv);

方式三:编译时在虚拟机中加载驱动

javac –Djdbc.drivers = oracle.jdbc.driver.OracleDriver xxx.java

java –D jdbc.drivers=驱动全名 类名

使用系统属性名,加载驱动 -D 表示为系统属性赋值

附 : mysql 的 Driver 的全名 com.mysql.jdbc.Driver

SQLServer 的 Driver 的全名 com.microsoft.jdbc.sqlserver.SQLServerDriver

2. 取得一个连接

Conn = DriverManager.getConnection(jdbcURL,userName,password);

3. 获得一个Statement声明对象

Statement st = conn.createStatement();

PreparedStatement ps = conn.prepareStatement(sql);

CallableStatemetn cs = conn.prepareCall(sql);

4. 通过Statement对象执行Sql语句

sta.execute(String sql); 如果返回一个结果集则返回true,否则返回false。

sta.executeQuery(String sql);返回一个查询结果集。

sta.executeUpdate(String sql);返回值为 int 型,表示影响记录的条数。

将 sql 语句通过连接发送到数据库中执行,以实现对数据库的操作。

5. 若有结果集ResultSet则处理结果集

ResultSetMetaDate rsmd = rs.getMetaData();

int columnCount = rsmd.getColumnCount();

While(rs.next()){

for(int i = 1; i <= columnCount; i++)

{

if(i != 1) System.out.print(",");

String name = rsmd.getColumnName(i); //取得第i列的列名称

String value = rs.getString(i); //取得第i列的值

System.out.print(name + "=" + value);

}

}

6. 关闭资源

2. 第一个Jdbc程序

 

[java] view plaincopyprint?

  1. public class AccountDaoBad
  2. {
  3. public void select()
  4. {
  5. Connection con = null;
  6. Statement st = null;
  7. ResultSet rs = null;
  8. try
  9. {
  10. Class.forName("oracle.jdbc.driver.OracleDriver");
  11. /** static init block in OracleDriver*/
  12. String jdbcURL = “jdbc:oracle:thin:@192.168.0.5:1521:tarena”;
  13. con = DriverManager.getConnection(jdbcURL, "sd0703", "sd0703");
  14. st = con.createStatement();
  15. System.out.println(st.getFetchSize());
  16. String sql = "select id,no,owner,pwd,cdate,balance from sd0703_account";
  17. rs = st.executeQuery(sql);
  18. while(rs.next())
  19. {
  20. System.out.print("id=" + rs.getInt(1));
  21. System.out.print(",no=" + rs.getString(2));
  22. System.out.print(",owner=" + rs.getString(3));
  23. System.out.print(",pwd=" + rs.getString(4));
  24. System.out.print(",cdate=" + rs.getDate(5));
  25. System.out.println(",balance=" + rs.getDouble(6));
  26. }
  27. }catch(SQLException e)
  28. {
  29. e.printStackTrace();
  30. throw new RuntimeException(e.getMessage());
  31. }catch(ClassNotFoundException e)
  32. {
  33. e.printStackTrace();
  34. throw new RuntimeException(e.getMessege());
  35. }finally
  36. {
  37. try{ con.close();}catch(Exception e) {e.printStatckTrace();}
  38. }
  39. }
public class AccountDaoBad
{
    public void select()
    {
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        try
        {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            /** static init block in OracleDriver*/
String jdbcURL = “jdbc:oracle:thin:@192.168.0.5:1521:tarena”;
            con = DriverManager.getConnection(jdbcURL, "sd0703", "sd0703");
            st = con.createStatement();
            System.out.println(st.getFetchSize());
            String sql = "select id,no,owner,pwd,cdate,balance from sd0703_account";
            rs = st.executeQuery(sql);
            while(rs.next())
            {
                System.out.print("id=" + rs.getInt(1));
                System.out.print(",no=" + rs.getString(2));
                System.out.print(",owner=" + rs.getString(3));
                System.out.print(",pwd=" + rs.getString(4));
                System.out.print(",cdate=" + rs.getDate(5));
                System.out.println(",balance=" + rs.getDouble(6));
            }
        }catch(SQLException e)
        {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());

        }catch(ClassNotFoundException e)
        {
            e.printStackTrace();
            throw new RuntimeException(e.getMessege());

        }finally
        {
            try{ con.close();}catch(Exception e) {e.printStatckTrace();}
        }
    }

 

3. 常用类

1. Connection, Statement, ResultSet,

4. 2.0新特性

(1)事务管理与图片的存储

 

[java] view plaincopyprint?

  1. public class ImageLibraryService
  2. {
  3. public void addImage(long id, String imageName, String path) throws SQLException
  4. {
  5. Connection con = null;
  6. PreparedStatement ps = null;
  7. ResultSet rs = null;
  8. try
  9. {
  10. con = ConnectionFactory.getConnection();
  11. con.setAutoCommit(false);
  12. String sql = "insert into ImageLibrary(id, name, image)";
  13. sql += " VALUES(?, ?, empty_blob())";
  14. ps = con.prepareStatement(sql);
  15. ps.setLong(1, id);
  16. ps.setString(2, imageName);
  17. ps.executeUpdate();
  18. ps.close();
  19. ps = con.prepareStatement("select image from ImageLibrary WHERE id = ? for update ");
  20. ps.setLong(1, id);
  21. rs = ps.executeQuery();
  22. if (rs.next())
  23. {
  24. Blob image = rs.getBlob(1);
  25. OutputStream out = image.setBinaryStream(0);
  26. BufferedOutputStream bufferedOut = new BufferedOutputStream(out);
  27. BufferedInputStream bufferedIn = new BufferedInputStream(new FileInputStream(path));
  28. int c;
  29. while ((c = bufferedIn.read()) != -1)
  30. {
  31. bufferedOut.write(c);
  32. }
  33. bufferedIn.close();
  34. bufferedOut.close();
  35. }
  36. con.commit();
  37. } catch (Exception e)
  38. {
  39. e.printStackTrace();
  40. try
  41. {
  42. con.rollback();
  43. } catch (SQLException se) { }
  44. throw new SQLException(e.getMessage());
  45. } finally
  46. {
  47. JdbcUtil.close(rs, ps, con);
  48. }
  49. }
  50. //以下代码没有进行细致的异常捕获
  51. public void restoreImage(long id, String filename) throws Exception
  52. {
  53. Connection con = ConnectionFactory.getConnection();
  54. Statement st = con.createStatement();
  55. String sql = "SELECT image From ImageLibrary Where id = " + id;
  56. ResultSet rs = st.executeQuery(sql);
  57. while (rs.next())
  58. {
  59. Blob image = rs.getBlob("image");
  60. BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(filename));
  61. BufferedInputStream in = new BufferedInputStream(image.getBinaryStream());
  62. int c;
  63. while ((c = in.read()) != -1) out.write(c);
  64. in.close();
  65. out.close();
  66. }
  67. }
  68. }
public class ImageLibraryService
{
    public void addImage(long id, String imageName, String path) throws SQLException
    {
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try
        {
            con = ConnectionFactory.getConnection();
            con.setAutoCommit(false);
            String sql = "insert into ImageLibrary(id, name, image)";
            sql += " VALUES(?, ?, empty_blob())";
            ps = con.prepareStatement(sql);
            ps.setLong(1, id);
            ps.setString(2, imageName);
            ps.executeUpdate();
            ps.close();
            ps = con.prepareStatement("select image from ImageLibrary WHERE id = ? for update ");
            ps.setLong(1, id);
            rs = ps.executeQuery();
            if (rs.next())
            {
                Blob image = rs.getBlob(1);
                OutputStream out = image.setBinaryStream(0);
                BufferedOutputStream bufferedOut = new BufferedOutputStream(out);
                BufferedInputStream bufferedIn = new BufferedInputStream(new FileInputStream(path));
                int c;
                while ((c = bufferedIn.read()) != -1)
                {
                    bufferedOut.write(c);
                }
                bufferedIn.close();
                bufferedOut.close();
            }
            con.commit();
        } catch (Exception e)
        {
            e.printStackTrace();
            try
            {
                con.rollback();
            } catch (SQLException se)  {    }
            throw new SQLException(e.getMessage());
        } finally
        {
            JdbcUtil.close(rs, ps, con);
        }
    }
//以下代码没有进行细致的异常捕获
    public void restoreImage(long id, String filename) throws  Exception
    {
        Connection con = ConnectionFactory.getConnection();
        Statement  st = con.createStatement();
String sql = "SELECT image  From ImageLibrary Where id = " + id;
        ResultSet rs = st.executeQuery(sql);
        while (rs.next())
        {
           Blob image = rs.getBlob("image");
           BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(filename));
            BufferedInputStream in = new BufferedInputStream(image.getBinaryStream());
           int c;
           while ((c = in.read()) != -1)   out.write(c);
           in.close();
           out.close();
        }
    }
}

 

(2)结果集游标的上下游动

 

[java] view plaincopyprint?

  1. con = ConnectionFactory.getConnection();
  2. st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
  3. String sql = "select id,no,owner,pwd,cdate,balance from sd0703_account";
  4. rs = st.executeQuery(sql);
  5. rs.afterLast(); //将光标移动到此 ResultSet 对象的末尾,正好位于最后一行之后。
  6. while(rs.previous())
  7. {
  8. System.out.print("id=" + rs.getInt(1));
  9. System.out.print(",no=" + rs.getString(2));
  10. System.out.print(",owner=" + rs.getString(3));
  11. System.out.print(",pwd=" + rs.getString(4));
  12. System.out.print(",cdate=" + rs.getDate(5));
  13. System.out.println(",balance=" + rs.getDouble(6));
  14. }
con = ConnectionFactory.getConnection();
st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
String sql = "select id,no,owner,pwd,cdate,balance from sd0703_account";
rs = st.executeQuery(sql);
rs.afterLast(); //将光标移动到此 ResultSet 对象的末尾,正好位于最后一行之后。
while(rs.previous())
{
     System.out.print("id=" + rs.getInt(1));
     System.out.print(",no=" + rs.getString(2));
     System.out.print(",owner=" + rs.getString(3));
     System.out.print(",pwd=" + rs.getString(4));
     System.out.print(",cdate=" + rs.getDate(5));
     System.out.println(",balance=" + rs.getDouble(6));
}

 

注:ResultSet静态常量字段(参见javax.sql.ResultSet)

ResultSet.TYPE_SCROLL_INSENSITIVE

该常量指示可滚动但通常不受 ResultSet 底层数据更改影响的 ResultSet 对象的类型。

ResultSet.CONCUR_READ_ONLY

该常量指示不可以更新的 ResultSet 对象的并发模式。

 

http://www.cnblogs.com/smileallen/archive/2013/02/16/3391573.html

 

时间: 2024-12-25 06:30:23

jdbc初步(转)的相关文章

JDK1.2关于JDBC中文问题的解决方案

解决|问题|中文 发信人: hht (Duke), 信区: Java 标  题: JDK1.2关于JDBC中文问题的解决方案&Re yzhang 发信站: 网易虚拟社区 (Mon Jan 11 13:29:43 1999), 转信 忙了几天,终于对JDK1.2的JDBC中文问题有了初步的了解,虽然还有问题存在,但我 想大家可能都着急了吧?:)所以就把我的初步想法先贴出来,欢迎大家补充. JDK1.2的中文问题主要是由于引入了Unicode引起的(其实在1.1版本中就有了),U nicode的字符

MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

[正文] 一.DAO模式简介 DAO即Data Access Object,数据访问接口.数据访问:故名思义就是与数据库打交道.夹在业务逻辑与数据库资源中间. DAO模式实际上是两个模式的组合,即Data Accessor (数据访问者)模式和 Active Domain Object(领域对象)模式.Data Accessor 模式实现了数据访问和业务逻辑的分离:Active Domain Object 模式实现了业务数据的对象化封装. 需要注意的是,DAO设计模式是Java EE中的设计模式

后台(06)——JDBC

探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Android多分辨率适配框架(3)- 使用指南 自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View

sql server-使用JDBC连接目标数据库会影响对方机器的负载/性能么

问题描述 使用JDBC连接目标数据库会影响对方机器的负载/性能么 最近在做一个项目,要在一个内部网络中安放一台机器来实时获得内部网络中数据库的内容,并不要影响对方机器的性能(也就是不影响对方的事务操作),使用HIBERNATE/JDBC来实现,初步想法是实时监控对方机器的负载/性能,选择负载低的时候去获取数据,现在我想知道使用JDBC会影响对方的负载/性能么,如果会的话,有哪些指标能衡量对方数据库的负载/性能呢(并给出获取指令),对方数据库类型有MySQL.SQL Server和Oracle三种

《Java 开发从入门到精通》—— 第1章 Java之印象 1.1 初步认识Java

第1章 Java之印象 Java 开发从入门到精通 究竟Java是什么呢?为什么让你在众多语言中选择并学习这门语言呢?本章将会为读者讲解这些疑惑.学完本章的内容,相信初学者会对Java有一个深刻的印象. 本章内容 初步认识Java 面向对象 技术解惑 卓越者的总结 对初学者的3条建议 理解Java的垃圾回收机制 1.1 初步认识Java    知识点讲解:光盘:视频\PPT讲解(知识点)\第1章\初步认识Java.mp4 纵观各大主流招聘媒体,总是会看到多条招聘Java程序员的广告.由此可以看出

【spring框架】spring整合hibernate初步

spring与hibernate做整合的时候,首先我们要获得sessionFactory. 我们一般只需要操作一个sessionFactory,也就是一个"单例",这一点很适合交给spring来管理. 下面的代码演示如何创建一个JDBC DataSource 和Hibernate SessionFactory: <beans> <bean id="myDataSource" class="org.apache.commons.dbcp.B

Python中字典的基本知识初步介绍

  这篇文章主要介绍了Python中字典的基本知识初步介绍,是Python入门中的基础知识,需要的朋友可以参考下 字典是可变的,并且可以存储任意数量的Python对象,包括其他容器类型另一个容器类型.字典包括键对(称为项目)及其相应的值. Python字典也被称为关联数组或哈希表.字典的一般语法如下: ? 1 dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'} 可以用下面的方式创建字典: ? 1 2 dict1 = { 'abc':

关于jdbc中插入和更新的问题

问题描述 关于jdbc中插入和更新的问题 我用的oracle用jdbc进行相关操作,可是,只有插入语句能执行,不能执行更新和删除语句,这是怎么回事呢? 解决方案 不能执行更新和删除语句,检查下代码有问题吗?运行时有没有异常信息呢?如果你用的是纯JDBC操作的话,问题就可能出在代码上,把代码的异常分支打印堆栈日子,检查更新删除操作有没有提交事务.事出必有因,仔细找找呗. 解决方案二: 那就是你的sq语句,出现问题了,和JDBC没有关系,既然你保存能进去,那就证明数据库连接成功,在好好检查一下. 解

java 连接异常-java 启动jdbc 事务报错 嵌套异常

问题描述 java 启动jdbc 事务报错 嵌套异常 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC