【Java】Java學習筆記總結(三)

來源:互聯網
上載者:User
文章目錄
  • 2013-07-29
2013-07-291. Socket是什嗎?如何開發基於C/S結構下的Socket程式,請說出步驟。

答:SOCKET用於在兩個基於TCP/IP協議的應用程式之間相互連信。最早出現在UNIX系統中,是UNIX系統主要的資訊傳遞方式。在WINDOWS系統中,SOCKET稱為WINSOCK。
兩個基本概念:客戶方和服務方。當兩個應用之間需要採用SOCKET通訊時,首先需要在兩個應用之間(可能位於同一台機器,也可能位於不同的機器)建立SOCKET串連,發起呼叫串連請求的一方為客戶方,接受呼叫串連請求的一方成為服務方。客戶方和服務方是相對的,同一個應用可以是客戶方,也可以是服務方。
在客戶方呼叫串連請求之前,它必須知道服務方在哪裡。所以需要知道服務方所在機器的IP地址或機器名稱,如果客戶方和服務方事前有一個約定就好了,這個約定就是PORT(連接埠號碼)。也就是說,客戶方可以通過服務方所在機器的IP地址或機器名稱和連接埠號碼唯一的確定方式來呼叫服務方。在客戶方呼叫之前,服務方必須處於偵聽狀態,偵聽是否有客戶要求建立串連。一旦接到串連請求,服務方可以根據情況建立或拒絕串連。串連方式有兩種,同步方式(Blocking)和(noBlocking).

開發基於C/S結構下的Socket程式的步驟:

1)Server端(建立ServerSocket的執行個體);Client端(建立Socket);

2)開啟串連到socket的輸入/輸出流;

3)按照一定的協議對socket進行讀/寫操作;

4)關閉socket。

2. 如何遍曆集合類下的ArrayList、Vector、HashSet。如何遍曆HashMap。寫出核心代碼。答:遍曆ArrayList:

//輸出集合collection中的所有元素public static void Shuchu(Collection collection) {Iterator iterator = collection.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}}

遍曆ArrayList:

Vector v = new Vector();for (int index = 0; index < v.size(); index++) {String str = (String) v.elementAt(index);}

遍曆 HashSet:

Set set = new HashSet();for (int i = 0; i < 100; i++) {set.add("123");}for (Iterator it = set.iterator(); it.hasNext();) {System.out.println(it.next());}

遍曆HashMap:

Map<Integer, String> map = new HashMap<Integer, String>();  for(int i=0;i<100;i++)  {   map.put(i, "123");  }for(Entry<Integer, String> entry:map.entrySet())  {   System.out.println(entry.getKey()+"="+entry.getValue());  }

2013-07-30SQL的增刪改查

#增INSERT INTO t_userr(username,password,sex) values('jj','11','n');#刪DELETE FROM t_userr WHERE username = 'jj';#改UPDATE t_userr SET ruxueYear='2000',note="水電費" WHERE username='jj';#查SELECT id,username FROM t_userr WHERE sex='男';SELECT username FROM t_userr;SELECT realName FROM t_userr WHERE sex='男' AND school='中國計量學院';SELECT * FROM t_userr;#全部資訊SELECT * FROM t_userr WHERE sex='女';

用Java向資料庫中增加多條記錄

package com.app;public class GrilFriend {public static void main(String[] args) {BaseDAO bDao = new BaseDAO();String[] secondclassify = {"面部護理","眼唇護理","精油SPA","彩妝","香氛","化妝工具"};String[][] thirdclassify = new String[secondclassify.length][2];String[][][] project = new String[secondclassify.length][thirdclassify.length][10];int ss = 1;for (int i = 0; i < secondclassify.length; i++) {for (int j = 0; j < thirdclassify[i].length; j++) {thirdclassify[i][j]=(j==0)?"分類":"功效";for (int j2 = 0; j2 < 10; j2++) {project[i][j][j2] = secondclassify[i] + thirdclassify[i][j] + j2;Object[] s3 = {ss++,"化妝品",secondclassify[i],thirdclassify[i][j],project[i][j][j2]};bDao.Update("insert into girlfriend(id,firstclassify,secondclassify,thirdclassify,project) values(?,?,?,?,?)",s3);}}}}}

分類別查詢最小的生日

SELECT * FROM t_userr WHERE birthdate in(SELECT MAX(birthdate) FROM t_userr GROUP BY sex);

2013-07-31in和exists區別in

in可以分為三類:
  1、形如select * from t1 where f1 in ( &apos;a &apos;, &apos;b &apos;),應該和以下兩種比較效率
  select * from t1 where f1= &apos;a &apos; or f1= &apos;b &apos;
  或者 select * from t1 where f1 = &apos;a &apos; union all select * from t1 f1= &apos;b &apos;
  你可能指的不是這一類,這裡不做討論。
  2、形如select * from t1 where f1 in (select f1 from t2 where t2.fx= &apos;x &apos;),
  其中子查詢的where裡的條件不受外層查詢的影響,這類查詢一般情況下,自動最佳化會轉成exist語句,也就是效率和exist一樣。
  3、形如select * from t1 where f1 in (select f1 from t2 where t2.fx=t1.fx),
  其中子查詢的where裡的條件受外層查詢的影響,這類查詢的效率要看相關條件涉及的欄位的索引情況和資料量多少,一般認為效率不如exists.
  除了第一類in語句都是可以轉化成exists 語句的,一般編程習慣應該是用exists而不用in.
  A,B兩個表,
  (1)當只顯示一個表的資料如A,關聯準則只一個如ID時,使用IN更快:
  select * from A where id in (select id from B)
  (2)當只顯示一個表的資料如A,關聯準則不只一個如ID,col1時,使用IN就不方便了,可以使用EXISTS:
  select * from A
  where exists (select 1 from B where id = A.id and col1 = A.col1)
  (3)當只顯示兩個表的資料時,使用IN,EXISTS都不合適,要使用串連:
  select * from A left join B on id = A.id
  所以使用何種方式,要根據要求來定。
exists

exists是用來判斷是否存在的,當exists(查詢)中的查詢存在結果時則返回真,否則返回假。not exists則相反。
exists做為where 條件時,是先對where前的主查詢詢進行查詢,然後用主查詢的結果一個一個的代入exists的查詢進行判斷,如果為真則輸出當前這一條主查詢的結果,否則不輸出。
in和exists區別

in 是把外表和內表作hash 串連,而exists是對外表作loop迴圈,每次loop迴圈再對內表進行查詢。
一直以來認為exists比in效率高的說法是不準確的。
如果查詢的兩個表大小相當,那麼用in和exists差別不大。
如果兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in。
NOT EXISTS,exists的用法跟in不一樣,一般都需要和子表進行關聯,而且關聯時,需要用索引,這樣就可以加快速度。

exists 相當於存在量詞:表示集合存在,也就是集合不為空白只作用一個集合。
例如 exist P 表示P不空時為真; not exist P表示p為空白時為真。 
in表示一個標量和一元關係的關係。
例如:s in P表示當s與P中的某個值相等時 為真; s not in P 表示s與P中的每一個值都不相等時為真:

not in 和not exists
如果查詢語句使用了not in 那麼內外表都進行全表掃描,沒有用到索引;
而not extsts 的子查詢依然能用到表上的索引。
所以無論那個表大,用not exists都比not in要快。

2013-08-01MySQL效能最佳化2013-08-02以Java代碼實現自增長並向資料庫中一次性增添多條記錄

package com.dao;import java.util.*;public class Test_Oracle {static int id = new Oracle_DAO().MaxID("SELECT MAX(id)  FROM Oracle_Test")+1;//static int id = 1;/** 產生一個隨機的字串,適用於JDK 1.7 *///public static String random(int length) {//StringBuilder builder = new StringBuilder(length);//for (int i = 0; i < length; i++) {//builder.append((char) (ThreadLocalRandom.current().nextInt(33, 128)));//}//return builder.toString();//}/** 產生一個隨機的字串*/public static String RandomString(int length) {String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";Random random = new Random();StringBuffer buf = new StringBuffer();for (int i = 0; i < length; i++) {int num = random.nextInt(62);buf.append(str.charAt(num));}return buf.toString();}/** 得到 id 的下標 */public static int IDNumber() {return id++;}public static void main(String[] args) {Oracle_DAO bDao = new Oracle_DAO();String sql = "insert into Oracle_Test(id,username,password) select ?,?,? from dual";String sqlString = " union select ?,?,? from dual ";ArrayList<Object> aList= new ArrayList<Object>();aList.add(IDNumber());aList.add(RandomString(10));aList.add(RandomString(6));for (int i = 0; i < 19; i++) {sql = sql +sqlString;aList.add(IDNumber());aList.add(RandomString(10));aList.add(RandomString(6));}Object[] objects=new Object[aList.size()]; for(int i=0;i<aList.size();i++){ objects[i]=aList.get(i); } bDao.Update(sql, objects);System.out.println(bDao.MaxID("SELECT MAX(id)  FROM Oracle_Test"));}}

2013-08-031. Java串連Oracle有哪幾種方式,說出區別,並寫出各自的url。答:第一種方式:通過資料庫本身的JDBC Driver串連到資料庫 

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

Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.33:1521

:huihoo","scott","tiger");

  第二種方式:通過JDBC-ODBC橋串連到資料庫 

  Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 

  Connection conn = DriverManager.getConnection("jdbc:odbc:192.168.1.33","scott","tiger"); 

2. 為tom使用者授予表emp的select、insert許可權,寫出對應的SQL語句。

答:grant select,update,insert ,dellete on scott.emp to tom;

3. 說出SQL注入漏洞的代碼,並說出解決辦法。

http://blog.csdn.net/jueblog/article/details/97507372013-08-04

1. 找出浙江出生的年紀最小的前5名學生。

答:Oracle代碼:

SELECT * FROM (SELECT * FROM T_USER WHERE HOME LIKE '%浙江%' ORDER BY BIRTHDATE desc) WHERE ROWNUM<6;

2. Oracle分頁程式的SQL。

答:

(1)採用偽列 rownum範例代碼:

SELECT * FROM (SELECT ROWNUM rn,id,realname FROM (SELECT id,realname FROM T_USER)WHERE ROWNUM<=20) t2 WHERE T2.rn >=10;

(2)用分析函數row_number()over(ORDER BY 欄位):

按ID排序後,從第10條記錄開始,提取10條記錄。

SELECT * FROM(SELECT id,realname,row_number()over(ORDER BY id asc) rn FROM T_USER)WHERE rn BETWEEN 10 AND 20;

(3)minus的寫法:

按ID排序後,從第10條記錄開始,提取10條記錄。

(SELECT * FROM (SELECT * FROM T_USER ORDER BY id asc) WHERE ROWNUM<20)  MINUS( SELECT * FROM (SELECT * FROM T_USER ORDER BY id asc) WHERE ROWNUM<10);

3. 預存程序和函數的區別,以及在控制台和Java語言中的調用方式。

答:預存程序和函數的區別:

預存程序

函數

用於在資料庫中完成特定的操作或者任務(如插入、刪除等)

用於特定的資料(如選擇)

程式頭部聲明用procedure

程式頭部聲明用function

程式頭部聲明時不需要描述傳回型別

函數頭部聲明時需要描述傳回型別,而且PL/SQL塊中至少 要包括一個有效return語句

可以使用in/out/in out 三種模式的參數

可以使用in/out/in out 三種模式的參數

可以作為一個獨立的PL/SQL語句來執行

不能獨立執行,必須作為運算式的一部分調用

可以通過out/in out 返回零個或多個值

通過return語句返回一個值,且該值要與聲明的部分一致,也可以是通過out類型的參數帶出的變數

SQL語句(DDL或者select)中不可以調用預存程序

SQL語句(DDL或者select)中可以調用函數

在控制台中調用預存程序:用 exec 過程名() 執行預存程序。

在控制台中調用函數:直接寫 SQL 語句,調用此函數。

Java中調用預存程序模板:

CallableStatement cs = conn.prepareCall(“{call 過程(?, ?, ?)} “);

cs.setXXX(1, 值1);

cs.setXXX(2, 值2);

cs.registerOutParameter(3, Types.NUMERIC);

cs.execute();

System.out.println(cs.getInt(3));

Java中調用函數:通過SQL語句調用。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.