Java面向對象
html
1. Java的跨平臺原理(字節碼文件、虛擬機) 1java
2.簡述Java的垃圾回收機制 1mysql
3.類和對象的關係 2web
4.面向過程和麪向對象的區別 2面試
5. private/默認/protected/public權限修飾符的區別 2ajax
6.方法重載和方法重寫(覆蓋)的區別 3算法
7.子類能夠從父類繼承到哪些內容 3spring
8. this和super關鍵字的做用 3sql
9. static關鍵字的做用(修飾變量、方法、代碼塊) 3數據庫
10. final和abstract關鍵字的做用 4
11. final、finally、finalize的區別 4
12.寫出java.lang.Object類的六個經常使用方法 4
13. 繼承條件下構造方法的執行過程 5
14. 實現多態的三個條件 5
15. 多態的技能點(向上轉型、向下轉型) 5
16. 接口和抽象類的異同之處 5
17. String、StringBuffer、StringBuilder區別與聯繫 6
18. ==和equals的區別和聯繫 6
19. String類型是基本數據類型嗎?基本數據類型有哪些 6
20.String s="Hello";s=s+"world!";執行後,原始String內容是否改變? 7
21.String s = new String("xyz");建立了幾個String Object? 兩者之間有什麼區別? 7
22.下面這條語句一共建立了多少個對象:String s="a"+"b"+"c"+"d"; 8
23.&和&&的區別和聯繫,|和||的區別和聯繫 8
24.用最有效率的方法算出2乘以8等於多少 8
25.Math.round(11.5)等於多少? Math.round(-11.5)等於多少? 8
26.xml有哪些解析技術?區別是什麼?
27.你在項目中用到了xml技術的哪些方面?如何實現的?
28.用jdom解析xml文件時如何解決中文問題?如何解析?
答:看以下代碼,用編碼方式加以解決
package test;
import java.io.*;
public class DOMTest
{
private String inFile = "c:\\people.xml"
private String outFile = "c:\\people.xml"
public static void main(String args[])
{
new DOMTest();
}
public DOMTest()
{
try
{
javax.xml.parsers.DocumentBuilder builder =
javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder();
org.w3c.dom.Document doc = builder.newDocument();
org.w3c.dom.Element root = doc.createElement("老師");
org.w3c.dom.Element wang = doc.createElement("王");
org.w3c.dom.Element liu = doc.createElement("劉");
wang.appendChild(doc.createTextNode("我是王老師"));
root.appendChild(wang);
doc.appendChild(root);
javax.xml.transform.Transformer transformer =
javax.xml.transform.TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING, "gb2312");
transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT, "yes");
transformer.transform(new javax.xml.transform.dom.DOMSource(doc),
new
javax.xml.transform.stream.StreamResult(outFile));
}
catch (Exception e)
{
System.out.println (e.getMessage());
}
}
}
29.編程用JAVA解析XML的方式
答:用SAX方式解析XML,XML文件以下:
<?xml version=1.0 encoding=gb2312?>
<person>
<name>王小明</name>
<college>信息學院</college>
<telephone>6258113</telephone>
<notes>男,1955年生,博士,95年調入海南大學</notes>
</person>
事件回調類SAXHandler.java
import java.io.*;
import java.util.Hashtable;
import org.xml.sax.*;
public class SAXHandler extends HandlerBase
{
private Hashtable table = new Hashtable();
private String currentElement = null;
private String currentValue = null;
public void setTable(Hashtable table)
{
this.table = table;
}
public Hashtable getTable()
{
return table;
}
public void startElement(String tag, AttributeList attrs)
throws SAXException
{
currentElement = tag;
}
public void characters(char[] ch, int start, int length)
throws SAXException
{
currentValue = new String(ch, start, length);
}
public void endElement(String name) throws SAXException
{
if (currentElement.equals(name))
table.put(currentElement, currentValue);
}
}
JSP內容顯示源碼,SaxXml.jsp:
<HTML>
<HEAD>
<TITLE>剖析XML文件people.xml</TITLE>
</HEAD>
<BODY>
<%@ page errorPage=ErrPage.jsp
contentType=text/html;charset=GB2312 %>
<%@ page import=java.io.* %>
<%@ page import=java.util.Hashtable %>
<%@ page import=org.w3c.dom.* %>
<%@ page import=org.xml.sax.* %>
<%@ page import=javax.xml.parsers.SAXParserFactory %>
<%@ page import=javax.xml.parsers.SAXParser %>
<%@ page import=SAXHandler %>
<%
File file = new File(c:\people.xml);
FileReader reader = new FileReader(file);
Parser parser;
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
SAXHandler handler = new SAXHandler();
sp.parse(new InputSource(reader), handler);
Hashtable hashTable = handler.getTable();
out.println(<TABLE BORDER=2><CAPTION>教師信息表</CAPTION>);
out.println(<TR><TD>姓名</TD> + <TD> +
(String)hashTable.get(new String(name)) + </TD></TR>);
out.println(<TR><TD>學院</TD> + <TD> +
(String)hashTable.get(new String(college))+</TD></TR>);
out.println(<TR><TD>電話</TD> + <TD> +
(String)hashTable.get(new String(telephone)) + </TD></TR>);
out.println(<TR><TD>備註</TD> + <TD> +
(String)hashTable.get(new String(notes)) + </TD></TR>);
out.println(</TABLE>);
%>
</BODY>
</HTML>
30.XML文檔定義有幾種形式?它們之間有何本質區別?解析XML文檔有哪幾種方式?
Java面向對象
1. Error和Exception的區別 10
2. Checked異常和Runtime異常的區別 10
3. Java異常處理try-catch-finally的執行過程 10
4. 異常處理中throws和throw的區別 11
5. 編寫一段簡單的log4j日誌處理代碼 11
public class Test11 {
private static Logger logger=Logger.getLogger(Test11.class.getName());
public static void main(String[] args) {
try {
Scanner in = new Scanner(System.in);
System.out.print("請輸入被除數:");
int num1 = in.nextInt();
logger.debug("輸入被除數:" + num1);
System.out.print("請輸入除數:");
int num2 = in.nextInt();
logger.debug("輸入除數:" + num2);
System.out.println(String.format("%d / %d = %d", num1, num2, num1/ num2));
logger.debug("輸出運算結果:" + num1 / num2));
} catch (InputMismatchException e) {
logger.error("被除數和除數必須是整數", e);
} catch (ArithmeticException e) {
logger.error(e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
} finally {
System.out.println("歡迎使用本程序!");
}
}
}
6. 基本數據類型和包裝類 11
7、Integer與int的區別 12
8. Java集合體繫結構(List、Set、Collection、Map的區別和聯繫) 12
9. Vector和ArrayList、ArrayList和LinkedList的區別和聯繫 13
10. HashMap和Hashtable的區別和聯繫 14
11. HashSet的使用和原理(hashCode()和equals()) 14
12. TreeSet的原理和使用(Comparable和comparator) 14
13. 集合和數組的比較(爲何引入集合) 15
14. Collection和Collections的區別 15
15. 使用JDBC進行數據庫操做的基本步驟 15
public class Test5 {
private static Logger logger = Logger.getLogger(Test5.class.getName());
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
// 1、加載驅動
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
} catch (ClassNotFoundException e) {
logger.error(e);
}
try { // 2、創建鏈接
conn = DriverManager.getConnection(
"jdbc:sqlserver://localhost:1433;DatabaseName=epet","jbit", "bdqn");
// 3、向數據庫發送SQL命令並獲得結果
stmt = conn.createStatement();
rs = stmt.executeQuery("select * from dog");
//4、處理返回結果
System.out.println("\t\t狗狗信息列表");
System.out.println("編號\t姓名\t健康值\t親密度\t品種");
while (rs.next()) {
System.out.print(rs.getInt(1)+"\t");System.out.print(rs.getString(2)+"\t");
System.out.print(rs.getInt("health")+ "\t");
System.out.print(rs.getInt("love")+"\t"); System.out.println(rs.getString("strain"));
}
} catch (SQLException e) {
logger.error(e);
} finally {
// 5、關閉Statement和數據庫鏈接
try { if (null != rs) {rs.close();}
if (null != stmt) { stmt.close();}
if (null != conn) { conn.close();}
} catch (SQLException e) {
logger.error(e);
}
}
}
}
16. Statement和PreparedStatement的區別 16
17.爲何引入事務?事務的基本特性。JDBC和Hibernate中如何使用事務 16
18. 請使用遞歸算法計算n! 17
19.請寫出冒泡排序代碼 17
public class TestBubbleSort {
public static void sort(int[] a) {
int temp = 0;
// 外層循環,它決定一共走幾趟
for (int i = 0; i <a.length-1; ++i) {
//內層循環,它決定每趟走一次
for (int j = 0; j <a.length-i-1 ; ++j) {
//若是後一個大於前一個
if (a[j + 1] < a[j]) {
//換位
temp = a[j];a[j] = a[j + 1];a[j + 1] = temp;
}
}
}
public static void sort2(int[] a) {
int temp = 0;
for (int i = 0; i <a.length-1; ++i) {
//經過符號位能夠減小無謂的比較,若是已經有序了,就退出循環
int flag = 0;
for (int j = 0; j <a.length-1-i ; ++j) {
if (a[j + 1] < a[j]) {
temp = a[j];a[j] = a[j + 1];a[j + 1] = temp;
flag = 1;
}
}
if(flag == 0){ break;}
}
}
}
20.請寫出選擇排序的代碼 18
public class TestSelectSort {
public static void sort(int arr[]) {
int temp = 0;
for (int i = 0; i < arr.length - 1; i++) {
// 認爲目前的數就是最小的, 記錄最小數的下標
int minIndex = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[minIndex] > arr[j]) {
// 修改最小值的下標
minIndex = j;
}
}
// 當退出for就找到此次的最小值
if (i != minIndex) {
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
}
}
21.請寫出插入排序的代碼 19
22.開發存儲過程,實現操做: 19
查詢訂單數據,若是發現有超過六個月沒有下單的客戶,自動向流失預警表中添加一條記錄。
USE [jb_crm_team0] GO SET ANSI_NULLS OFF GO SET QUOTED_IDENTIFIER OFF GO ALTER PROCEDURE [dbo].[Check_Lost] AS DECLARE @lst_cust_no char(17),@lst_cust_name nvarchar(100), @lst_cust_manager_id bigint,@lst_manager_name nvarchar(50), @lst_status varchar(10)
DECLARE Lost_Cust_Cursor CURSOR FOR select cust_no,cust_name,cust_manager_id,cust_manager_name, 1 from cst_customer where cust_no in ( select distinct cst.cust_no from cst_customer cst,v_orders odr where cst.cust_name=odr.odr_customer and DATEDIFF(m,odr.odr_date,getdate())>6 )
OPEN Lost_Cust_Cursor FETCH NEXT FROM Lost_Cust_Cursor into @lst_cust_no,@lst_cust_name,@lst_cust_manager_id,@lst_manager_name,@lst_status
WHILE @@FETCH_STATUS = 0 BEGIN insert into cst_lost(lst_cust_no,lst_cust_name,lst_cust_manager_id,lst_cust_manager_name,lst_status) values (@lst_cust_no,@lst_cust_name,@lst_cust_manager_id,@lst_manager_name,@lst_status)
FETCH NEXT FROM Lost_Cust_Cursor into @lst_cust_no,@lst_cust_name,@lst_cust_manager_id,@lst_manager_name,@lst_status END CLOSE Lost_Cust_Cursor DEALLOCATE Lost_Cust_Cursor |
Java高級
1.Java反射技術的主要實現類有哪些,其做用分別是什麼? 21
2.Class類的做用?生成Class對象的方法主要有哪些? 21
3.反射的使用場合和做用、及其優缺點 21
4.進程和線程有什麼聯繫和區別? 22
5.建立線程的兩種方式分別是什麼? 23
6.如何實現線程同步? 24
7. Java中實現線程通訊的三個方法的做用是什麼? 24
8.說明生產者和消費者問題,如何採用多線程實現? 25
9.講解ThreadLocal的做用及其使用 25
10.什麼是java序列化,如何實現java序列化? 26
11.介紹OSI七層模型和TCP/IP模型 26
12. TCP協議和UDP協議的比較 27
13.什麼是Socket編程;簡述基於TCP協議的Socket編程的主要步驟 27
基於TCP協議的Socket編程的主要步驟
14.Java內存結構
15.GC相關
16.JVM問題
17.註解
@Retention
它是被定義在一個註解類的前面,用來講明該註解的生命週期。它有如下參數:
RetentionPolicy.SOURCE :指定註解只保留在一個源文件當中。
RetentionPolicy.CLASS :指定註解只保留在一個 class 文件中。
RetentionPolicy.RUNTIME :指定註解能夠保留在程序運行期間。
@Target
它是被定義在一個註解類的前面,用來講明該註解能夠被聲明在哪些元素前。它有如下參數:
ElementType.TYPE :說明該註解只能被聲明在一個類前。
ElementType.FIELD :說明該註解只能被聲明在一個類的字段前。
ElementType.METHOD :說明該註解只能被聲明在一個類的方法前。
ElementType.PARAMETER :說明該註解只能被聲明在一個方法參數前。 ElementType.CONSTRUCTOR :說明該註解只能聲明在一個類的構造方法前 。
ElementType.LOCAL_VARIABLE :說明該註解只能聲明在一個局部變量前。
ElementType.ANNOTATION_TYPE :說明該註解只能聲明在一個註解類型前 。
ElementType.PACKAGE :說明該註解只能聲明在一個包名前。
@Inherited
能夠被子類繼承
@Documented
生成文件檔時,包含本註解信息
例子:spring的事務註解@Transactional
@Target({ElementType.METHOD, ElementType.TYPE})//能夠做用在類上和方法上
@Retention(RetentionPolicy.RUNTIME)//能夠經過反射讀取註解
@Inherited//能夠被子類繼承
@Documented//javadoc生成文件檔時,包含本註解信息
public @interface Transactional {
String value() default "";
//使用時沒有指定key,值默認賦給value,如:Transactional("abc")
Propagation propagation() default Propagation.REQUIRED;
Isolation isolation() default Isolation.DEFAULT;
int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;
boolean readOnly() default false;
Class<? extends Throwable>[] rollbackFor() default {};
String[] rollbackForClassName() default {};
Class<? extends Throwable>[] noRollbackFor() default {};
String[] noRollbackForClassName() default {};
}
註解和接口類似,它只能定義 final 靜態屬性和公共抽象方法。
1. 方法前默認會加上 public abstract
2. 在聲明方法時能夠定義方法的默認返回值。
例如 :
String color() default "blue";
String[] color() default {"blue", "red",......}
3. 方法的返回值能夠有哪些類型
8 種基本類型, String 、 Class 、枚舉、註解及這些類型的數組。
註解的使用分爲三個過程。
定義註解 --> 聲明註解 --> 獲得註解
a. 定義註解(參照上面的註解定義)
b. 聲明註解
1. 在哪些元素上聲明註解
若是定義註解時沒有指定 @Target 元註解來限制它的使用範圍 , 那麼該注
解可使用在 ElementType 枚舉指定的任何一個元素前。不然,只能聲明在
@Target 元註解指定的元素前。
通常形式:
@ 註解名 ()
1 、聲明在一個類中的註解
能夠經過該類 Class 對象的 getAnnotation 或 getAnnotations 方法得到。
2 、聲明在一個字段中的註解
經過 Field 對象的 getAnnotation 或 getAnnotations 方法得到
3 、聲明在一個方法中的註解
經過 Method 對象的 getAnnotation 或 getAnnotations 方法得到
動態網頁技術
1. JSP的執行過程 29
3.JSP的9個內置對象及其含義,分別寫出其經常使用方法三個 29
4. page/request/session/application的範圍區別 29
5. get和post的區別 30
6.Servlet的生命週期 30
2.JSP和Servlet的區別和聯繫 30
7.session和cookie的區別 31
8.轉發和重定向的區別 31
9.MVC模式及其優缺點 32
10.B/S和C/S的含義及其區別 33
11.爲何要使用鏈接池?數據庫鏈接池的原理。 33
12.EJB與JavaBean的區別? 34
一、用兩種方式根據部門號從高到低,工資從低到高列出每一個員工的信息。
二、列出各個部門中工資高於本部門的平均工資的員工數和部門號,並按部門號排序
三、存儲過程與觸發器必須講,常常被面試到?
四、數據庫三範式是是什麼?
五、說出一些數據庫優化方面的經驗?
六、union和union all有什麼不一樣?
假設咱們有一個表Student,包括如下字段與數據:
drop table student;
create table student
(
id int primary key,
name nvarchar2(50) not null,
score number not null
);
insert into student values(1,'Aaron',78);
insert into student values(2,'Bill',76);
insert into student values(3,'Cindy',89);
insert into student values(4,'Damon',90);
insert into student values(5,'Ella',73);
insert into student values(6,'Frado',61);
insert into student values(7,'Gill',99);
insert into student values(8,'Hellen',56);
insert into student values(9,'Ivan',93);
insert into student values(10,'Jay',90);
commit;
Union和Union All的區別。
select *
from student
where id < 4
union
select *
from student
where id > 2 and id < 6
結果將是
1 Aaron 78
2 Bill 76
3 Cindy 89
4 Damon 90
5 Ella 73
若是換成Union All鏈接兩個結果集,則返回結果是:
1 Aaron 78
2 Bill 76
3 Cindy 89
3 Cindy 89
4 Damon 90
5 Ella 73
七、分頁語句
八、用一條SQL語句 查詢出每門課都大於80分的學生姓名
九、全部部門之間的比賽組合
十、每月份的發生額都比101科目多的科目
--複製最上面的數據,故意把全部發生額數字改大一點
insert into TestDB values
(null,'103','1988-1-1',150),
(null,'103','1988-2-1',160),
(null,'103','1988-3-1',180),
(null,'103','1988-4-1',120),
(null,'103','1988-5-1',120),
(null,'103','1988-6-1',120),
(null,'103','1988-7-1',120),
(null,'103','1988-8-1',120);
--複製最上面的數據,故意把全部發生額數字改大一點
insert into TestDB values
(null,'104','1988-1-1',130),
(null,'104','1988-2-1',130),
(null,'104','1988-3-1',140),
(null,'104','1988-4-1',150),
(null,'104','1988-5-1',160),
(null,'104','1988-6-1',170),
(null,'104','1988-7-1',180),
(null,'104','1988-8-1',140);
--複製最上面的數據,故意把第二個月份的發生額數字改小一點
insert into TestDB values
(null,'105','1988-1-1',100),
(null,'105','1988-2-1',80),
(null,'105','1988-3-1',120),
(null,'105','1988-4-1',100),
(null,'105','1988-5-1',100),
(null,'105','1988-6-1',100),
(null,'105','1988-7-1',100),
(null,'105','1988-8-1',100);
十一、統計每一年每個月的信息
year month amount
1991 1 1.1
1991 2 1.2
1991 3 1.3
1991 4 1.4
1992 1 2.1
1992 2 2.2
1992 3 2.3
1992 4 2.4
查成這樣一個結果
year m1 m2 m3 m4
1991 1.1 1.2 1.3 1.4
1992 2.1 2.2 2.3 2.4
提示:這個與工資條很是相似,與學生的科目成績也很類似。
準備sql語句:
drop table if exists sales;
create table sales(id int auto_increment primary key,year varchar(10), month varchar(10), amount float(2,1));
insert into sales values
(null,'1991','1',1.1),
(null,'1991','2',1.2),
(null,'1991','3',1.3),
(null,'1991','4',1.4),
(null,'1992','1',2.1),
(null,'1992','2',2.2),
(null,'1992','3',2.3),
(null,'1992','4',2.4);
十二、顯示文章標題,發帖人、最後回覆時間
1三、刪除除了id號不一樣,其餘都相同的學生冗餘信息
1四、航空網的幾個航班查詢題:
1五、查出比經理薪水還高的員工信息:
1六、求出小於45歲的各個老師所帶的大於12歲的學生人數
1七、求出發帖最多的人:
1八、一個用戶表中有一個積分字段,假如數據庫中有100多萬個用戶,若要在每一年第一 天凌 晨將積分清零,你將考慮什麼,你將想什麼辦法解決?
1九、一個用戶具備多個角色,請查詢出該表中具備該用戶的全部角色的其餘用戶。
20、xxx公司的sql面試
2一、註冊Jdbc驅動程序的三種方式
作實在是沒有必要,還會影響程序的運行。
Java代碼
由new com.mysql.jdbc.Driver()能夠知道,這裏須要建立一個類的實例。建立類的實例就須要在java文件中將該類經過import導入,否則就會報錯,即採用這種方式,程序在編譯的時候不能脫離驅動類包,爲程序切換到其餘數據庫帶來麻煩
jdbc是使用橋的模式進行鏈接的。DriverManager就是管理數據庫驅動的一個類,java.sql.Driver就 是一個提供註冊數據庫驅動的接口,而com.microsoft.sqlserver.jdbc.SQLServerDriver()是 java.sql.Driver接口的一個具體實現。
第二種與第三種註冊的方法看起來更加的直接與好理解。第一種方法是經過Class把類先裝載到java的虛擬機中,並無建立Driver類的實例。
第一種與第二種方法能夠脫離jdbc的驅動進行編譯,第三種方法不能夠的,它必定要有jdbc的驅動才能夠經過編譯,這樣對咱們的程序就有不少的很差之處,爲程序換數據庫會帶來麻煩。
因此推薦使用第一種方法來註冊驅動。
總結:推薦1,和2兩種方式。
緣由:3在編譯時須要導入對應的lib。1,2不須要。
2二、用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();
}
}
}
2三、JDBC中的PreparedStatement相比Statement的好處
2四、寫一個用jdbc鏈接並訪問oracle數據的程序代碼
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBCTest {
public static void main(String[] args) throws Exception {
//1.加載驅動
//Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//Class.forName("com.mysql.jdbc.Driver");
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.建立數據庫鏈接對象
//Connection conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=db","sa","sqlpass");
//Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=UTF-8","root","123456");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","Oracle123");
//3.建立數據庫命令執行對象
Statement stmt = conn.createStatement();
// PreparedStatement ps = conn.prepareStatement("select * from t_user");
//4.執行數據庫命令
ResultSet rs = stmt.executeQuery("select * from t_user");
// ResultSet rs = ps.executeQuery();
//5.處理執行結果
while (rs.next()) {
int id = rs.getInt("id");
String username = rs.getString("username");
String password = rs.getString("password");
System.out.println(id + "\t" + username + "\t" + password);
}
//6.釋放數據庫資源
if (rs != null) {
rs.close();
}
// if (ps != null) {
// ps.close();
// }
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
}
}
2五、Class.forName的做用?爲何要用?
2六、大數據量下的分頁解決方法。
2七、用 JDBC 查詢學生成績單, 把主要代碼寫出來(考試機率極大).
2八、這段代碼有什麼不足之處?
2九、說出數據鏈接池的工做機制是什麼?
30、爲何要用 ORM? 和 JDBC 有何不同?
SSH2開源框架
1.Struts1的工做原理 35
2. Struts2的工做原理 35
3. Struts1與Struts2的區別 36
特性 |
Struts1.x |
Struts2 |
Action類 |
Struts1.x要求Action類要擴展自一個抽象基類。Struts1.x的一個共有的問題是面向抽象類編程而不是面向接口編程。 |
Struts2的Action類實現了一個Action接口。Struts2也提供ActionSupport基類來實現通常使用的接口。固然,Action接口不是必須的。任何使用execute方法的POJO能夠被看成Struts 2的Action對象來使用。 |
線程模型 |
Struts1.x Action類是單例類,由於只有一個實例來控制全部的請求。單例類策略形成了必定的限制,而且給開發帶來了額外的煩惱。Action資源必須是線程安全或者同步的。 |
Struts2 Action對象爲每個請求都實例化對象,因此沒有線程安全的問題。(實踐中,servlet容器給每個請求產生許多丟棄的對象,而且不會致使性能和垃圾回收問題)。 |
Servlet 依賴 |
Struts1.x的Action類依賴於servlet API,當Action被調用時,以Request和Response做爲參數傳給execute方法。 |
Struts2的Action和容器無關。Servlet上下文被表現爲簡單的Maps,容許Action被獨立的測試。 |
易測性 |
測試Struts1.x的主要問題是execute方法暴露了Servlet API使得測試依賴於容器。第三方擴展,如Struts TestCase,提供一套Struts1的模擬對象(來進行測試)。 |
Struts2的Action能夠經過初始化、設置屬性、調用方法來測試。依賴注入的支持也是測試變得更簡單。 |
捕獲輸入 |
Struts1.x使用ActionForm對象來捕獲輸入。象Action同樣,全部的ActionForm必須擴展基類。由於其餘的JavaBean不能做爲ActionForm使用,開發者常常建立多餘的類來捕獲輸入。DynaBeans能夠被用來做爲替代ActionForm的類來建立。可是,開發者多是在從新描述(建立)已經存在的JavaBean(仍然會致使有冗餘的javabean)。 |
Struts2直接使用Action屬性做爲輸入屬性,消除了對第二個輸入對象的需求。輸入屬性多是有本身(子)屬性的rich對象類型。Action屬性可以經過web頁面上的taglibs訪問。Struts2也支持ActionForm模式。rich對象類型,包括業務對象,可以用做輸入/輸出對象。這種ModelDriven 特性簡化了taglib對POJO輸入對象的引用。 |
表達式語言 |
Struts1.x整合JSTL,因此它使用JSTL的表達式語言。表達式語言有基本的圖形對象移動,可是對集合和索引屬性的支持很弱。 |
Struts2使用JSTL,可是也支持一個更強大和靈活的表達式語言--"Object Graph Notation Language" (OGNL)。 |
將值綁定到頁面 |
Struts1.x使用標準JSP機制來綁定對象到頁面上下文。 |
Struts2使用「ValueStack」技術,使taglib可以訪問值而不須要把你的頁面(view)和對象綁定起來。ValueStack策略容許經過一系列名稱相同但類型不一樣的屬性重用頁面(view)。 |
類型轉換 |
Struts1.x的ActionForm屬性常常都是String。Struts 1.x使用Commons-Beanutils來進行類型轉換。轉換每個類,而不是爲每個實例配置。 |
Struts2使用OGNL進行類型轉換。提供基本和經常使用對象的轉換器。 |
驗證 |
Struts1.x支持在ActionForm的validate方法中手動校驗,或者經過Commons Validator的擴展來校驗。 |
Struts2支持經過validate方法和XWork校驗框架來進行校驗。 |
Action執行控制 |
Struts1.x支持每個模塊有單獨的Request Processors(生命週期),可是模塊中的全部Action必須共享相同的生命週期。 |
Struts2支持經過攔截器堆棧(Interceptor Stacks)爲每個Action建立不一樣的生命週期。堆棧可以根據須要和不一樣的Action一塊兒使用。 |
4. Struts2中攔截器的主要做用、工做原理,如何自定義攔截器 37
3.2配置和引用攔截器
5. 攔截器和過濾器的異同 38
6. Hibernate相比JDBC的優點所在 38
兩者的聯繫:
7.Hibenate的基本原理(ORM) 39
8.cascade和inverse的區別 40
9. HQL和SQL的區別 40
10. 如何提升Hibernate的性能 40
11. Hibernate中持久化類的三種狀態及其特徵 40
12. Spring IoC的原理 41
13. Spring AOP的原理 41
14. AOP的基本概念:切面、通知、切入點、鏈接點、織入 42
15. SSH整合的基本步驟 42
16. 並行操做下數據庫事務出現的問題及含義;事務的隔離級別和四大屬性 42
17. 手動搭建Web項目,手動搭建SSH環境 43
1、安裝Tomcat
安裝版:只適用Windows,會自動安裝Window服務
解壓版:適合於其餘操做系統,安裝完畢後須要配置環境變量,並能夠添加成Window服務
建議安裝解壓版,瞭解Tomcat的啓動過程
2、配置Tomcat
JAVA_HOME D:\java\jdk1.6.0_18
CATALINA_HOME: D:\java\tomcat60
3、啓動和關閉Tomcat
startup.bat shutdown.bat
4.安裝Eclipse
解壓便可
5、手動建立Web項目
1、classes
2、lib
3、jsp
4、java
5、web.xml
6、servlet
6、手動部署Web項目
方式1:在WebApps下建立一個文件夾,並把WebRoot下全部內容複製到該目錄下
方式2:在server.xml的host標籤中配置以下內容<Context path="/jbm"
docBase="D:\java\Workspaces\jbmessage_java\WebRoot" reloadable="true"></Context>
7、搭建Hibernate環境並測試
1.添加jar
2.添加hibernate.cfg.xml
3.添加HibernateUtil.java
4.建立實體類和映射文件
5.在hibernate.cfm.xml中添加映射文件路徑
6.編寫測試類測試hibernate(須要添加slf-logging.jar)
8、搭建Struts2環境並測試
1.添加jar
2.在web.xml中配置總控制器
3.添加struts.xml
4.建立Action和JSP
5.配置struts.xml
6.測試Struts2
9、搭建Spring環境並測試
1.添加jar
2.建立applicationContext.xml
3.測試IoC
18. 緩存算法
19. SpringMVC的執行流程
2.springmvc執行流程詳細介紹
20. 談談你對Spring的認識
Spring提供了一個bean的容器,能夠把系統中使用的各類框架的核心組件管理起來,放在spring的容器中,當須要這些組件的時候,就從容器中取出來,因此咱們常常用spring作系統集成,管理系統中使用的各類組件。這樣,咱們就能夠爲各個組件定義一些特性,好比IOC,AOP,能夠爲組件注入一些屬性,也能夠實現AOP。須要注意的是,若是直接new一個組件,這個時候,不是從容器中取出來的,這樣就不能具備事先配置好的特性。好比,咱們在項目中,通常在service層配置事務,若是直接new一個service層bean,這個bean不會注入dao,並且這個bean在執行增刪改查的時候,不會具備事務。
Spring容器的頂層接口是ApplicationContext, 其實它是包裝了BeanFactory的全部功能,咱們在web項目中,通常使用的WebXmlApplicationContext這個容器。在編寫代碼的時候,若是須要拿到這個容器,可使用ContextLoader.getCurrentWebApplicationContext(),獲得這個容器。
Spring中配置bean默認是單例的,即singleton,spring在配置bean的時候,須要注意做用域,有singleton表示單例,有prototype表示多例,表示每次從容器中取一個bean的實例,都是new一個新的實例。通常在項目中配置dao,service的時候,使用單例,在使用struts2的時候,配置action,通常配置prototype,由於struts2的action中通常會定義私有屬性進行傳值,這是一個共享數據,有線程不安全問題,因此須要每次請求的時候,從容器中獲取action都new一個新的。
Spring,咱們在項目中,通常使用最多的就是它的IOC,AOP特性,IOC使用了單例和工廠模式,其實spring中的單例,是指在spring的容器中,bean是單例的,可是在JVM範
疇內,它不必定是單例的,好比一個service, 在spring容器中是單例,可是在JVM中,能夠手動new一個service,這樣在JVM的範圍內,這個service不是單例的。
AOP使用到了代理模式,通常使用jdk動態代理,還有cglib代理,jdk動態代理,要求目標類必須具備接口,cglib代理是在運行過程當中,動態生成目標類的子類的方式進行代理。咱們在項目中,通常在配置事務的時候,使用了AOP,其餘的狀況,好比記錄日誌,也能夠採用AOP,在控制用戶是否登陸的時候,對一些操做,要求用戶登陸才能進行,這時候,也能夠採用AOP的方式,攔截action或controller的方法,先判斷用戶是否登陸,若是沒有登陸,跳轉到登陸頁面。
Jdk動態代理,cglib動態代理,都是使用生成字節碼文件,即class的方式實現的。Cglib的效率比jdk要快,通常是2倍。
21. Spring經常使用註解
22. Spring MVC經常使用註解
@Controller指定類是一個spring的controller
@RequestMapping指定訪問的路徑
@RequestMethod指定請求的方式get|post
@RequestParam指定請求正文中的參數
包括:
1.路徑?號後面的param=value
2.表單提交的數據
3.ajax方式提交的數據
@PathVariable指定請求路徑中的參數,注意這裏不是指路徑?號後面的param=value
@RequestMapping("/user/edit/{id}")
public String edit(@PathVariable("id") String id){
}
例子:
訪問路徑:http://host:port/web根路徑/user/edit/123.do
這裏123就是id參數的值
@RequestBody
指定請求消息正文部分整個做爲一個json數據
@ResponseBody
指定相應消息正文部分整個做爲一個json數據
@ModelAttribute
指定提交的數據封裝到一個實體類參數
例子:
實體類:
public class User{
private String username;
private String password;
}
jsp:
<form action="${ctx}/user/addSave.do" method="post">
<input type="text" name="username"/>
<input type="text" name="password"/>
</form>
Controller:
@RequestMapping("/user/addSave")
public String addSave(@ModelAttribute User u){
//將表單中的username,password數據直接封裝到User 對象u中
}
@CookieValue
指定cookie中的參數
@RequestHeader
指定請求消息頭中的參數
@ExceptionHandler
Spring註解配置,可使用
@Component, 能夠用在全部的組件上,
在dao層咱們使用@Respository區分一下,
在service層使用@Service區分一下,
在控制層,好比struts2的action,springmvc的controller,使用@Controller,在struts2的action上使用@Scope(「prototype」) 配置action是多例的,由於spring的bean配置默認是單例的,
在bean裏面注入屬性的時候,可使用@Autowired這個註解, 若是須要注入xml配置文件中的bean,可使用@Resource(name=」」)這個註解, 指定bean的name
還可使用@Transactional這個註解,加在須要開啓事務的方法上,若是加載類上,表示方法都須要開啓事務。
23. 談談你對Hibernate的認識
24. 使用ibatis 須要注意幾個問題
25. 談談你對Struts2的認識
Struts2是一個MVC框架,通常用在web項目中,它有一個核心過濾器FilterDispatcher, 咱們在使用struts2的時候,一般須要在web.xml中註冊這個核心過濾器,在web應用啓動的時候,會去加載struts2的配置文件struts.xml,在內部生成一個請求路徑url到控制器Action的映射(Map),保存在ActionMapper中,當前臺有請求過來的時候,經過url,查找到對應的Action,調用對應的方法,最終返回一個字符串,指定跳轉的頁面,這個字符串在struts.xml中使用result來定義,在到達Action以前,會先通過一系列攔截器,調用Action的方法以後,也會通過攔截器,(這個時候通過攔截器的順序顛倒),通常咱們在項目中,編寫Action類是繼承ActionSupport, 配置struts.xml,是繼承struts-default,使用默認的攔截器棧defaultStack, 它裏面定義了18個攔截器,其中有負責數據類型轉換,國際化,文件上傳下載等等。
使用struts2的時候,傳值通常有兩種方式,一種是在action中定義一個私有屬性,生成getter,setter方法,另一種,就是,經過ServletActionContext獲得request,response,session等對象來進行傳值的操做。拿到這些對象以後,也能夠不配置result跳轉頁面,直接編寫代碼,使用request或者response來進行轉發和重定向。
而後在使用ajax的時候,通常咱們是直接使用response.getWriter().write(),將json字符串輸出前臺。
而後struts2的標籤,性能比較低,咱們在項目中,通常是使用jstl代替它。
Struts2其實有不少安全漏洞,從10年到14年,一共暴過7次安全漏洞,最近一次就是由於,struts2標籤使用的ognl表達式出的漏洞。
其實如今springmvc用的比較多,特別是互聯網項目,不過如今一些企業系統也用的比較多,spring mvc在使用的時候,須要在web.xml中註冊一個servlet,是DispatcherServlet, 在web應用啓動的時候,會加載springmvc的配置文件,裏面配置了註解掃描的包路徑,咱們通常是採用註解的方式配置springmvc的Controller,在裏面使用@RequestMapping配置路徑,在web應用啓動的時候,會造成一個請求路徑url到控制器Controller的映射(Map), 存放在HandlerMapping中,當前臺請求過來的時候,會調用HandlerMapping,查找url對應的控制器,最終調用控制器的方法,返回ModelAndView對象,Model存放數據,View存放視圖頁面的信息,而後調用ViewResolver對象,解析視圖,生成最終的html頁面,ViewResolver主要用來集成一些其餘的前臺框架,好比jstl,freemarker, velocity.
當須要使用文件上傳的時候,須要配置multipartResolver
好比,當springmvc 集成jstl, 就是使用InternalResourceViewResolver,返回的View類型是JstlView,
當springmvc 集成freemarker的時候,就是使用FreeMarkerViewResolver,返回的View類型是FreeMarkerView,
當springmvc 集成velocity的時候,就是使用VelocityViewResolver
Springmvc在傳值的時候,是經過方法參數進行傳值,它提供了不少註解,用來接收不一樣類型的參數。
好比@CookieValue用來接收cookie中的參數,@RequestParam用來接收表單參數,@PathVariable用來接收路徑參數,springmvc有一個好處,支持rest風格的編程,就是在路徑/後面添加參數,
還能夠直接使用實體類參數,將前臺數據封裝在實體類中,使用MultipartFile接收文件對象。
也能夠在方法中直接添加request,response參數,經過request去獲取前臺傳遞的參數。
26. Struts2和springmvc的區別
27. Hibernate和ibatis的區別