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只是面向关系数据库(RDBMS)JDO更通用,提供到任何数据底层的存储功能,比如关系数据库、文件、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();

}

}

}

上一篇:Ural 1018 Binary Apple Tree


下一篇:IQueryable 和 IEnumerable