• jdbc数据访问技术


    jdbc数据访问技术

    1、JDBC如何做事务处理?

    Con.setAutoCommit(false)

    Con.commit();

    Con.rollback();

    2、写出几个在Jdbc中常用的接口

    preparedStatement, callableStatement, statement, Connection, ResultSet

    3、简述你对Statement,PreparedStatement,CallableStatement的理解

    statement用于执行静态 SQL 语句并返回它所生成结果的对象,在执行时确定sql。

     

     

     

    PreparedStatement表示预编译的 SQL 语句的对象。 SQL 语句被预编译并且存储在 PreparedStatement 对象中。然后可以使用此对象高效地多次执行该语句,可以传参数,在得到PreparedStatement对象时确定sql.

    CallableStatement用于执行 SQL 存储过程的接口。如果有输出参数要注册说明是输出参数

     

    4Java中访问数据库的步骤

    1连接Oracle数据库

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

    Connection con=DriverManager.openConnection(“jdbc:oracle:thin:@localhost:1521:DataBase ”,” UserName”,”Password ”)

    1. 利用JDBC检索出表中的数据

    Class.forName(“”);

    Connection con=DriverManager.openConnection(“ ”,” ”,” ”)

    preparedStatment  ps=Con.preparedStatment(“select * from [table]”);

    ResultSet rs=ps.executeQuery();

    While(rs.next) {

    Rs.getString(1) rs.getString(“字段名”)

    }

    5JDBC中的核心类及其作用是什么?

    DriverManager

    Class.forName();

    DriverManager.openConnection(“”,sa,””)

    Connection   

    PreparedStatement(Statement)

    ResultSet  rs=executeQuery()  dql

    While(rs.next()){}

    executeUpdate()  dml ddl

    6、执行存储过程用那一个类如何操作输出参数?(操作)

    CallableStatement c=con. prepareCall ("{call getCustomerName(?,?)}");

    c.setString(1,"1");

    c.registerOutParameter(2,java.sql.Types.VARCHAR);

    c.execute();

    c.getString(2);

    8、可能会让你写一段JdbcOracle的程序.

    Class.forName("oracle.jdbc.driver.OracleDriver");

            Connection con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:accp","system","system");

    9、Class.forName的作用?为什么要用?

    注册一个数据库驱动,将驱动加载到当前的JVM中。

    10、Jdo是什么?

    JDO是Java对象持久化的新的规范,为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API。JDO提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码(如JDBC API的使用)。这些繁琐的例行工作已经转移到JDO产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外,JDO很灵活,因为它可以在任何数据底层上运行。JDBC只是面向关系数据库(RDBMS)JDO更通用,提供到任何数据底层的存储功能,比如关系数据库、文件、XML以及对象数据库(ODBMS)等等,使得应用可移植性更强。(o/rMapping工具 集合处理)

    11在ORACLE大数据量下的分页解决方法。一般用截取ID方法,还有是三层嵌套方法

    create or replace package myPack

    is

    type c_type is ref cursor;

    procedure getPage(v_sql varchar2,pageSize number,pageIndex number,c out c_type);

    end;

    create or replace  package  body myPack

    is

    procedure getPage(v_sql varchar2,pageSize number,pageIndex number,c out c_type)

      is

        pageTotal int:=0;

        pageFirstRow int:=0;

        pageLastRow int:=0;

        rowTotal int:=0;

      begin

        execute immediate 'select count(*)  from ('||v_sql||')' into rowTotal;

        pageTotal:=ceil(rowTotal/pageSize);

        if(pageIndex<1) then

               raise_application_error(-20001,'页数不能小于1');

        end if;

        if(pageIndex>pageTotal) then

               raise_application_error(-20001,'页数太大,不能读取');

        end if;

        pageFirstRow:=(pageIndex-1)*pageIndex+1;

        pageLastRow:=pageFirstRow+pageSize;

        open c for ' select * from '||v_sql||' where rownum<'||

             pageLastRow||'minus select * from '||v_sql

             ||' where rownum<'||pageFirstRow;    

      end;

    end;

    1、注册Jdbc驱动程序的三种方式

    1、用JDBC如何调用存储过程

    代码如下:

    package com.huawei.interview.lym;

    import java.sql.CallableStatement;

    import java.sql.Connection;

    import java.sql.DriverManager;

    import java.sql.SQLException;

    import java.sql.Types;

    public class JdbcTest {

    /**

     * @param args

     */

    public static void main(String[] args) {

    // TODO Auto-generated method stub

    Connection cn = null;

    CallableStatement cstmt = null;

    try {

    //这里最好不要这么干,因为驱动名写死在程序中了

    Class.forName("com.mysql.jdbc.Driver");

    //实际项目中,这里应用DataSource数据,如果用框架,

    //这个数据源不需要我们编码创建,我们只需Datasource ds = context.lookup()

    //cn = ds.getConnection();

    cn = DriverManager.getConnection("jdbc:mysql:///test","root","root");

    cstmt = cn.prepareCall("{call insert_Student(?,?,?)}");

    cstmt.registerOutParameter(3,Types.INTEGER);

    cstmt.setString(1, "wangwu");

    cstmt.setInt(2, 25);

    cstmt.execute();

    //get第几个,不同的数据库不一样,建议不写

    System.out.println(cstmt.getString(3));

    } catch (Exception e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    finally

    {

    /*try{cstmt.close();}catch(Exception e){}

    try{cn.close();}catch(Exception e){}*/

    try {

    if(cstmt != null)

    cstmt.close();

    if(cn != null)

    cn.close();

    } catch (SQLException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    }

    1、JDBC中的PreparedStatement相比Statement的好处

    答:一个sql命令发给服务器去执行的步骤为:语法检查,语义分析,编译成内部指令,缓存指令,执行指令等过程。

    select * from student where id =3----缓存--?xxxxx二进制命令

    select * from student where id =3----直接取-?xxxxx二进制命令

    select * from student where id =4--- -?会怎么干?

    如果当初是select * from student where id =?--- -?又会怎么干?

     上面说的是性能提高

    可以防止sql注入。

    1. 写一个用jdbc连接并访问oracle数据的程序代码

    2、Class.forName的作用?为什么要用?

    答:按参数中指定的字符串形式的类名去搜索并加载相应的类,如果该类字节码已经被加载过,则返回代表该字节码的Class实例对象,否则,按类加载器的委托机制去搜索和加载该类,如果所有的类加载器都无法加载到该类,则抛出ClassNotFoundException。加载完这个Class字节码后,接着就可以使用Class字节码的newInstance方法去创建该类的实例对象了。

    有时候,我们程序中所有使用的具体类名在设计时(即开发时)无法确定,只有程序运行时才能确定,这时候就需要使用Class.forName去动态加载该类,这个类名通常是在配置文件中配置的,例如,spring的ioc中每次依赖注入的具体类就是这样配置的,jdbc的驱动类名通常也是通过配置文件来配置的,以便在产品交付使用后不用修改源程序就可以更换驱动类名。

    3、大数据量下的分页解决方法。

    答:最好的办法是利用sql语句进行分页,这样每次查询出的结果集中就只包含某页的数据内容。再sql语句无法实现分页的情况下,可以考虑对大的结果集通过游标定位方式来获取某页的数据。

    sql语句分页,不同的数据库下的分页方案各不一样,下面是主流的三种数据库的分页sql:

    sql server:

    String sql =

    "select top " + pageSize + " * from students where id not in" +

     "(select top " + pageSize * (pageNumber-1) + " id from students order by id)" +

     "order by id";

    mysql:

      

    String sql =

    "select * from students order by id limit " + pageSize*(pageNumber-1) + "," + pageSize;

    oracle:

    String sql =

     "select * from " +  

     (select *,rownum rid from (select * from students order by postime desc) where rid<=" + pagesize*pagenumber + ") as t" +

     "where t>" + pageSize*(pageNumber-1);

    4、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大).

    Connection cn = null;

    PreparedStatement pstmt =null;

    Resultset rs = null;

    try

    {

    Class.forname(driveClassName);

    cn =  DriverManager.getConnection(url,username,password);

    pstmt = cn.prepareStatement(“select  score.* from score ,student “ +

    “where score.stuId = student.id and student.name = ?”);

    pstmt.setString(1,studentName);

    Resultset rs = pstmt.executeQuery();

    while(rs.next())

    {

    system.out.println(rs.getInt(“subject”)  +  “    ” + rs.getFloat(“score”) );

    }

    }catch(Exception e){e.printStackTrace();}

    finally

    {

    if(rs != null) try{ rs.close() }catch(exception e){}

    if(pstmt != null) try{pstmt.close()}catch(exception e){}

    if(cn != null) try{ cn.close() }catch(exception e){}

    }

    5、这段代码有什么不足之处?

    try {

    Connection conn = ...;

    Statement stmt = ...;

    ResultSet rs = stmt.executeQuery("select * from table1");

    while(rs.next()) {

    }

    } catch(Exception ex) {

    }

    答:没有finally语句来关闭各个对象,另外,使用finally之后,要把变量的定义放在try语句块的外面,以便在try语句块之外的finally块中仍可以访问这些变量。

    36、说出数据连接池的工作机制是什么?

    J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。

    实现方式,返回的Connection是原始Connection的代理,代理Connection的close方法不是真正关连接,而是把它代理的Connection对象还回到连接池中。

    4、为什么要用 ORM?  和 JDBC 有何不一样?

    orm是一种思想,就是把object转变成数据库中的记录,或者把数据库中的记录转变成objecdt,我们可以用jdbc来实现这种思想,其实,如果我们的项目是严格按照oop方式编写的话,我们的jdbc程序不管是有意还是无意,就已经在实现orm的工作了。

    现在有许多orm工具,它们底层调用jdbc来实现了orm工作,我们直接使用这些工具,就省去了直接使用jdbc的繁琐细节,提高了开发效率,现在用的较多的orm工具是hibernate。也听说一些其他orm工具,如toplink,ojb等。

    8.可能会让你写一段Jdbc连Oracle的程序,并实现数据查询 
    答:程序如下:
    package hello.ant;
    import java.sql.*;
    public class jdbc
    {
    String dbUrl="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
    String theUser="admin";
    String thePw="manager";
    Connection c=null;
    Statement conn;
    ResultSet rs=null;
    public jdbc()
    {
    try{
    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
    c = DriverManager.getConnection(dbUrl,theUser,thePw);
    conn=c.createStatement();
    }catch(Exception e){
    e.printStackTrace();
    }
    }
    public boolean executeUpdate(String sql)
    {
    try
    {
    conn.executeUpdate(sql);
    return true;
    }
    catch (SQLException e)
    {
    e.printStackTrace();
    return false;
    }
    }
    public ResultSet executeQuery(String sql)
    {
    rs=null;
    try
    {
    rs=conn.executeQuery(sql);
    }
    catch (SQLException e)
    {
    e.printStackTrace();
    }
    return rs;
    }
    public void close()
    {
    try
    {
    conn.close();
    c.close();
    }
    catch (Exception e)
    {
    e.printStackTrace();
    }
    }
    public static void main(String[] args)
    {
    ResultSet rs;
    jdbc conn = new jdbc();
    rs=conn.executeQuery("select * from test");
    try{
    while (rs.next())
    {
    System.out.println(rs.getString("id"));
    System.out.println(rs.getString("name"));
    }
    }catch(Exception e)
    {
    e.printStackTrace();
    }
    }
    }

    9.Class.forName的作用?为什么要用 
    答:调用该访问返回一个以字符串指定类名的类的对象。

    10.Jdo是什么 
    答:JDO是Java对象持久化的新的规范,为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API。JDO提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码(如JDBC API的使用)。这些繁琐的例行工作已经转移到JDO产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外,JDO很灵活,因为它可以在任何数据底层上运行。JDBC只是面向关系数据库(RDBMSJDO更通用,提供到任何数据底层的存储功能,比如关系数据库、文件、XML以及对象数据库(ODBMS)等等,使得应用可移植性更强。

    21.存储过程和函数的区别
    存储过程是用户定义的一系列sql语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表。

    22.事务是什么
    事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为 ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能成为一个事务:
    原子性
    事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
    一致性
    事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。
    隔离性
    由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。
    持久性
    事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。

    23.游标的作用?如何知道游标已经到了最后
    游标用于定位结果集的行,通过判断全局变量@@FETCH_STATUS可以判断是否到了最后,通常此变量不等于0表示出错或到了最后。

    24.触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别
    事前触发器运行于触发事件发生之前,而事后触发器运行于触发事件发生之后。通常事前触发器可以获取事件之前和新的字段值。
    语句级触发器可以在语句执行前或后执行,而行级触发在触发器所影响的每一行触发一次。

    25.bean 实例的生命周期
             对于Stateless Session Bean、Entity Bean、Message Driven Bean一般存在缓冲池管理,而对于Entity Bean和Statefull Session Bean存在Cache管理,通常包含创建实例,设置上下文、创建EJB Object(create)、业务方法调用、remove等过程,对于存在缓冲池管理的Bean,在create之后实例并不从内存清除,而是采用缓冲池调度机制不断重用实例,而对于存在Cache管理的Bean则通过激活和去激活机制保持Bean的状态并限制内存中实例数量。

    1. dao 是什么及作用

    dao 是数据访问对象 DAO负责管理与数据源的连接来获取和储存其中的数据

    2. SQL中有个PrepardStatement对象,用Java实现连接Oracle数据库,运用PrepardStatement对象。ConnDB.java

    package demo.bean;

    import java.sql.Connection;

    import java.sql.DriverManager;

    import java.sql.PreparedStatement;

    import java.sql.ResultSet;

    public class ConnDB {

    public static void main(String[] args) {

    try{

    String driver = "oracle.jdbc.driver.OracleDriver";

    String url="jdbc:oracle:thin:@localhost:1521:yf";

    String username = "scott";

    String password = "tiger";

    DriverManager.registerDriver( new oracle.jdbc.OracleDriver());

    Connection con = DriverManager.getConnection(url, username, password);

    PreparedStatement stm = con.prepareStatement("select sysdate from dual");

    ResultSet rs = stm.executeQuery();

    while(rs.next()){

    System.out.print(rs.getString(1));

    }

    }catch(Exception e){

    e.printStackTrace();

    }

    }

    }

  • 相关阅读:
    XTU1199:Number Game
    SSL连接建立过程分析(1)
    JavaScript高级编程II
    PreferenceFragment 使用 小结
    crm使用soap更改下拉框的文本值
    POJ2241——The Tower of Babylon
    四个好看的CSS样式表格
    无论你在哪里上班,请记住下面黄金法则!
    js的for in循环和java里的foreach循环的差别
    具体解释EBS接口开发之物料导入API
  • 原文地址:https://www.cnblogs.com/justdoitba/p/8184147.html
Copyright © 2020-2023  润新知