• 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)

     

     

  • 相关阅读:
    Socket经验记录
    有了WCF,Socket是否已人老珠黄?
    更新Svn客户端后,右键菜单中没有TortoiseSVN了
    线程已被中止 “Thread was being aborted”
    c# 温故而知新: 线程篇(一)
    SOCKET是多线程安全的吗? [问题点数:40分,结帖人CSDN]
    <base href=""/> 的应用
    Python Twisted 框架中 socket通信
    本人作品-〉VPS应用>Discuz网页斗地主插件
    浅析 c# Queue
  • 原文地址:https://www.cnblogs.com/nucdy/p/4842578.html
Copyright © 2020-2023  润新知