就业秘籍

  面试第一个问题( 谈谈你自己的情况如何?
1.   报出自己的姓名和身份(其实面试官知道,只为礼貌)
2.   你可以简单地介绍一下你的学历、工作经历等基本个人情况
3.   如何去学习的过程
4.   为何选择这个行业
5.   职业理想( 1-2 年的目标)
6.   谢谢(礼貌结束)
你平时经常去哪些网站
(这些网站不但可以应付面试,对以后你们的工作和个人发展也有利,一般人我不告诉他^_^)
国内网站:
中国软件开发网 - http://www.csdn.net
中国最大的开发者网络,程序员必去的地方,讨论社区人气很旺。
软件开发交流社区 - http://www.javaeye.com
国内最棒的软件开发交流基地,开源源代码共享较多。
中国站长站 - http://www.chinaz.com
访问量很大的站长站,提供网站源码下载以及网站设计资料。
中国软件测试网 - http://www.51test.com
国内最大,资料最全,更新最快的软件测试网站,和项目管理网站
落伍者论坛 - http://www.im286.com
是一个较有人气的网站建设和网站程序的讨论区。
DoNews 写作社区 - http://www.donews.com/
IT 写作、博客和社区,参与的人不少是 IT 业界的名人。
编程爱好者网站 - http://www.programfan.com
提供各种流行语言的文章,源码,论坛。
Java 解决之道 - http://www.jdon.com
解惑授道,企业信息化解决之道。
国外网站:
[http://www.apache.org]- 我经常去那里看 tomcat,log4j,ant,struts,ibatis 的更新文档。
[http://java.sun.com] - 官方的 Java 开发者网站 - 每周都有新文章发表 .
[http://www.java.net] - Sun 公司维护的一个 Java 社区网站 .
[http://www.theserverside.com] - 这是一个讨论所有 Java 服务器端技术的网站 .
[http://www.javablogs.com] - 互联网上最活跃的一个 Java Blog 网站 .
[http://www.jguru.com] - 一个非常棒的采用 Q&A 形式的 Java 技术资源社区 .
[http://www.builder.com] - Cnet Builder.com 网站 - 所有的技术文章 , Java 为主 .
[http://www.ibm.com/developerworks/java] - IBM
Developerworks 技术网站 ; 这是其中的 Java 技术主页
[http://www.onjava.com] - O'Reilly Java 网站 . 每周都有新文章 .
可以讲一下你的特长吗
我的特长就是接受新知识的能力比较强,而且可以利用网络及时的获得新知识,并且能很快的应用到项目中去。比如:出现 ajax 技术,首先我要了解 ajax 技术是否成熟,看已经有哪些公司在使用,公司,技术人员对它的评价如何,如果认可了,我会很快的写出一个 helloWorld, 然后先把简单的应用到项目中,然后慢慢的应用到系统框架中去。
你比较熟悉哪些框架,你可以独立设计框架吗?
Jsp+servlet+ajax
Struts+jdbc+ajax
Struts+ibatis+Ioc/DI
Struts+ojb+ Abstract Factory
Struts+hibernate+ajax
Struts+hibernate+Spring
Struts+ibatis+Spring
Spring+hibernate
 
在开发中你是如何解决问题
1.        首先思考,结合自己积累的知识和经验尽量解决。
2.        借助网络 ( 搜索引擎 ) ,快速的解决问题。
3.        同事之间交流。
4.        论坛发帖, QQ 群, Msn 群,来交流解决。
5.        先解决问题,后面有时间了再更深层的研究,然后总结经验。
你可以描述一下软件开发的流程吗
需求确认 —— 概要设计 —— 详细设计 —— 编码 —— 单元测试 —— 集成测试 —— 系统测试 —— 维护
需求确认:需求规格说明书
概要设计:系统用例图,用例场景
详细设计:系统设计报告,数据库设计报告
测试:测试用例报告
目前比较流行的软件开发方法
软件开发方法
代表
适用范围
形成文档
测试驱动模型
XP
中小型项目
测试用例文档
用例驱动模型
RUP
大型项目
用例文档
领域驱动模型
DDD
各种项目
领域模型文档
项目开发中你一般选择哪些报表工具
开源报表选择
1.JFreeChart
JFreeChart 它主要是用来制作各种各样的图表,这些图表包括:饼图、柱状图 ( 普通柱状图以及堆栈柱状图 ) 、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等。
2.JasperReports+IReport
JasperReports 是一个基于 Java 的开源报表工具,它可以在 Java 环境下像其它 IDE 报表工具一样来制作报表。 JasperReports 支持 PDF HTML XLS CSV XML 文件输出格式。 JasperReports 是当前 Java 开发者最常用的报表工具。
iReport 是为 JasperReports 设计的强大的,直观的,易于使用的可视化报表设计器采用纯 Java 开发。这个工具允许用户可视化编辑包含 charts, 图片 , 子报表等的复杂报表。 iReport 还集成了 JFreeChart 图表制作包。允许用户可视化地编辑 XML JasperDesign 文件。用于打印的数据可以通过多种方式获取包括: JDBC, TableModels, JavaBeans, XML,Hibernate( 支持 HQL 查询语言 ), CSV 等。它支持多种输出格式包括: PDF,RTF,XML,XLS,CSV,HTM
收费报表
水晶报表
水晶报表( Crystal Report )是业内最专业、功能最强的报表系统,它除了强大的报表功能外,最大的优势是实现了与绝大多数流行开发工具的集成和接口。在 VS.Net 平台做过报表开发的程序员,一定都对水晶报表强大、高效、集成等特性留下了深刻印象。 除了开发新程序外,在工作中我们常需要接触到很多较早的软件系统报表功能升级的需求,如果能结合水晶报表这一强大的工具,往往能事半功倍。
MVC 的各个部分都有那些技术来实现 ? 如何实现 ?
MVC Model View Controller 的简写。 "Model" 代表的是应用的业务逻辑(通过 JavaBean EJB 组件实现), "View" 是应用的表示面(由 JSP 页面产生), "Controller" 是提供应用的处理过程控制(一般是一个 Servlet ),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。
BS CS 的联系与区别。
C/S Client/Server 的缩写。服务器通常采用高性能的 PC 、工作站或小型机,并采用大型数据库系统,如 Oracle Sybase Informix SQL Server 。客户端需要安装专用的客户端软件。
B/
S是 Brower/Server 的缩写,客户机上只要安装一个浏览器( Browser ),如 Netscape Navigator Internet Explorer ,服务器安装 Oracle Sybase Informix SQL Server 等数据库。在这种结构下,用户界面完全通过 WWW 浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现。浏览器通过W eb Server 同数据库进行数据交互。
C/S
B/S 区别:
1.硬件环境不同 :
   C/S 一般建立在专用的网络上 , 小范围里的网络环境 , 局域网之间再通过专门服务器提供连接和数据交换服务 .
   B/S 建立在广域网之上的 , 不必是专门的网络硬件环境 , 例与电话上网 , 租用设备 . 信息自己管理 . 有比 C/S 更强的适应范围 , 一般只要有操作系统和浏览器就行
2.对安全要求不同
   C/S 一般面向相对固定的用户群 , 对信息安全的控制能力很强 . 一般高度机密的信息系统采用 C/S 结构适宜 . 可以通过 B/S 发布部分可公开信息 .
   B/S 建立在广域网之上 , 对安全的控制能力相对弱 , 可能面向不可知的用户。
3.对程序架构不同
   C/S 程序可以更加注重流程 , 可以对权限多层次校验 , 对系统运行速度可以较少考虑 .
   B/S 对安全以及访问速度的多重的考虑 , 建立在需要更加优化的基础之上 . C/S 有更高的要求 B/S 结构的程序架构是发展的趋势 , MS .Net 系列的 BizTalk 2000 Exchange 2000 , 全面支持网络的构件搭建的系统 . SUN IBM 推的 JavaBean 构件技术等 , 使 B/S 更加成熟 .
4.软件重用不同
   C/S 程序可以不可避免的整体性考虑 , 构件的重用性不如在 B/S 要求下的构件的重用性好 .
   B/S 对的多重结构 , 要求构件相对独立的功能 . 能够相对较好的重用 . 就入买来的餐桌可以再利用 , 而不是做在墙上的石头桌子
5.系统维护不同  
   C/S 程序由于整体性 , 必须整体考察 , 处理出现的问题以及系统升级 . 升级难 . 可能是再做一个全新的系统
   B/S 构件组成 , 方面构件个别的更换 , 实现系统的无缝升级 . 系统维护开销减到最小 . 用户从网上自己下载安装就可以实现升级 .
6.处理问题不同
   C/S 程序可以处理用户面固定 , 并且在相同区域 , 安全要求高需求 , 与操作系统相关 . 应该都是相同的系统
   B/S 建立在广域网上 , 面向不同的用户群 , 分散地域 , 这是 C/S 无法作到的 . 与操作系统平台关系最小 .
7.用户接口不同
   C/S 多是建立的 Window 平台上 , 表现方法有限 , 对程序员普遍要求较高
   B/S 建立在浏览器上 , 有更加丰富和生动的表现方式与用户交流 . 并且大部分难度减低 , 减低开发成本 .
8.信息流不同
   C/S 程序一般是典型的中央集权的机械式处理 , 交互性相对低
   B/S 信息流向可变化 , B-B B-C B-G 等信息、流向的变化 , 更像交易中心。
j2ee 常用的设计模式?说明工厂模式。
    Java 中的 23 种设计模式:
Factory
(工厂模式),       Builder (建造模式),        Factory Method (工厂方法模式),
Prototype
(原始模型模式), Singleton (单例模式),     Facade (门面模式),
Adapter
(适配器模式),     Bridge (桥梁模式),         Composite (合成模式),
Decorator
(装饰模式),     Flyweight (享元模式),      Proxy (代理模式),
Command
(命令模式),       Interpreter (解释器模式), Visitor (访问者模式),
Iterator
(迭代子模式),    Mediator (调停者模式),     Memento (备忘录模式),
Observer
(观察者模式),    State (状态模式),          Strategy (策略模式),
Template Method
(模板方法模式), Chain Of Responsibleity (责任链模式)
工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。
请对以下在 J2EE 中常用的名词进行解释 ( 或简单描述 )
web 容器:给处于其中的应用程序组件( JSP SERVLET )提供一个环境,使 JSP,SERVLET 直接更容器中的环境变量接口交互,不必关注其它系统问题。主要有 WEB 服务器来实现。例如: TOMCAT,WEBLOGIC,WEBSPHERE 等。该容器提供的接口严格遵守 J2EE 规范中的 WEB APPLICATION 标准。我们把遵守以上标准的 WEB 服务器就叫做 J2EE 中的 WEB 容器。
EJB
容器: Enterprise java bean 容器。更具有行业领域特色。他提供给运行在其中的组件 EJB 各种管理功能。只要满足 J2EE 规范的 EJB 放入该容器,马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。
JNDI
:( Java Naming & Directory Interface JAVA 命名目录服务。主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能。
JMS
:( Java Message Service JAVA 消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。
JTA
:( Java Transaction API JAVA 事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。
JAF
:( Java Action FrameWork JAVA 安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。
RMI/IIOP:
Remote Method Invocation /internet 对象请求中介协议)他们主要用于通过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。 RMI JAVA 特有的。
你期待的薪资待遇
首先注意的是一定要告诉他范围
If( 工作地点 = 西安 ) then
Begin
If( 工作年限 >= 一年 ) then
begin
showMessage(“1800-2500”);
   end
   elseif( 工作年限 < 一年 ) then
begin
showMessage(“1500-2000”);
end
end
elseIf( 工作地点 = 深圳 ) then
Begin
If( 工作年限 < 一年 ) then
begin
showMessage(“3500-5000”);
   end
elseif( 工作年限 >= 一年 )
begin
showMessage(“4500-6000”);
end
end
// brain 里调试通过
 
 
JAVA 基础
1.          面向对象的特征有哪些方面   
1.
抽象 2. 继承 3. 封装 4. 多态性
2.          String 是最基本的数据类型吗 ?
基本数据类型包括 byte int char long float double boolean short
java.lang.String
类是 final 类型的 ,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用 StringBuffer
3.          int Integer 有什么区别
Java
提供两种不同的类型:引用类型和原始类型(或内置类型)。 Int java 的原始数据类型, Integer java int 提供的封装类。 Java 为每个原始类型提供了封装类。
原始类型(内置类型)
包装类型(封装类)
boolean
Boolean
char
Character
byte
Byte
short
Short
int
Integer
long
Long
float
Float
double
Double
当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null ,而原始类型实例变量的缺省值与它们的类型有关。
4 、String 和StringBuffer 的区别
String 类提供了数值不可改变的字符串 , StringBuffers 可以动态构造字符数据。
5、 说出 ArrayList,Vector, LinkedList 的存储性能和特性
ArrayList Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢, Vector 由于使用了 synchronized 方法(线程安全),通常性能上较 ArrayList 差,而 LinkedList 使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快
6 、& 和&& 的区别
    & 是位运算符,表示按位与运算, && 是逻辑运算符,表示逻辑与( and )。
7 、HashMap 和Hashtable 的区别
    HashMap Hashtable 的轻量级实现(非线程安全的实现),他们都完成了 Map 接口,主要区别在于 HashMap 允许空( null )键值( key , 由于非线程安全,效率上可能高于 Hashtable
HashMap
允许将 null 作为一个 entry key 或者 value ,而 Hashtable 不允许。
HashMap
Hashtable contains 方法去掉了,改成 containsvalue containsKey 。因为 contains 方法容易让人引起误解。
Hashtable
继承自 Dictionary 类,而 HashMap Java1.2 引进的 Map interface 的一个实现。
最大的不同是, Hashtable 的方法是 Synchronize 的,而 HashMap 不是,在多个线程访问 Hashtable 时,不需要自己为它的方法实现同步,而 HashMap 就必须为之提供外同步。
Hashtable
HashMap 采用的 hash/rehash 算法都大概一样,所以性能不会有很大的差异。
8.final, finally, finalize 的区别。
   final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally
是异常处理语句结构的一部分,表示总是执行。
finalize
Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。
9.Overload Override 的区别。 Overloaded 的方法是否可以改变返回值的类型 ?
方法的重写 Overriding 和重载 Overloading Java 多态性的不同表现。重写 Overriding 是父类与子类之间多态性的一种表现,重载 Overloading 是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding) 。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被 " 屏蔽 " 了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载 (Overloading) Overloaded 的方法是可以改变返回值的类型。
10.error 和exception 有什么区别?
error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。
    exception
表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。
11. 同步和异步有何异同,在什么情况下分别使用他们?举例说明。
如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。
12.abstract class 和interface 有什么区别?
声明方法的存在而不去实现它的类被叫做抽象类( abstract class ),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建 abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。 Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
接口( interface )是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义 static final 成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换, instanceof 运算符可以用来决定某对象的类是否实现了接口。
13.sleep() 和 wait() 有什么区别?
     sleep 是线程类( Thread )的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用 sleep 不会释放对象锁。
wait
Object 类的方法,对此对象调用 wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出 notify 方法(或 notifyAll )后本线程才进入对象锁定池准备获得对象锁进入运行状态。
14.GC 是什么? 为什么要有GC?
    GC 是垃圾收集器。 Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:  
System.gc() 
Runtime.getRuntime().gc() 
15.String s = new String("xyz"); 创建了几个 String Object? 
  两个对象,一个是“ xyz , 一个是指向“ xyz ”的引用对象 s  
16. 介绍 JAVA 中的 Collection FrameWork( 包括如何写自己的数据结构 )?
答: Collection FrameWork 如下:
Collection
List
│├ LinkedList
│├ ArrayList
│└ Vector
  Stack
Set
Map
Hashtable
HashMap
WeakHashMap
Collection
是最基本的集合接口,一个 Collection 代表一组 Object ,即 Collection 的元素( Elements
Map
提供 key value 的映射
Java 的通信编程,编程题 ( 或问答 ) ,用 JAVA SOCKET 编程,读服务器几个字符,再写入本地显示?
:Server 端程序 :
package test;
import java.net.*;
import java.io.*;

public class Server
{
private ServerSocket ss;
private Socket socket;
private BufferedReader in;
private PrintWriter out;
public Server()
{
try
{
ss=new ServerSocket(10000);
while(true)
{
socket = ss.accept();
String RemoteIP = socket.getInetAddress().getHostAddress();
String RemotePort = ":"+socket.getLocalPort();
System.out.println("A client come in!IP:"+RemoteIP+RemotePort);
in = new BufferedReader(new

InputStreamReader(socket.getInputStream()));
String line = in.readLine();
System.out.println("Cleint send is :" + line);
out = new PrintWriter(socket.getOutputStream(),true);
out.println("Your Message Received!");
out.close();
in.close();
socket.close();
}
}catch (IOException e)
{
out.println("wrong");
}
}
public static void main(String[] args)
{
new Server();
}
};
Client
端程序 :
package test;
import java.io.*;
import java.net.*;

public class Client
{
Socket socket;
BufferedReader in;
PrintWriter out;
public Client()
{
try
{
System.out.println("Try to Connect to 127.0.0.1:10000");
socket = new Socket("127.0.0.1",10000);
System.out.println("The Server Connected!");
System.out.println("Please enter some Character:");
BufferedReader line = new BufferedReader(new

InputStreamReader(System.in));
out = new PrintWriter(socket.getOutputStream(),true);
out.println(line.readLine());
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(in.readLine());
out.close();
in.close();
socket.close();
}catch(IOException e)
{
out.println("Wrong");
}
}
public static void main(String[] args)
{
new Client();
}
};
写一个方法,实现字符串的反转,如:输入 abc ,输出 cba
 public static String reverse(String s){
        int length=s.length();
        StringBuffer result=new StringBuffer(length);
        for(int i=length-1;i>=0;i--)
            result.append(s.charAt(i));
        return result.toString();
    }
类之间的关系 :

use-a :
依赖关系

has-a :
聚合关系

is-a :
继承关系 -- :A 类继承了 B , 此时 A 类不仅有了 B 类的方法 , 还有其自己的方法 .( 个性存在于共性中 )
16 .什么时候用assert
    assertion( 断言 ) 在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中, assertion 就是在程序中的一条语句,它对一个 boolean 表达式进行检查,一个正确程序必须保证这个 boolean 表达式的值为 true ;如果该值为 false ,说明程序已经处于不正确的状态下,系统将给出警告或退出。一般来说, assertion 用于保证程序最基本、关键的正确性。 assertion 检查通常在开发和测试时开启。为了提高性能,在软件发布后, assertion 检查通常是关闭的。
 
软件工程
数据库
问题描述:
为管理岗位业务培训信息,建立 3 个表 :
S (S#,SN,SD,SA)   S#,SN,SD,SA 
分别代表学号、学员姓名、所属单位、学员年龄
C (C#,CN )        C#,CN       
分别代表课程编号、课程名称
SC ( S#,C#,G )    S#,C#,G     
分别代表学号、所选修的课程编号、学习成绩

要求实现如下 5 个处理:
  1. 
使用标准 SQL 嵌套语句查询选修课程名称为 税收基础 的学员学号和姓名
  2. 
使用标准 SQL 嵌套语句查询选修课程编号为 ’C2’ 的学员姓名和所属单位
  3. 
使用标准 SQL 嵌套语句查询不选修课程编号为 ’C5’ 的学员姓名和所属单位
  4. 
使用标准 SQL 嵌套语句查询选修全部课程的学员姓名和所属单位
  5. 
查询选修了课程的学员人数
  6. 
查询选修课程超过 5 门的学员学号和所属单位
1. 使用标准 SQL 嵌套语句查询选修课程名称为 税收基础 的学员学号和姓名
-- 实现代码:
SELECT SN,SD FROM S
WHERE [S#] IN(
    SELECT [S#] FROM C,SC
    WHERE C.[C#]=SC.[C#]
        AND CN=N'
税收基础 ')
2. 使用标准 SQL 嵌套语句查询选修课程编号为 ’C2’ 的学员姓名和所属单位
-- 实现代码:
SELECT S.SN,S.SD FROM S,SC
WHERE S.[S#]=SC.[S#]
    AND SC.[C#]='C2'
3. 使用标准 SQL 嵌套语句查询不选修课程编号为 ’C5’ 的学员姓名和所属单位
-- 实现代码:
SELECT SN,SD FROM S
WHERE [S#] NOT IN(
    SELECT [S#] FROM SC 
    WHERE [C#]='C5')
4. 使用标准 SQL 嵌套语句查询选修全部课程的学员姓名和所属单位
-- 实现代码:
SELECT SN,SD FROM S
WHERE [S#] IN(
    SELECT [S#] FROM SC 
        RIGHT JOIN C ON SC.[C#]=C.[C#]
    GROUP BY [S#]
    HAVING COUNT(*)=COUNT(DISTINCT [S#]))
5. 查询选修了课程的学员人数
-- 实现代码:
SELECT 
学员人数 =COUNT(DISTINCT [S#]) FROM SC
6. 查询选修课程超过 5 门的学员学号和所属单位
-- 实现代码:
SELECT SN,SD FROM S
WHERE [S#] IN(
    SELECT [S#] FROM SC 
    GROUP BY [S#]
    HAVING COUNT(DISTINCT [C#])>5)
问题描述:
已知关系模式:
S (SNO,SNAME
                       学生关系。 SNO  为学号, SNAME  为姓名
C (CNO,CNAME,CTEACHER)  
课程关系。 CNO  为课程号, CNAME  为课程名, CTEACHER  为任课教师
SC(SNO,CNO,SCGRADE)       
选课关系。 SCGRADE  为成绩

要求实现如下 5 个处理:
  1
  找出没有选修过 李明 老师讲授课程的所有学生姓名
  2
  列出有二门以上(含两门)不及格课程的学生姓名及其平均成绩
  3
  列出既学过 “1” 号课程,又学过 “2” 号课程的所有学生姓名
  4
  列出 “1” 号课成绩比 “2” 号同学该门课成绩高的所有学生的学号
  5
  列出 “1” 号课成绩比 “2” 号课成绩高的所有学生的学号及其 “1” 号课和 “2” 号课的成绩
1. 找出没有选修过 李明 老师讲授课程的所有学生姓名
-- 实现代码:
SELECT SNAME FROM S
WHERE NOT EXISTS(
    SELECT * FROM SC,C
    WHERE SC.CNO=C.CNO
         AND C.CTEACHER='
李明 '
          AND SC.SNO=S.SNO)
2. 列出有二门以上(含两门)不及格课程的学生姓名及其平均成绩
-- 实现代码:
SELECT S.SNO,S.SNAME,AVG_SCGRADE=AVG(SC.SCGRADE)
FROM S,SC,(
    SELECT SNO
    FROM SC
    WHERE SCGRADE<60
    GROUP BY SNO
    HAVING COUNT(DISTINCT CNO)>=2
)A WHERE S.SNO=A.SNO AND SC.SNO=A.SNO
GROUP BY S.SNO,S.SNAME
3. 列出既学过 “1” 号课程,又学过 “2” 号课程的所有学生姓名
-- 实现代码:
SELECT S.SNO,S.SNAME
FROM S,(
    SELECT SC.SNO
    FROM SC,C
    WHERE SC.CNO=C.CNO
        AND C.CNAME IN('1','2')
    GROUP BY SNO
    HAVING COUNT(DISTINCT CNO)=2
)SC WHERE S.SNO=SC.SNO
4. 列出 “1” 号课成绩比 “2” 号同学该门课成绩高的所有学生的学号
-- 实现代码:
SELECT S.SNO,S.SNAME
FROM S,SC SC1,SC SC2
    WHERE SC1.CNO='1'
        AND SC2.SNO='2'
        AND SC1.CNO=S.CNO
        AND SC1.SCGRADE>SC2.SCGRADE
5. 列出 “1” 号课成绩比 “2” 号课成绩高的所有学生的学号及其 “1” 号课和 “2” 号课的成绩
-- 实现代码:
SELECT SC1.SNO,[1
号课成绩 ]=SC1.SCGRADE,[2 号课成绩 ]=SC2.SCGRADE
FROM SC SC1,SC SC2
WHERE SC1.CNO='1'
        AND SC2.CNO='2'
        AND SC1.SNO=SC2.SNO
        AND SC1.SCGRADE>SC2.SCGRADE
问题描述:
本题用到下面三个关系表:
CARD     
借书卡。    CNO  卡号, NAME   姓名, CLASS  班级
BOOKS    
图书。      BNO  书号, BNAME  书名 ,AUTHOR  作者, PRICE  单价, QUANTITY  库存册数  
BORROW   
借书记录。  CNO  借书卡号, BNO  书号, RDATE  还书日期
备注:限定每人每种书只能借一本;库存册数随借书、还书而改变。
要求实现如下 15 个处理:
  1
  写出建立 BORROW 表的 SQL 语句,要求定义主码完整性约束和引用完整性约束。
  2
  找出借书超过 5 本的读者 , 输出借书卡号及所借图书册数。
  3
  查询借阅了 " 水浒 " 一书的读者,输出姓名及班级。
  4
  查询过期未还图书,输出借阅者(卡号)、书号及还书日期。
  5
  查询书名包括 " 网络 " 关键词的图书,输出书号、书名、作者。
  6
  查询现有图书中价格最高的图书,输出书名及作者。
  7
  查询当前借了 " 计算方法 " 但没有借 " 计算方法习题集 " 的读者,输出其借书卡号,并按卡号降序排序输出。
  8
  "C01" 班同学所借图书的还期都延长一周。
  9
  BOOKS 表中删除当前无人借阅的图书记录。
  10
.如果经常按书名查询图书信息,请建立合适的索引。
  11
.在 BORROW 表上建立一个触发器,完成如下功能:如果读者借阅的书名是 " 数据库技术及应用 " ,就将该读者的借阅记录保存在 BORROW_SAVE 表中(注 ORROW_SAVE 表结构同 BORROW 表)。
  12
.建立一个视图,显示 " 01" 班学生的借书信息(只要求显示姓名和书名)。
  13
.查询当前同时借有 " 计算方法 " " 组合数学 " 两本书的读者,输出其借书卡号,并按卡号升序排序输出。
  14
.假定在建 BOOKS 表时没有定义主码,写出为 BOOKS 表追加定义主码的语句。
  15
.对 CARD 表做如下修改:
    a. 
NAME 最大列宽增加到 10 个字符(假定原为 6 个字符)。
    b. 
为该表增加 1 NAME (系名),可变长,最大 20 个字符。
1. 写出建立 BORROW 表的 SQL 语句,要求定义主码完整性约束和引用完整性约束
-- 实现代码:
CREATE TABLE BORROW(
    CNO int FOREIGN KEY REFERENCES CARD(CNO),
    BNO int FOREIGN KEY REFERENCES BOOKS(BNO),
    RDATE datetime,
    PRIMARY KEY(CNO,BNO))
2. 找出借书超过 5 本的读者 , 输出借书卡号及所借图书册数
-- 实现代码:
SELECT CNO,
借图书册数 =COUNT(*)
FROM BORROW
GROUP BY CNO
HAVING COUNT(*)>5
3. 查询借阅了 " 水浒 " 一书的读者,输出姓名及班级
-- 实现代码:
SELECT * FROM CARD c
WHERE EXISTS(
    SELECT * FROM BORROW a,BOOKS b 
    WHERE a.BNO=b.BNO
        AND b.BNAME=N'
水浒 '
        AND a.CNO=c.CNO)
4. 查询过期未还图书,输出借阅者(卡号)、书号及还书日期
-- 实现代码:
SELECT * FROM BORROW 
WHERE RDATE<GETDATE()
5. 查询书名包括 " 网络 " 关键词的图书,输出书号、书名、作者
-- 实现代码:
SELECT BNO,BNAME,AUTHOR FROM BOOKS
WHERE BNAME LIKE N'%
网络 %'
6. 查询现有图书中价格最高的图书,输出书名及作者
-- 实现代码:
SELECT BNO,BNAME,AUTHOR FROM BOOKS
WHERE PRICE=(
    SELECT MAX(PRICE) FROM BOOKS)
7. 查询当前借了 " 计算方法 " 但没有借 " 计算方法习题集 " 的读者,输出其借书卡号,并按卡号降序排序输出
-- 实现代码:
SELECT a.CNO
FROM BORROW a,BOOKS b
WHERE a.BNO=b.BNO AND b.BNAME=N'
计算方法 '
    AND NOT EXISTS(
        SELECT * FROM BORROW aa,BOOKS bb
        WHERE aa.BNO=bb.BNO
            AND bb.BNAME=N'
计算方法习题集 '
            AND aa.CNO=a.CNO)
ORDER BY a.CNO DESC
8. "C01" 班同学所借图书的还期都延长一周
-- 实现代码:
UPDATE b SET RDATE=DATEADD(Day,7,b.RDATE)
FROM CARD a,BORROW b
WHERE a.CNO=b.CNO
    AND a.CLASS=N'C01'
9. BOOKS 表中删除当前无人借阅的图书记录
-- 实现代码:
DELETE A FROM BOOKS a
WHERE NOT EXISTS(
    SELECT * FROM BORROW
    WHERE BNO=a.BNO)
10. 如果经常按书名查询图书信息,请建立合适的索引
-- 实现代码:
CREATE CLUSTERED INDEX IDX_BOOKS_BNAME ON BOOKS(BNAME)
11. BORROW 表上建立一个触发器,完成如下功能:如果读者借阅的书名是 " 数据库技术及应用 " ,就将该读者的借阅记录保存在 BORROW_SAVE 表中(注 ORROW_SAVE 表结构同 BORROW 表)
-- 实现代码:
CREATE TRIGGER TR_SAVE ON BORROW
FOR INSERT,UPDATE
AS
IF @@ROWCOUNT>0
INSERT BORROW_SAVE SELECT i.*
FROM INSERTED i,BOOKS b
WHERE i.BNO=b.BNO
    AND b.BNAME=N'
数据库技术及应用 '
12. 建立一个视图,显示 " 01" 班学生的借书信息(只要求显示姓名和书名)
-- 实现代码:
CREATE VIEW V_VIEW
AS
SELECT a.NAME,b.BNAME
FROM BORROW ab,CARD a,BOOKS b
WHERE ab.CNO=a.CNO
    AND ab.BNO=b.BNO
    AND a.CLASS=N'
01'
13. 查询当前同时借有 " 计算方法 " " 组合数学 " 两本书的读者,输出其借书卡号,并按卡号升序排序输出
-- 实现代码:
SELECT a.CNO
FROM BORROW a,BOOKS b
WHERE a.BNO=b.BNO
    AND b.BNAME IN(N'
计算方法 ',N' 组合数学 ')
GROUP BY a.CNO
HAVING COUNT(*)=2
ORDER BY a.CNO DESC
14. 假定在建 BOOKS 表时没有定义主码,写出为 BOOKS 表追加定义主码的语句
-- 实现代码:
ALTER TABLE BOOKS ADD PRIMARY KEY(BNO)
15.1 NAME 最大列宽增加到 10 个字符(假定原为 6 个字符)
-- 实现代码:
ALTER TABLE CARD ALTER COLUMN NAME varchar(10)
15.2 为该表增加 1 NAME (系名),可变长,最大 20 个字符
-- 实现代码:
ALTER TABLE CARD ADD 
系名  varchar(20)
 
Jsp/Servlet
jsp 有哪些内置对象 ? 作用分别是什么 ?
:JSP 共有以下 9 种基本内置组件(可与 ASP 6 种内部组件相对应):
  request 用户端请求,此请求会包含来自 GET/POST 请求的参数
response
网页传回用户端的回应
pageContext
网页的属性是在这里管理
session
与请求有关的会话期
application servlet
正在执行的内容
out
用来传送回应的输出
config servlet
的构架部件
page JSP
网页本身
exception
针对错误网页,未捕捉的例外
jsp 有哪些动作 ? 作用分别是什么 ?
:JSP 共有以下 6 种基本动作
jsp:include
:在页面被请求的时候引入一个文件。
Jsp:useBean
:寻找或者实例化一个 JavaBean
Jsp:setProperty
:设置 JavaBean 的属性。
Jsp:getProperty
:输出某个 JavaBean 的属性。
Jsp:forward
:把请求转到一个新的页面。
Jsp:plugin
:根据浏览器类型为 Java 插件生成 OBJECT EMBED 标记
两种跳转方式分别是什么 ? 有什么区别 ?
答:有两种,分别为:
<jsp:include page="included.jsp" flush="true">
<jsp:forward page= "nextpage.jsp"/>
前者页面不会转向 include 所指的页面,只是显示该页的结果,主页面还是原来的页面。执行完后还会回来,相当于函数调用。并且可以带参数 . 后者完全转向新页面,不会再回来。相当于 go to 语句。
会让你写一段 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();
}
}
}
说出Servlet 的生命周期,并说出Servlet 和CGI 的区别。
Servlet 被服务器实例化后,容器运行其 init 方法,请求到达时运行其 service 方法, service 方法自动派遣运行与请求对应的 doXXX 方法( doGet doPost )等,当服务器决定将实例销毁的时候调用其 destroy 方法。
cgi 的区别在于 servlet 处于服务器进程中,它通过多线程方式运行其 service 方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而 CGI 对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于 servlet
forward 和redirect 的区别
forward 是服务器请求资源,服务器直接访问目标地址的 URL ,把那个 URL 的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
    redirect
就是服务端根据逻辑 , 发送一个状态码 , 告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以 session,request 参数都可以获取
JSP 中动态INCLUDE 与静态INCLUDE 的区别?
动态 INCLUDE jsp:include 动作实现 <jsp:include page="included.jsp" flush="true" /> 它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。
静态 INCLUDE include 伪码实现 , 定不会检查所含文件的变化,适用于包含静态页面 <%@ include file="included.htm" %>
Xml 部分
1 xml 有哪些解析技术 ? 区别是什么 ?
: DOM,SAX,STAX
DOM:
处理大型文件时其性能下降的非常厉害。这个问题是由 DOM 的树结构所造成的,这种结构占用的内存较多,而且 DOM 必须在解析文件之前把整个文档装入内存 , 适合对 XML 的随机访问 SAX: 不现于 DOM,SAX 是事件驱动型的 XML 解析方式。它顺序读取 XML 文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理 XML 文件,适合对 XML 的顺序访问
STAX:Streaming API for XML (StAX)
2
、你在项目中用到了 xml 技术的哪些方面 ? 如何实现的 ?
: 用到了数据存贮,信息配置两方面。在做数据交换平台时,将不能数据源的数据组装成 XML 文件,然后将 XML 文件压缩打包加密后通过网络传送给接收者,接收解密与解压缩后再同 XML 文件中还原相关信息进行处理。在做软件配置时,利用 XML 可以很方便的进行,软件的各种配置参数都存贮在 XML 文件中。
Struts 部分
Struts 工作流程
TOMCAT 启动时:
   首先寻找项目下面的 web.xml 文件 , 读取 web.xml 文件并加载到内存 , 然后加载并实例化 ActionServlet( 控制器 )
ActionServlet
读取 struts-config.xml 文件的配置信息 , 为每一个 Action 映射定义信息 , 实例化一个 ActionMapping 对象 , 为每一个 form-bean 映射定义信息 , 实例化一个 ActionFrom 对象
向客户端发送一个请求:当用户发送一个请求时 , 经过 Web 服务器 ,web 服务器交给 ActionServlet 处理 ,ActionServlet 接收该请求 , 检索有没有与用户请求匹配
ActionMapping 实例 , 如果不存在 , 则返回错误信息 , 如果检索存在 ,ActionServlet
一方面把请求数据传递给 Formbean 实例化一个 Formbean 对象 , 并根据配置信息决定是否要进行表单验证 , 如果需要就调用 ActionForm validate() 方法执行 ;
另一方面 ActionServlet 根据 ActionMapping 实例包含的映射信息决定将请求转给哪个 Action, 如果相应的 Action 实例不存在就先创建这个实例 , 然后调用 Action execute() 方法执行
Actionr
execute() 方法返回一个 ActionForward 对象 ,ActionServlet 再把客户请求转发给 ActionForward 对象指向的 jsp 组件 ,
ActionForward
对象指向的 jsp 组件生成动态网页返回给客户
Struts 优点
1.   Struts Tomcat 一样是开源软件
2.   实现 MVC 模式,结构清晰 , 使开发者只关注业务逻辑的实现
3.     有丰富的 tag 可以用 ,Struts 的标记库 (Taglib) ,如能灵活动用,则能大大提高开发效率。另外,就目前国内的 JSP 开发者而言,除了使用 JSP 自带的常用标记外,很少开发自己的标记,或许 Struts 是一个很好的起点。 
4.     页面导航 . 页面导航将是今后的一个发展方向,事实上,这样做,使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。 
5.   提供 Exception 处理机制
6.   数据库链接池管理 
7.   支持 I18N 
Struts 缺点
转到展示层时,需要配置 forward ,每一次转到展示层,相信大多数都是直接转到 jsp ,而涉及到转向,需要配置 forward ,如果有十个展示层的 jsp ,需要配置十次 struts ,而且还不包括有时候目录、文件变更,需要重新修改 forward ,注意,每次修改配置之后,要求重新部署整个项目,而 tomcate 这样的服务器,还必须重新启动服务器,如果业务变更复杂频繁的系统,这样的操作简单不可想象。现在就是这样,几十上百个人同时在线使用我们的系统,大家可以想象一下,我的烦恼有多大。
    二、 Struts Action 必需是 thread safe 方式,它仅仅允许一个实例去处理所有的请求。所以 action 用到的所有的资源都必需统一同步,这个就引起了线程安全的问题。 
    三、 测试不方便 . Struts 的每个 Action 都同 Web 层耦合在一起,这样它的测试依赖于 Web 容器,单元测试也很难实现。不过有一个 Junit 的扩展工具 Struts TestCase 可以实现它的单元测试。 
    四、 类型的转换 . Struts FormBean 把所有的数据都作为 String 类型,它可以使用工具 Commons-Beanutils 进行类型转化。但它的转化都是在 Class 级别,而且转化的类型是不可配置的。类型转化时的错误信息返回给用户也是非常困难的
五、 Servlet 的依赖性过强 . Struts 处理 Action 时必需要依赖 ServletRequest ServletResponse ,所有它摆脱不了 Servlet 容器。 
    六、 前端表达式语言方面 .Struts 集成了 JSTL ,所以它主要使用 JSTL 的表达式语言来获取数据。可是 JSTL 的表达式语言在 Collection 和索引属性方面处理显得很弱。 
    七、 Action 执行的控制困难 . Struts 创建一个 Action ,如果想控制它的执行顺序将会非常困难。甚至你要重新去写 Servlet 来实现你的这个功能需求。 
   八、 Action 执行前和后的处理 . Struts 处理 Action 的时候是基于 class hierarchies ,很难在 action 处理前和后进行操作。 
    九、 对事件支持不够 . struts 中,实际是一个表单 Form 对应一个 Action ( DispatchAction) ,换一句话说:在 Struts 中实际是一个表单只能对应一个事件, struts 这种事件方式称为 application event application event component event 相比是一种粗粒度的事件。 
    Struts 重要的表单对象 ActionForm 是一种对象,它代表了一种应用,这个对象中至少包含几个字段,这些字段是 Jsp 页面表单中的 input 字段,因为一个表单对应一个事件,所以,当我们需要将事件粒度细化到表单中这些字段时,也就是说,一个字段对应一个事件时,单纯使用 Struts 就不太可能,当然通过结合 JavaScript 也是可以转弯实现的。
Hibernate 部分
请简单描述一下hibernate
Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。
Hibernate
可以应用在任何使用 JDBC 的场合,既可以在 Java 的客户端程序实用,也可以在 Servlet/JSP Web 应用中使用,最具革命意义的是, Hibernate 可以在应用 EJB J2EE 架构中取代 CMP ,完成数据持久化的重任。
大多数开发机构经常采取创建各自独立的数据持久层。一旦底层的数据结构发生改变,那么修改应用的其余部分使之适应这种改变的代价将是十分巨大的。 Hibernate 适时的填补了这一空白,它为 Java 应用提供了一个易用的、高效率的对象关系映射框架。 hibernate 是个轻量级的持久性框架,功能却非常丰富。
Hibernate 优点
Hibernate 使用 Java 反射机制 而不是字节码增强程序来实现透明性。
Hibernate 的性能非常好,因为它是个轻量级框架。 映射的灵活性很出色。
它支持各种关系数据库,从一对一到多对多的各种复杂关系。
Hibernate 缺点:
它限制您所使用的对象模型。 ( 例如,一个持久性类不能映射到多个表 ) 其独有的界面和可怜的市场份额也让人不安,尽管如此, Hibernate 还是以其强大的发展动力减轻了这些风险。其他的开源持久性框架也有一些,不过都没有 Hibernate 这样有市场冲击力。
Hibernate 从三个框架中分析如下:
传统的架构:
1) Session Bean <-> Entity Bean <-> DB
为了解决性能障碍的替代架构:
2) Session Bean <-> DAO <-> JDBC <-> DB
使用 Hibernate 来提高上面架构的开发效率的架构:
3) Session Bean <-> DAO <-> Hibernate <-> DB
 
就上面 3 个架构来分析:
1 、内存消耗:采用 JDBC 的架构 2 无疑是最省内存的, Hibernate 的架构 3 次之, EB 的架构 1 最差。
2 、运行效率:如果 JDBC 的代码写的非常优化,那么 JDBC 架构运行效率最高,但是实际项目中,这一点几乎做不到,这需要程序员非常精通 JDBC ,运用 Batch 语句,调整 PreapredStatement Batch Size Fetch Size 等参数,以及在必要的情况下采用结果集 cache 等等。而一般情况下程序员是做不到这一点的。因此 Hibernate 架构表现出最快的运行效率。 EB 的架构效率会差的很远。
3 、开发效率:在有 JBuilder 的支持下以及简单的项目, EB 架构开发效率最高, JDBC 次之, Hibernate 最差。但是在大的项目,特别是持久层关系映射很复杂的情况下, Hibernate 效率高的惊人, JDBC 次之,而 EB 架构很可能会失败。
4 、分布式,安全检查,集群,负载均衡的支持
Hibernate 的核心接口一共有 5 个,分别为 :Session SessionFactory Transaction Query Configuration 。这 5 个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。下面对这五的核心接口分别加以介绍。
Hibernate 核心接口
  · Session 接口 :Session 接口负责执行被持久化对象的 CRUD 操作 (CRUD 的任务是完成与数据库的交流,包含了很多常见的 SQL 语句。 ) 。但需要注意的是 Session 对象是非线程安全的。同时, Hibernate session 不同于 JSP 应用中的 HttpSession 。这里当使用 session 这个术语时,其实指的是 Hibernate 中的 session ,而以后会将 HttpSesion 对象称为用户 session
  · SessionFactory 接口 :SessionFactroy 接口负责初始化 Hibernate 。它充当数据存储源的代理,并负责创建 Session 对象。这里用到了工厂模式。需要注意的是 SessionFactory 并不是轻量级的,因为一般情况下,一个项目通常只需要一个 SessionFactory 就够,当需要操作多个数据库时,可以为每个数据库指定一个 SessionFactory
 
· Configuration 接口 :Configuration 接口负责配置并启动 Hibernate ,创建 SessionFactory 对象。在 Hibernate 的启动的过程中, Configuration 类的实例首先定位映射文档位置、读取配置,然后创建 SessionFactory 对象。

· Transaction 接口 :Transaction 接口负责事务相关的操作。它是可选的,可发人员也可以设计编写自己的底层事务处理代码。
  · Query Criteria 接口 :Query Criteria 接口负责执行各种数据库查询。它可以使用 HQL 语言或 SQL 语句两种表达方式。
Hibernate 配置文件详解
?xml version="1.0"?
!—
所有的 XML 映射文件都需要定义如下所示的 DOCTYPE
Hibernate 会先在它的类路径( classptah )中搜索 DTD 文件。

--
!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http
//hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"

!--
hibernate-mapping
有几个可选的属性:
schema
属性指明了这个映射的表所在的 schema 名称。
default-cascade
属性指定了默认的级联风格 可取值有 none save update
auto-import
属性默认让我们在查询语言中可以使用非全限定名的类名 可取值有 true false
package
属性指定一个包前缀。
--


hibernate-mapping schema="schemaName" default-cascade="none"
auto-import="true" package="test"


!-- class 元素来定义一个持久化类 --
class name="People" table="person"
!-- id 元素定义了属性到数据库表主键字段的映射。 --
id name="id"
!-- 用来为该持久化类的实例生成唯一的标识 --
generator class="native"/
/id
!-- discriminator 识别器 是一种定义继承关系的映射方法 --

discriminator column="subclass" type="character"/
!-- property 元素为类声明了一个持久化的, JavaBean 风格的属性 --
property name="name" type="string"
column name="name" length="64" not-null="true" /
/property

property name="sex"
not-null="true"
update="false"/


!-- 多对一映射关系 --
many-to-one name="friend"
column="friend_id"
update="false"/


!-- 设置关联关系 --

set name="friends" inverse="true" order-by="id"
key column="friend_id"/
! —一对多映射 --
one-to-many class="Cat"/
/set
/class
/hibernate-mapping
Hibernate 标识生成策略
表1 Hibernate标识生成策略
标识符生成器
描述
increment
适用于代理主键。由Hibernate自动以递增方式生成。
identity
适用于代理主键。由底层数据库生成标识符。
sequence
适用于代理主键。Hibernate根据底层数据库的序列生成标识符,这要求底层数据库支持序列。
hilo
适用于代理主键。Hibernate分局high/low算法生成标识符。
seqhilo
适用于代理主键。使用一个高/低位算法来高效的生成long,short或者int类型的标识符。
native
适用于代理主键。根据底层数据库对自动生成标识符的方式,自动选择identity、sequence或hilo。
uuid.hex
适用于代理主键。Hibernate采用128位的UUID算法生成标识符。

uuid.string
适用于代理主键。UUID被编码成一个16字符长的字符串。
assigned
适用于自然主键。由Java应用程序负责生成标识符。
foreign
适用于代理主键。使用另外一个相关联的对象的标识符。
 
请介绍一下Hibernate缓存机制
Cache 是在提升系统性能方面常用的方法,在Hibernate中通常有非常好的对于Cache的支持方法,Hibernate中对于Cache有一级缓存和二级缓存的概念,一级缓存是必须的,位于Session部分,二级缓存则不是必须的,由开发人员自行指定,二级缓存可指定使用何种开源的cache工具,Hibernate 3以后的版本默认使用的是Ehcache,也可以切换为Oscache、JbossCache,对我而言最重要的区别在于对于cluster的支持上。
二级缓存能够明显的提高系统的性能,当然,同时也会更加的消耗内存,可以通过配置文件来指定内存中能够加载的最多的元素,这有利于避免消耗过多内存。
二级缓存的设置在Hibernate中非常的简单,只需要在相应的hbm.xml中增加cache元素,指明使用何种策略,如read-only、read-write等,也可以直接在hibernate.cfg.xml中增加class-cache的方式来进行全局指定。
白话理解
hibernate session 提供了一级缓存,每个 session ,对同一个 id 进行两次 load ,不会发送两条 sql 给数据库,但是 session 关闭的时候,一级缓存就失效了。
二级缓存是 SessionFactory 级别的全局缓存,它底下可以使用不同的缓存类库,比如 ehcache oscache 等,需要设置 hibernate.cache.provider_class ,我们这里用 ehcache ,在 2.1 中就是 hibernate.cache.provider_class=net.sf.hibernate.cache.EhCacheProvider 如果使用查询缓存,加上 hibernate.cache.use_query_cache=true
  缓存可以简单的看成一个 Map ,通过 key 在缓存里面找 value
Spring 部分
请介绍一下Spring
它是一个开源的项目,而且目前非常活跃;它基于 IoC Inversion of Control ,反向控制)和 AOP 的构架多层 j2ee 系统的框架,但它不强迫你必须在每一层 中必须使用 Spring ,因为它模块化的很好,允许你根据自己的需要选择使用它的某一个模块;它实现了很优雅的 MVC ,对不同的数据访问技术提供了统一的 接口,采用 IoC 使得可以很容易的实现 bean 的装配,提供了简洁的 AOP 并据此实现 Transcation Managment ,等等
Spring 优点
a.      Spring 能有效地组织你的中间层对象,不管你是否选择使用了 EJB 。如果你仅仅使用了 Struts 或其他为 J2EE API 特制的 framework Spring 致力于解决剩下的问题。
b.     b. Spring 能消除在许多工程中常见的对 Singleton 的过多使用。根据我的经验,这是一个很大的问题,它降低了系统的可测试性和面向对象的程度。
c.     c. 通过一种在不同应用程序和项目间一致的方法来处理配置文件, Spring 能消除各种各样自定义格式的属性文件的需要。曾经对某个类要寻找的是哪个魔法般的属性项或系统属性感到不解,为此不得不去读 Javadoc 甚至源编码?有了 Spring ,你仅仅需要看看类的 JavaBean 属性。 Inversion of Control 的使用(在下面讨论)帮助完成了这种简化。
d.     .? 通过把对接口编程而不是对类编程的代价几乎减少到没有, Spring 能够促进养成好的编程习惯。
e.     Spring 被设计为让使用它创建的应用尽可能少的依赖于他的 APIs 。在 Spring 应用中的大多数业务对象没有依赖于 Spring
f.     使用 Spring 构建的应用程序易于单元测试。
g.     Spring 能使 EJB 的使用成为一个实现选择 , 而不是应用架构的必然选择。你能选择用 POJOs local EJBs 来实现业务接口,却不会影响调用代码。
h.     Spring 帮助你解决许多问题而无需使用 EJB Spring 能提供一种 EJB 的替换物,它们适用于许多 web 应用。例如, Spring 能使用 AOP 提供声明性事务管理而不通过 EJB 容器,如果你仅仅需要与单个数据库打交道,甚至不需要一个 JTA 实现。
i.     Spring 为数据存取提供了一个一致的框架 , 不论是使用的是 JDBC 还是 O/R mapping 产品(如 Hibernate )。
Spring
确实使你能通过最简单可行的解决办法来解决你的问题。而这是有有很大价值的。
Spring 缺点
a.     缺点:使用人数不多、 jsp 中要写很多代码、控制器过于灵活,缺少一个公用控制器
Spring 工作流程
请求的分发
请求首先到达DispatcherServlet,应用服务器会根据Web应用中web.xml文件定义的url映射将相应的请求分发到DispatcherServlet中
请求的处理
DispatcherServlet 会查找相应的HandlerMapping接口的实现类,调用其中的方法:HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception,该方法会返回一个HandlerExecutionChain。返回的HandlerExecutionChain中包含了零个或者是多个Interceptor和一个处理请求的Handler。DispatcherServlet会调用Interceptor中的preHandle() 方法。然后处理Handler,这个Handler相当于Struts中Action,在SpringMVC中默认的实现是Controller接口,是具体处理请求的代码所驻留的地方。事实上HandlerExecutionChain中的getHandler()返回的是一个Object类型。DispatcherServlet不会直接调用getHandler()返回对象中的方法,DispatcherServlet会查找相应的HandlerAdapter,然后具体通过HandlerAdapter来调用getHandler()返回的handler对象中的方法。就是说我们可以实现自己的HandlerAdapter然后通过IoC注入到DispatcherServlet中,从而可以实现一套自定义的控制器。随后DispatcherServlet会调用Interceptor中的postHandle()方法。
视图的处理
DispatcherServlet 会期望Hander返回一个ModelAndView,DispatcherServlet会根据所返回的ModelAndView对象所包含的信息进行视图的渲染。起具体出来流程如下:
首先DispatcherServlet会根据LocaleResolver来识别请求中的Locale,开发人员可以自己实现LocaleResolver接口,然后通过IoC注入到DispatcherServlet中,然后DispatcherServlet会判断ModelAndView中是否已经包含了接口View的具体实现,如果包含了,则直接调用View中的方法render(Map model, HttpServletRequest request, HttpServletResponse response)。如果不包含,则说明该ModelAndView只是包含了View的名称引用,DispatcherServlet会调用ViewResolver中的resolveViewName(String viewName, Locale locale)来解析其真正的视图。该方法会返回一个View的具体实现。
视图的渲染
Spring 支持多种视图技术,其中比较常用的包括有Jstl视图,Veloctiy视图,FreeMarker视图等。对Jstl视图的渲染Spring是通过JstlView这个类具体实现的。事实上其最终的渲染是交给容器来做的,Spring只是通过RequestDispatcher实现了服务器内部请求的Forward。而对于模板视图,如Veloctiy和FreeMarker等,Spring会初始化其相应的模板引擎,由模板引擎生成最终的Html页面然后在合并到Response的输出流中。
异常的处理
如果在Hander中处理请求是抛出异常,DispatcherServlet会查找HandlerExceptionResolver接口的具体实现,该接口定义了一个方法:
ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) ,实现类需要实现该方法以便对异常进行处理,最后该方法需要返回一个ModelAndView。
SpringMVC 的一些总结
灵活的Interceptor,通过Interceptor我们可以在一个请求处理前和请求处理完成之后做相应的操作,通过Interceptor机制,我们可以做authentication, logging, and filtering等。
良好的表单支持,在SpringMVC的Controller继承体系结构中,其具体的子类对表单(Form)提供了良好的支持。能够很好的支持单个表单的显示、修改、提交操作。同时也提供了表单的分步提交。
可定制的数据绑定(Data Binding)。
多视图技术的支持,SpringMVC同时支持Jstl, Velocity 等多中视图技术,但是这同时也会引出一个问题,因为各种视图技术都有自己的一套方法来处理国际化,例如Jstl和Velocity处理国际化的方式就很不相同。因此在多个视图技术并存的应用中,国际化也是一个需要注意的问题。
其Handler(控制器)作为Bean定义在Spring容器中,因此能享受容器带来的服务。
Handler(控制器)具有良好的可测试性。
 
Ejb 部分
1. EJB 是基于哪些技术实现的?并说出SessionBean 和EntityBean 的区别,StatefulBean 和StatelessBean 的区别
    EJB 包括 Session Bean Entity Bean Message Driven Bean ,基于 JNDI RMI JAT 等技术实现。
SessionBean
J2EE 应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他 EJB 组件。 EntityBean 被用来代表应用系统中用到的数据。
对于客户机, SessionBean 是一种非持久性对象,它实现某些在服务器上运行的业务逻辑。
对于客户机, EntityBean 是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。
Session Bean
还可以再细分为 Stateful Session Bean Stateless Session Bean ,这两种的 Session Bean 都可以将系统逻辑放在 method 之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来说,一个使用者会有一个相对应的 Stateful Session Bean 的实体。 Stateless Session Bean 虽然也是逻辑组件,但是他却不负责记录使用者状态,也就是说当使用者呼叫 Stateless Session Bean 的时候, EJB Container 并不会找寻特定的 Stateless Session Bean 的实体来执行这个 method 。换言之,很可能数个使用者在执行某个 Stateless Session Bean methods 时,会是同一个 Bean Instance 在执行。从内存方面来看, Stateful Session Bean Stateless Session Bean 比较, Stateful Session Bean 会消耗 J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态。
2.EJB 与JAVA BEAN 的区别?
Java Bean 是可复用的组件,对 Java Bean 并没有严格的规范,理论上讲,任何一个 Java 类都可以是一个 Bean 。但通常情况下,由于 Java Bean 是被容器所创建(如 Tomcat )的,所以 Java Bean 应具有一个无参的构造器,另外,通常 Java Bean 还要实现 Serializable 接口用于实现 Bean 的持久性。 Java Bean 实际上相当于微软 COM 模型中的本地进程内 COM 组件,它是不能被跨进程访问的。 Enterprise Java Bean 相当于 DCOM ,即分布式组件。它是基于 Java 的远程方法调用( RMI )技术的,所以 EJB 可以被远程访问(跨进程、跨计算机)。但 EJB 必须被布署在诸如 Webspere WebLogic 这样的容器中, EJB 客户从不直接访问真正的 EJB 组件,而是通过其容器访问。 EJB 容器是 EJB 组件的代理, EJB 组件由容器所创建和管理。客户通过容器来访问真正的 EJB 组件。
各大银行借记卡取款手续费比较表
国内银行汇款比较
  目前各银行汇款通常都有两种方式,一种是直接到银行汇款的柜台式汇款,一种则是通过网上银行或电话银行汇款。
 
  农业银行
  手续费用:分为存款汇款和电子汇款两种,存款汇款最低手续费 1元,超过1000元,按0.5%收取费用。由于国内很多地区目前还没开通收费服务,所以还可以暂时享受免手续费的优惠。电子汇款最低手续费1元,超过100元按1%收费。
  到款时间:实时到账。
  网上银行:与柜台式汇款收费相同。
  缺点:分为无卡汇款和汇款两种。无卡汇款即无需办理银行卡,直接用现金汇到指定银行卡上即可。但目前大多数农行网点在使用无卡汇款时,无法确认收款人姓名,所以一旦填错卡号,就可能导致汇到其他人账号上。要将款重新划出,就需要得到收款人的确认,十分麻烦。另外,晚上 8点后到第二天早上8点间,无法通过网上汇款。
 
  招商银行
  手续费用:分为两种,一种是快速汇款,最低手续费 5元,超过1000元,按0.5%收取费用。适合1万元以内汇款金额;另一种是电子汇款,最低手续费10元,汇款手续为汇款金额的1%,最高封顶手续费为50元,适合1万元以上汇款金额。
  到款时间:快递汇款可以实时到账;电子汇款到账时间为 2-3个工作日。
  网上银行:每笔收费 5元。跨行汇款收费10元。
  缺点:如果低于 500元的汇款,与其他银行相比费用最高。通过网上银行汇款时,如接收方为同行汇款,需要点击“同行速汇”,否则统一按10元收费。
 
  建设银行
  手续费用:最低手续费 1元,最高手续费为50元。
  汇款方式:汇款方必须持有银行卡。
  到款时间:分为两种情况,如果汇款的银行是在联网城市,汇款后 2小时内即可到账;如果汇款的银行不在联网城市,则需要3-5个工作日才能到账。
  网上银行:每笔最低 1元,最高不超过30元。
  电话银行:每笔最低 1元,最高不超过40元。
  缺点:在建行汇款,汇款方必须持有建行储蓄卡方可汇款。如果没有储蓄卡,需要先花 10元手续费办理建行龙卡。尽管汇款最快在2个小时内即可到账,但收款方当天无法查询到账明细。
 
  工商银行
  手续费用:工商银行提供两种转账方式,一是灵通卡汇款,手续费为汇款金额的 1%,最低汇款手续费为1元,最高为50元。二是牡丹卡汇款,没有汇款的手续费用。
  到账时间:灵通卡汇款为 24小时内到账,牡丹卡汇款为3-5个工作日内到账。
  网上银行:每笔最低 5元,最高为50元。
  缺点:工商银行通常人比较多,大中城市的工商银行都需要排队,办理时间较长。网上银行周末和节假日无法汇款。
 
  交通银行
  手续费用: 1000元以内收1%的手续费,1000元以上收10元的手续费。交通银行最大的特点是可以自动在汇款中扣手续费,甚至可以汇款方、收款方分担手续费。
  到账时间:实时到账。
  缺点:网点少。
 
  中国银行
  手续费用:该行的汇款手续费是汇款金额的 0.10%,最低限额为5元,最高限额为500元。即汇款金额在5000元以内的汇款手续费均为5元,5000元以上按汇款金额的0.10%收取手续费。
  到账时间:第二天到账。
  缺点:周末和节假日大多数中行网点都会休息。
 
  光大银行
  手续费用:最低手续费限额为 2元,最高手续费限额为20元。手续费为汇款金额的0.5%。
  到账时间:实时到账。
  缺点:光大银行的覆盖区域比较少,许多地区无法汇款。
 
 
各银行开户、办卡收费标准
 
银行名称 开户工本费 年费 挂失 密码挂失 开办或补换新卡
 
中国银行    10元   10元 10元  不详    5元/卡
 
工商银行    5元    10元 10元  10元    5元/卡
 
建设银行    0元    10元 10元  10元    5元/卡
 
农业银行 普卡 5元 10元 10元  ———   5元/卡
 
      彩照卡 25元
 
交通银行    5元    10元 10元  不详    5元/卡
 
招商银行    0元    0元  10元  不详    ———
 
广发行     5元    0元  10元  不详    ———
 
深发行     10元   0元  5元   5元     5元/卡
 
民生银行    0元    0元  10元  10元    10元/卡
 
浦发银行    0元    0元  0元   不详    ———
 
兴业银行    0元    0元  10元  5元     ———
 
 
各大银行异地存款收费标准
 
银行名称  每笔收费  最低收费  封顶收费
 
工商银行  百分之一    1元     50元
 
建设银行  千分之五    1元     50元
 
中国银行  千分之五    1元     50元
 
农业银行  千分之五    1元     25元
 
招商银行  千分之五    5元     没有
 
广发银行  千分之一    5元     没有
 
深发展   千分之一    5元     没有
 
交通银行  万分之五    10元    50元
 
光大银行   免费    免费    免费
 
民生银行   免费    免费    免费
 
浦发银行   免费    免费    免费
 
各大银行 ATM机取款收费标准(每笔收费)
银行名称 本行异地取现 同城跨行取现 异地跨行取现
工商银行 交易金额的 0.5%,最低1元,最高50元 2元/笔 交易金额的0.5%+2元/笔
中国银行 5元/笔 2元/笔 7元/笔
农业银行 交易金额的 1%、最低1元 2元/笔 交易金额的1%+2元/笔
招商银行 交易金额的 5‰ 每月前三笔免,第四笔开始2元/笔 2元/笔+交易金额的5‰
交通银行 交易金额的 8‰ 2元/笔 交易金额的8‰+2元/笔
民生银行 5元/笔免费 以ATM机所属银行价格为准
深发展 交易金额的 5% 免费 交易金额的5%+2元/笔,最低1元/笔
浦发银行 免费 免费 免费(全国银联标志 ATM)
华夏银行 1元/笔免费 20元/笔
 
注:兴业银行(在本行 ATM上取款暂不收费,在他行ATM上取款(含本地、异地)人民币2元/笔(每月头3笔免费);少数地区(厦门等)按2元/笔收取,北京、南京、深圳分行均不收费。
 
建设银行(龙卡储蓄卡:跨行 ATM取现手续费每笔2元加上交易金额的1%,其中每笔交易金额的1%,最低为2元。在香港地区ATM取现手续费:每笔10元加上交易金额的1%。)
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值