zoukankan      html  css  js  c++  java
  • jdbc

    最近学习了关于数据库的操作:(特别关于这个createStatement()函数学习了一下)

    createStatement()参数

    转载▼
    对数据库的操作进行过好多次,createStatement()方法也用了一次又一次,但是其中的参数却一直想当然的认为是固定的,每次用得时候要不 “ctrl+c”和“ctrl+v”来用,要不照葫芦画瓢就移过来了。今天终于忍受不了我自己的这种做法了,就查了一下文档和相关资料。
    createStatement()

    作用:创建一个Statement对象将SQL语句发送到数据库。
        在使用缺省参数设置的时候,ResultSet是一种只能访问一次、只能向前访问和只读的对象。也就是说只能访问该数据一次,若要再次访问,则必须重新查询数据库。

    createStatement(int resultSetType,int resultSetConcurrency)

    作用:创建一个Statement对象,该对象生成具有给定类型和并发性的ResultSet对象。
        参数resultSetType指定ResultSet的类型。其选项有:

    1. TYPE_FORWARD_ONLY:缺省类型。只允许向前滚动,并且不会受到其他用户对数据库所做更改的影响。
    2. TYPE_SCROLL_INSENSITIVE:允许向前或向后两个方向的滚动,不会受到其他用户对数据库所做更改的影响。
    3. TYPE_SCROLL_SENSITIVE: 允许向前或向后两个方向的滚动,受到其他用户对数据库所做更改的影响。即在该参数下,会及时跟踪数据库的更新,以便更改ResultSet中的数据。

    参数resultSetConcurrency设置ResultSet的并发性,该参数设定是否可以更新ResultSet。

      1. CONCUR_READ_ONLY:缺省值,指定不可以更新ResultSet

    CONCUR_UPDATABLE:指定可以更新ResultSet。

    JDBC一种用于执行SQL语句的JAVA API,它由一组用JAVA语言编写的类和接口组成。通过这些类和接口,JDBC把SQL语句发送给不同类型的数据库进行处理并接收处理结果。

    JDBC产品包括三个组件:

    (1)JDBC驱动程序管理器:是JDBC体系结构的支柱,主要作用是把JAVA应用程序连接到JDBC驱动程序上,然后退出。

    (2)JDBC驱动程序测试工具包:用于测试JDBC驱动程序,只有通过测试的驱动程序才被认为是“符合JDBC标准”的。

    (3)JDBC-ODBC桥:使ODBC驱动程序可被用作JDBC驱动程序,它的实现为JDBC的快速发展提供了一条途径。

     

    主要的类和接口:

    支持JDBC API的类和主要接口封装在Java.sql包和javax.sql包中。

    Java.sql.DriverManager是唯一的一个服务类,用于管理JDBC驱动程序,提供getConnection方法建立应用程序与数据库连接。当JDBC驱动程序加载到内存时,会自动向JDBC驱动程序进行注册,接着如果有连接数据库的请求,DriverManager类就会用注册的JDBC驱动程序来创建到数据库的连接。一般通过调用Class.forName(String str)来加载驱动程序。

    Java.sql.Connection接口定义到数据库的连接,用于制造Statement对象,提供数据库的信息。一个应用程序可与单个数据库有一个或多个连接,或者可与许多数据库有连接。

    Java.sql.Statement代表SQL语句的接口,通过executeQuery或executeUpdate方法执行一个静态的SQL语句。

    Java.sql.ResultSet接口维护查询得到的一张视图表,它提供了许多维护表记录的方法对数据库进行操作。

    Java.sql.SQLException类用于检查并报告用JDBC操作数据库时的错误。JAVA是一种安全性很好的语言,如果在类方法中声明了有例外处理,当在程序中创建对象实例,通过对象实例调用这些方法时都应该提供例外处理。

     

    JSP使用JDBC的过程:

    (1)  创建一个JDBC Driver连接实例或DataSource连接实例。

    (2)  使用连接实例创建一个连接

    (3)  使用JDBC连接创建声明语句

    (4)  调用声明语句的executeQuery获得结果集或executeUpdate修改数据库中的数据

    (5)  操作结果集的记录

    (6)  如果还需要这个连接创建其它结果集,从第3步开始重复

    (7)  释放结果集

    (8)  释放声明语句

    (9)  断开与数据库的连接

    JDBC驱动程序的类型:

    (1)       驱动程序类型一:将JDBC调用映射到其它类型的数据访问API上,最常用的是JDBC-ODBC桥连接驱动程序,它利用ODBC驱动程序提供JDBC的访问。要注意的是,使用这种类型的驱动程序必须在每个客户机上加载ODBC驱动程序,因此此类型使用于企业内部或者是用JAVA编写的三层结构的应用程序服务器代码。

    (2)       驱动程序类型二:是基于本地API,部分用JAVA来编写的驱动程序。这种类型的驱动程序将客户机API上的JDBC调用装换为Oracle、Sybase、Informix、DB2或其它DBMS的调用。

    (3)       驱动程序类型三:是JDBC网络纯JAVA驱动程序,这种驱动程序将JDBC装换为于DBMS无关的网络协议,此后这种协议将被某个服务器装换为一种DBMS协议。这种网络服务器中间件能够将它的纯JAVA客户机连接到多种不同的数据库上,因为它们仅仅依赖驱动程序和中间件之间的网络协议,而中间件提供数据库到应用程序之间的抽象。

    (4)       驱动程序类型四:是本地协议纯JAVA驱动程序,这类驱动程序将JDBC调用转换为DBMS所使用的网络协议,这将允许从客户机直接调用DBMS服务器,获得最大的网络传输速度。

     

    通过Driver接口建立连接:

    (1)加载驱动程序:

    Class.forName(类名),就可以将相应的核心类加载到驱动程序管理器中。

    (A)加载JDBC-ODBC桥驱动程序

            Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);

    (B)加载JDBC驱动程序

            Class.forName(“jdbc.driver_class_name”);

    (C)加载mysql驱动程序

        Class.forName(“org.gjt.mm.mysql.Driver”);

    (D)加载Oracle驱动程序

            Class.forName(“Oracle.jdbc.driver.OracleDriver”);

    (2)建立连接

    当驱动程序加载成功,就可以操作DriverManager类的getConnection方法建立同数据库的连接,格式如下:

    Connection conn=DriverManger.getConnection(url,login,password);

    对于不同的数据库驱动程序,其URL有所不同,但是必须遵从下面两个格式中的一个:

    Jdbc:driver-id:database-id

    Jdbc:driver-id://host/database-id

    例如:JDBC-ODBC桥驱动程序的格式:jdbc:odbc:数据源名

          Mysql jdbc驱动程序的格式:jdbc:mysql:///test

          Oracle jdbc驱动程序的格式:jdbc:oracle:thin:@myhost:1521:ORCL

     

    使用DataSource接口建立连接:使用JAVA命名和目录接口JNDI作为数据的存储和查询机制。首先使用JNDI的命名类制定一个驱动程序的名称和位置并装入该驱动程序。完成这一操作,需要建立一个目录形式的视图,创建一个InitialContext类(该类属于javax.naming包)表示的顶级域名,相当于一个目录形式的根目录,例如:

    InitialContext ctx=new InitialContext();//构造一个初始上下文

    DataSource ds=(DataSource)ctx.lookup(“jdbc/oracle”);

    获得了一个数据源后,就可以通过这个数据源的getConnection方法创建一个连接了:

        Connection conn=ds.getConnection(“username”,”pwd”);

    (3)声明语句

    声明语句的创建:JDBC提供了三个接口用于向数据库发送SQL语句,它们分别是: Statement,PreparedStatement,CallableStatement。Connection接口中的三个方法对应于创建上述三个接口实例,分别为:createStatement,preparedStatement,prepareCall。Statement对象用于发送简单的  SQL语句。PreparedStatement对象用于发送带有一个或多个输入参数的SQL语句,并且它经过预编译,效率要比使用Statament对象高。CallableStatement对象用于执行SQL存储程序,SQL存储程序是一组通过名称来调用的SQL语句。

    普通语句的创建:

    String cmd=”select * from BaseInfo”;

    Statement stmt=conn.createStatement(cmd);

    预编译语句的创建:

    String cmd=”select * from BaseInfo where major=?”;

    PreparedStatement stmt=conn.prepreadStatement(cmd);

    stmt.setString(1,”cs”);

    调用存储过程语句的创建:

    String cmd=“CALL LIST_ON_MAJOR(‘CS’)”;

    CallabelStatement stmt=conn.prepareCall(cmd);

    声明语句的执行:使用SQL语句对数据库执行的操作通常分为两类:一是查询数据库信息;二是操纵数据库数据。查询数据库信息操作需要返回查询结果集,操纵数据库操作需要返回操纵成功的记录数,所以Statement接口提供两种不同的执行方法完成两类操作。

    查询数据库信息:ResultSet rs=stmt.executeQuery(“select * from BaseInfo”);

    操纵数据库数据:ResultSet rs=stmt.executeUpdate(“insert into BaseInfo values(‘02010534’,’xiaoming’,’CS’)”);

    声明语句的释放:语句使用完毕,释放语句对象是良好的编程风格:stmt.close();

    4)结果集

    数据库创建结果集类型:

    l             read-only:只允许读取查询结果,读取顺序从头到尾值只能读一次。

    l         scroable:允许反复随机读取查询结果的任意记录。

    l         updateable允许对结果集作插入、修改和删除操作,并直接反应到后台数据库。

      结果集类提供了方法getType()检查结果集的类型,方法getConcurrency()检查当前记录的可操作类型。

    结果集类型:

    TYPE_FORWORD_ONLY:

        结果集为只读类型,并且读取顺序从头到尾值读取记录,只能读一次

       TYPE_SCROLL_SENSITIVE

        在他人同时对数据库操作时,会影响结果集中的纪录。

       TYPE_SCROLL_INSENSITIVE

       在他人同时对数据库操作时,不会影响结果集中的纪录。

    当前记录操作类型:

    CONCUR_READ_ONLY:结果集是只读的,不能改变当前记录。

    CONCUR_UPDATEABLE:结果集可以修改的,可以修改记录的值,插入记录,删除记录。

    在进行记录的修改操作时,通常要先检查可操作类型,    if(rs.getCurrency()!=ResultSet.CONCUR_UPDATEABLE)     system.err.println(“Error,cannot change rs”);

              结果集接口提供了next()方法,使游标向后移动一条记录,previous()方法使游标向前移动一条记录,组合使用这两个方法就可以实现访问结果集任意记录。

              遍历一个记录集的方法为:

              ResultSet rs=...

              while(rs.next()){

              ... ...

    •          }

        访问字段记录:

              结果集接口提供了一系列的getXXX方法访问字段的值,XXX表示返回值的类型,调用格式为:

        rs.getXXX((index/fieldname)

        获得结果集信息:

              在操作结果集时,经常需要获得一些额外的信息,如记录数、列名称等等,ResultSetMetaData接口通过元数据(Metadata)提供一个特定结果集的相关信息。例如:下面代码显示数据库的所有列信息:

              ResultSetMetsData  MetaData=rs.getMetaData();

              int num_columnes=MetaData.getColumnCount();

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

              Sytem.out.print(“column”);

    •          Sytem.out.print(i);                /*列位置*/

              Sytem.out.print(“name:”);

    •          Sytem.out.print(MataData.getColumnName(i));/*列名称*/

    •          }

        定位记录:

              使用absolute()方法可以定位到确定的一条记录上,例如:定位到第10条记录的语句为:

        rs.absolute(10)

        删除记录:

              使用deleteRow()方法可以删除到当前的一条记录上,例如:删除第5条记录的语句为:

     rs.absolute(5);

        rs.deleteRow()

        修改记录:

    rs.updateXXX(Index, value);

    例如:修改所有记录的major字段为”IT”的语句为:

    ResultSet rs=...

    ResultSetMetaData  MetaData=rs.getMetaData();

    int index_major=rs.findColumn(“major”);//返回字段major的序号

    if(rs.getCurrency()!==Result.CONCUR_UPDATEABLE)

    { system.err.println(“Error,can not change rs  ”);

      return;

    }

    while(rs.next())

    { rs.updateString(index_major,”IT”);

    }

    插入记录:

              为插入一条新记录,ResultSet专门创建了一条特殊的记录行,插入一条新纪录的步骤为:

    •          (1)调用movetoInsertRow()方法将游标指向插入行;

    •          (2)使用UpdateXXX()方法修改插入行字段值;

    •          (3)调用insertRow()方法将新记录加入到数据库;

    •          (4)调用movetoCurrentRow()返回当前修改行;

    例如增加一条学生记录的语句为:

    ResultSet rs=...

    if(rs.getCurrency()!==Result.CONCUR_UPDATEABLE)

    { system.err.println(“Error,can not change rs  ”);

      return;

    rs.movetoInsertRow();

    rs.UpdateString(1,”02010625”);

    rs.UpdateString(2,”yulei”);

    rs.UpdateString(3,”IT”);

    rs.insertRow();

    rs.movetoCurrentRow();

    -------------------------------------------------------------------------------

     

    JDBC

     

    1、 JDBC使用

     

    java数据库连接

     

    API分为两部分:java程序员java.sql、javax.sql包、jdbc驱动程序开发人员

     

    Driver:驱动程序

     

    DriverManager:驱动程序的管理类,利用连接字符串测试已注册的一个或多个驱动中哪个可用

     

    Connecton:数据库连接

     

    Statement:数据库的操作对象,PreparedStatement预编译、CallableStatement存储过程等

     

    ResultSet:结果集

     

    DataBaseMetaData(通过Connection获得,isReadOnly),ResultSetMetaData(通过ResultSet获得,rowCount),元数据有关容器本身结构方面的数据

     

    Types:类型

     

    开发步骤:

     

    注册驱动:三种方式(类加载器Class.forName,直接实例化驱动new ,使用java -Djdbc.drivers属性)

     

    建立连接:DriverManager.getConnection()——Driver.connect (PPT19检索连接示意图)

     

    创建Statement:createStatement,preparedStatement

     

    执行SQL:无改变的传至数据库

     

    处理结果集:while(rs.next()){rs.getInt…… setter/getter}

     

    关闭连接:ResultSet、Statement、Connection

     

    2、 高级特性

     

    元数据

     

    事务:事务包含若干条数据库操作,并且保证这些操作具有原子性,可以正确的恢复 ACID

     

    默认自动提交,setAutoCommit(false)——执行若干数据库操作——提交/回滚

     

    并发控制:脏读、不可重复读、幻读

     

    3、2.0核心特性

     

    可滚动、可更新结果集:前后滚动+相对/绝对定位,通过结果集对数据库进行增删改

     

           可更新结果集限制(单表、不能join、包含主键、不能为空、不能有默认值)

     

    批量更新:addBatch、executeBatch

     

    新增加数据类型:clob、blob流式读取(PPT67-69)

     

    4、2.0扩展

     

    数据源和JNDI:封装了数据库连接的具体细节,制定特定的逻辑名称将其绑定到JNDI服务器上

     

    连接池:利用对可重用数据库连接对象的缓存来提高数据库连接效率(牺牲空间换时间)

     

    行集RowSet(继承ResultSet):ResultSet(可滚动可更新)+Statement+Connection

     

     

     

    Hibernate

     

    JDBC适用于数据量较大、表之间关系较为简单

     

    Hibernate适用于数据量较小、表之间关系较为复杂

     

    1、 概述

     

    对象持久化:序列化、保存在数据库(CRUD)

     

    对象关系映射:java对象和关系型数据库之间的映射(类——表,对象——条目,属性——字段,关系——表间关系或表)

     

    PPT 8 Hibernate应用程序结构

     

    Session:连接和事务之间,非线程安全,轻量级,一线程一session

     

    Sessionfactory:获取Session,线程安全,重量级,多线程共享,缓存

     

    Configuration:配置对象,读取hbm.cfg.xml,*.hbm.xml,创建SessionFactory

     

    Transaction:jdbc事务/jta事务

     

    Query:执行HQL

     

    2、 实体映射

     

    id生成方式(oid独立于数据库,唯一,与业务无关,简化对象到表的映射):native、hilo、seqhilo、sequence(DB2)、increment、identity(DB2)、assigned(默认)、foreign、uuid-hex等等

     

    映射类型:java类型和SQL字段类型的映射类型

     

    integer、string、class(java.lang.Class——varchar2类全限定名)、clob、blob

     

    3、 持久化对象的管理

     

    对象状态:暂态(new创建、与session无关、没有id)、持久态(session管理、有id)、游离态(session管理过了、有id)

     

    状态管理 PPT38

     

    get(直接查数据库,找不到返回null)和load(先查缓存,找不到抛异常)

     

    list(Query接口下)、find(直接查数据库)和iterate(先通过id查缓存,找不到再去查数据库)

     

    close、clear、evict、lock、saveOrUpdate、delete

     

    自动脏检查

     

    批量处理:循环save,超过限量会报错

     

    Hibernatenate查询方式:根据id查询(单个)、HQL(常用、跟SQL类似、面向对象、只被Hibernate支持、不限制DB类型)、Criteria(模糊匹配、动态查询、只被Hibernate支持)、Native SQL(适用于不熟悉Hibernate,有些HQL不能实现的SQL,指定DB类型)

     

    4、 实体映射

     

    关联关系:单向、双向one-to-one(唯一外键、共享主键)one-to-many、many-to-many

     

    inverse(true放弃维护关系,one方写)、lazy(延迟加载带来的问题?fetch)

     

    传播性持久化:cascade:all、save-update、delete、delete-orphon、all-delete-orphon

     

    组件映射:某些对象不要求共享,没必要重新分配一张表

     

    集合映射:set(无序不重复)、bag(无序可重复,list实现)、list(有序可重复)、map(键值对)

     

    继承映射:

     

    table-per-class(支持多态、表太多)、table-per-concrete-class(表较少、重复定义属性、不支持多态)、table-per-class-hierarchy(表最少、表可能很大、支持多态)

     

    5、 事务和并发控制

     

    提交(某些查询,commit,flush)setFlushMode

     

    beginTransaction——commit

     

    读未提交(1)——读提交(2)——重复读(4)——串行(8)

     

    应用程序事务:悲观锁(慎重使用、效率太低)、乐观锁(version、timestamp)

     

    6、 高级查询

     

    分页setFirstResult、setMaxResult

     

    NamedQuery(查询语句写在映射文件按中)

     

    集合过滤session.createFilter()

     

    报表查询:like、投影、函数lower、分组、distinct、count(*)

     

    join(fetch 解决延迟加载问题)

     

    参数绑定(位置从1开始,名称:name)

     

     

  • 相关阅读:
    新概念第二册(1)--英语口语听力课1
    外企面试课程(一)---熟悉常见的缩略词
    公司 邮件 翻译 培训 长难句 结课
    workflow
    公司 邮件 翻译 培训 长难句 20
    公司 邮件 翻译 培训 长难句 19
    Engineering Management
    公司 邮件 翻译 培训 长难句 18
    公司 邮件 翻译 培训 长难句 17
    第14.5节 利用浏览器获取的http信息构造Python网页访问的http请求头
  • 原文地址:https://www.cnblogs.com/nucdy/p/4842578.html
Copyright © 2011-2022 走看看