java學習筆記————本質篇7
阿新 • • 發佈:2019-01-26
100.oracle:oracle是甲骨文公司的一個大型資料庫產品,一般在大型專案中應用較多。 比如:銀行、大型企業系統等。和oracle資料庫類似的資料庫還有db2 Oracle資料庫:是一個檔案系統,是物理概念。 安裝: // SCOTT HR 解鎖 例項:一個例項其實是指一系列的後臺程序和記憶體結構// Oracle可以有多個例項,大部份情況就一個例項。 也就是說oracle就是 一整個 大的資料庫(例項) ===> 就一個數據庫 // 例項 = 資料庫 // 例項下面有 N個使用者 + N個表空間 使用者: 每個 資料庫例項 下面可以有 許多使用者 // 多個例項可以有相同的使用者名稱的使用者 // oracle 中使用者的概念相當於mysql中的database的概念 表空間: 例項下面可以有多個表空間,表空間是對物理資料檔案的邏輯對映。 // 使用者都有自已的預設表空間 // 表空間是邏輯概念,一個表空間對應著一個或者多個物理儲存檔案(.dbf,.ora) 使用者和表空間的關係: 一個使用者有一個預設的表空間, 一個表空間可以為多個使用者作為預設表空間, 使用者和使用者之間的資料是隔離,資料不會混。 Oracle資料庫源: driver: oracle.jdbc.OracleDriver url: jdbc:oracle:thin:@localhost:1521:orcl username: zhangsan password: zhangsan // oracle 中使用者的概念相當於mysql中的database的概念 //別名 = 表列名 Oracle的基本命令: 使用指定使用者登陸連線到oracle, Sqlplus username/password [as sysdba 管理員才需要] 顯示當前使用者 Show user; 退出使用者 Exit; 切換使用者 Conn username/password [as sysdba 管理員才需要] 檢視當前使用者可以訪問的表有哪些 Select * from tab; 查詢某張表的資料 Select * from dept; 查看錶結構 Desc dept; // 不同的使用者的表是隔離的,但是許可權大的使用者可以訪問其它使用者的表。跨使用者訪問。 Select * from scott.demp; 1.Oracle的簡單查詢: --簡單查詢 select * from emp; select empno , ename from emp; select empno as 員工編號, ename as 員工姓名 from emp; // as 別名 select empno 員工編號, ename 員工姓名 from emp;// 可省略 --字串連線查詢 // 使用distinct可以消除重複的行,如果查詢多列的必須保證多列都重複才能去掉重複 select '員工名為'||ename||'的工作是'||job||'的部門是'||deptno from emp;// 記錄去重, 必需所有列都一樣才算重複 ||: 相當於java程式的 + 連線字串 select distinct job from emp; select distinct ename, deptno , job from emp; --四則運算 select ename 姓名, sal * 12 年薪 from emp; 2.Oracle限定查詢A: --限定查詢 select * from emp where sal > 1500; --為空和非空判斷,金為null 或不為null select * from emp where comm is null; select * from emp where comm is not null; --多個條件 並且and ,查詢工資大於1500並且有獎金的 select * from emp where sal > 1500 and comm is not null; --多個條件 或者,查詢工資小於1500或者comm為空 select * from emp where sal < 1500 or comm is null; --not 取反 select * from emp where not(sal <= 1500 or comm is null); -- 區間 select * from emp where sal >= 1500 and sal <= 3000; select * from emp where sal between 1500 and 3000; --時期 // to_date() select * from emp where hiredate between to_date('1981-1-1','yyyy-MM-dd') and to_date('1981-12-30','yyyy-MM-dd') --sql語句不區分大小寫,但欄位的值區分 // 欄位的值區分 大小寫!!! select * from emp where ename = 'SMITH'; // sql語句不區分大小寫,但是 它的值 是區分大小寫的!!! smith != SMITH 3.Oracle限定查詢B: --範圍查詢 // in not in select * from emp where empno = 7369 or empno = 7499 or empno = 7521 select * from emp where empno in (7369, 7499, 7521) select * from emp where empno not in (7369, 7499, 7521) --模糊查詢 // like _:匹配一個長度 %:N位 select * from emp where ename like '_M%' select * from emp where ename like '%M%' select * from emp where ename like '%M__' select * from emp where ename like '%' --不等於 != <> // 都是不等 兩種寫法而已 select * from emp where empno != 7369; select * from emp where empno <> 7369; 4.Oracle排序. // asc:升序 desc:降序 預設:asc(可省略) --排序 order by 列名 asc 升序(從小到大) / desc(降序從大到小) select * from emp order by sal asc, hiredate desc 5.Oracle單行函式. --尾表 // 虛擬表 select 1 from dual; --單行函式 --小寫變大小寫 select upper('smith') from dual; --大寫變小寫 select lower('SMITH') from dual; --首字母大寫 select initcap('smith') from dual; --擷取 select substr('hello',1,3) from dual; // 索引 從1開始 --替換 select replace('hello','l','x') from dual; --計算字元長度 select length('hello') from dual; --連線字串 select concat('hello','world') from dual; select 'hello'||'world' from dual; // 建議用 || 跨平臺 --數值函式 取整四捨五入 select round(12.48) from dual; select round(12.48, 1) from dual; // 保留幾位小數 --去除小數 select trunc(231.123) from dual; select trunc(123.123,2) from dual; // 保留幾位小數 --取模 // 取餘 select mod(10, 3) from dual; 6.Oracle日期函式. --日期函式 select sysdate from dual; --計算兩個日期之間的天數 // 日期1 - 日期2 --員工進入公司的週數 select ename ,trunc((sysdate - hiredate) / 7) from emp; --計算兩個日期之間的月數 // months_between('當前時間','要計算的時間') ==== 兩個日期之間的月數 select months_between(sysdate,to_date('2016-1-1','yyyy-MM-dd')) from dual; --員工進入公司的月數 select ename, trunc(months_between(sysdate,hiredate)) from emp; --加月 // add_months() select add_months(sysdate, 12) from dual; --下一個星期幾 // next_day()下一個星期X的 當前時間 ==> 以當前時間為基準,查詢下一個星期X 的此時此刻的時間 select next_day(sysdate, '星期一') from dual; --計算當前月最後一天 // last_day(sysdate) select last_day(sysdate) from dual; 7.Oracle的轉換函式. --轉換函式 --to_char 把日期轉成字串 // to_char 把日期轉成字串 select ename , to_char(hiredate, 'yyyy') 年 , to_char(hiredate, 'mm') 月,//fmmm:去掉0(2016-1-1) mm:2016-01-01 to_char(hiredate, 'dd') 日, to_char(hiredate, 'hh') 小時,//hh24:24進位制 hh:12進位制 to_char(hiredate, 'mi') 分, to_char(hiredate, 'ss') 秒 from emp; select ename , to_char(hiredate, 'fmyyyy-mm-dd hh24:mi:ss') from emp; //fm:去掉0(2016-01-01 ==> 2016-1-1)hh24:24進位制 hh:12進位制 --給數字新增分割符 select ename , to_char(sal, '99,999') from emp; // 1,234 select ename , to_char(sal, '$99,999') from emp; // $1,234 select ename , to_char(sal, 'l99,999') from emp; // ¥1,234 --把字串轉成數值 // to_number('數字字元') select to_number('10') + to_number('10') from dual; --把字串轉成日期 // to_date select to_date('1986-08-21 12:30:21','yyyy-mm-dd hh24:mi:ss') from dual; 8.Oracle通用函式. --通用函式 --為空處理nvl // nvl('欄位',0) 為空處理 select * from emp; select ename , sal * 12 + comm from emp;--任何數和null相加等於null select ename , sal * 12 + nvl(comm, 0) 年薪 from emp; --decode分支判斷 decode() ====>switch select * from emp; select decode(3, 1, '我是1', 2, '我是2','其它') from dual; // select switch(x, if(x=1), {'我是1'}, if(x=2), {'我是2'},else{'其它'}) from dual; select ename , decode(job, 'CLERK', '業務員','SALESMAN', '銷售員','MANAGER','經理','ANALYST','分析師','PRESIDENT','總裁') job from emp; -- case when end case when end====> if...else if()......else select ename, (case when job = 'CLERK' then '業務員' when job = 'SALESMAN' then '銷售員' when job = 'MANAGER' then '經理' when job = 'ANALYST' then '分析師' when job = 'PRESIDENT' then 'PRESIDENT' else '無業' end) cjob from emp; 9.Oracle多表聯合查詢上. --多表聯合查詢 --查詢員工的編號 姓名 部門編號和 部門名稱 select * from emp , dept;// 笛卡爾積emp*dept select e.empno, e.ename, d.deptno, d.dname from emp e , dept d where e.deptno = d.deptno// 員工的部門編號 = X部門編號---對上號 --查詢員工的上級領導 select e1.ename, e1.empno, e2.ename, e2.empno from emp e1, emp e2 where e1.MGR = e2.empno;// 員工的上級編號 = X員工編號---對上號 10.Oracle多表聯合查詢下. --查詢員工的上級和部門 select e.empno , e.ename, e1.empno, e1.ename , d.deptno , d.dname from emp e , emp e1, dept d where e.mgr = e1.empno and e.deptno = d.deptno; --查詢員工的編號 名稱 部門名稱 和 上級領導以及領導的工資等級 select e.empno, e.ename, d.dname, decode(s.grade, 1, '一級', 2, '二級', 3, '三級', 4, '四級', 5, '五級')emp_grade,// 這裡 加一個 列名:emp_grade 否則,顯示:decode(s.grade,1,'一級',.... e1.ename, decode(s2.grade, 1, '一級', 2, '二級', 3, '三級', 4, '四級', 5, '五級')mgr_grade // 這裡 加一個 列名:mgr_grade否則,顯示:decode(s.grade,1,'一級',.... from emp e, emp e1, dept d, salgrade s, salgrade s2 where e.deptno = d.deptno and e.mgr = e1.empno and e.sal between s.losal and s.hisal// 員工的工資等級 在 xx 範圍內 and e1.sal between s2.losal and s2.hisal;// 領導的工資等級 在 yy 範圍內 11.Oracle外連線上.// 在兩張表關聯的時候,在非全量表的關聯欄位後面加上(+) 就可以做外連線查詢 作用: 不會因為另一張表的資料的關聯而被篩選掉 1.非全量: 有殘缺對映的物件 (對映 = 關聯) 資料關聯 可能為空// 反正就是在 有殘缺對映 的物件後加(+) 記住這個就OK了!!! 2.全量: 被對映物件-----------------> 掌握主動權的 即為全量 --外連線查詢 --就是在做查詢的時候在非全量表的欄位後加上(+) --查詢所有部門的員工 select * from dept d , emp e where d.deptno = e.deptno;// 若 emp_孔明 沒對映到 dept(無部門狀態) ,孔明就不會被查詢到(少了一個員工) --全量表在左邊就是左接連 // (可能有殘缺)對映物件 : emp ==> 非全量 // 被對映物件: dept ==> 全量------------------> 掌握主動權的 即為全量 select * from dept d , emp e where d.deptno = e.deptno(+); //全量d , 非全量e where 全量d = 非全量e(+) //規範:where 前後 表的順序對應 --全量表在右邊就是右接連 select * from emp e , dept d where e.deptno(+) = d.deptno;//非全量e , 全量d where 非全量e(+) = 全量d 12.Oracle外連線下. --查詢員工編號 姓名 上級領導姓名 和 編號 select e.empno, e.ename, e1.empno, e1.ename from emp e , emp e1 where e.mgr = e1.empno(+);// 在 有殘缺對映的 物件後面加(+) /* 分頁: 開始記錄數: startNum = (pageNo - 1)*pageSize; // pageNo:當前頁數 pageSize:每頁顯示記錄數 結束記錄數: endNum = pageNo*pageSize + 1; */ 100.自帶工具類: IOUtils.toString(InputStream ) ==> String text //commons-io-1.4.jar BeanUtils.populate(javaBean, map); //commons-beanutils-1.8.3.jar StringUtils.isNotBlank(String s);==> 可以過濾 ""、" "和null即 != null 和 "" 和 ""(可以過濾空格) StringUtils.isNotEmpty(String s);==> 可以過濾 ""、null 即 != null 和 "" StringUtils.isBlank(String s);==> "" / null / " "(空格) StringUtils.isEmpty(String s);==> "" / null 101.重要的類及其方法: Class: public ClassLoader getClassLoader() public InputStream getResourceAsStream(String name) Class<? extends BaseAction> clazz = this.getClass();//在父類構造方法中傳入該引數,則子類繼承父類時, this就代表:子類,獲得的是:繼承此類的子類的Class物件 getSimpleName() // 返回原始碼中給出的底層類的簡稱。 即:cn.it.basedao.domain.User -----> User DateFormat: DateFormat df = new SimpleDateFormat("dd/MM/yyyy");// 日期格式化 df.parseObject(); df.format(); value !=null && value.trim().length()>0 Method[] methods = clazz.getMethods();// 獲得類中的所有的方法. FileUtils工具的copyInputStreamToFile 102.自己總結的java辭典: 1.API:即功能.(原始碼:一堆jar包) // 方法 作用 功能 2.HTML頁面:就是一個文字 JSP頁面: 是一個Servlet程式// 執行完業務邏輯(一般也就動態獲取值——顯示資料用) 最終都會向頁面 out.write(..)回HTML格式的文字 3.持久化:就是一個IO操作而已 // 從記憶體————>磁碟 103.對比: service(ServletRequest req, ServletResponse res); doFilter(ServletRequest request, ServletResponse response,FilterChain chain);//放行:chain.doFilter(request, response);可過濾所有資源 之前攔截 intercept(ActionInvocation invocation)//放行:invocation.invoke();struts2框架 僅針對action 之前 + 之後 StrutsStatics ActionContext 此處規定 : contextMap = ActionContext + ValueStack 1.重要屬性: // ActionContext ——————— _values :request 、 session 、 application 、 parameters 、 attr // ValueStack ——————— _root :action contextMap是動作訪問的資料中心,本質是一個ActionContext類,這個類有一個Map.可以操作 _root 和 _values class ActionContext{ private Map<String, Object> context;// 此 context —————— contextMap = _root(action) + _values(request、session、application、parameters、attr) } /** 檢視原始碼,觀察到 明明是 valueStack 包含 ObjectStack 和 ContextMap , 為啥這裡又說 context(ContextMap) 包含 root(valueStack) + http物件(ContextMap)??? 關於這點,是幾個繼承造成的!!! OgnlValueStack implements ValueStack OgnlValueStack 兩個屬性 root(ObjectStack) context(:ContextMap) 而 其中的一個屬性 context(ContextMap) 它本身也包含這兩個屬性 _root(ObjectStack) _values(ContextMap) 且struts把 root 賦值給了 _root 所以 其實我們這裡的 context = _root(root) + _values*/ 2.其子類 // 繼承了兩個類的API 可以操作_root 和 _values ServletActionContext extends ActionContext implements StrutsStatics 1.http相關API———— 從 StrutsStatics介面 繼承而來 getPageContext()、 get/setRequest() 、get/setResponse()、get/setServletContext() 2.ActionContext相關API———————— 從 ActionContext 繼承而來 getContext() 3.自定義的API getActionContext(HttpServletRequest) 、getValueStack(HttpServletRequest req);// 獲取給定的 request 的 Action上下文/值棧 getActionMapping() 4.有參構造: private ServletActionContext(Map context) { super(context); } 104.容易忘的小知識: Content-Disposition:代表檔案需要以下載的形式開啟.// attachment;filename=${filename}attachment:附件 <mime-mapping>// 可以在 tomcat的web.xml中 找到setContentType("application/octet-stream") ———————— 告訴瀏覽器,檔案型別為二進位制的 , 瀏覽器就就肯定會以下載的方式開啟 <extension>bin</extension> // extension:副檔名MIME:多用途因特網(Internet)郵件擴充套件 <mime-type>application/octet-stream</mime-type>// octet:八位位元組bin:二進位制 </mime-mapping> Context : 上下文 content : 內容 response.setContentType("...");// 告訴瀏覽器, 我給你響應回來的是什麼型別的檔案 圖片/html/json/二進位制/... 官方學名:給響應資料,指定MIME型別 JDK動態代理:實現一個介面實質:父類呼叫子類 ——————多型 cglib代理:沒有實現介面的類,只能使用cglib代理! // JDBC 僅 連線資料庫 + 傳送SQL到資料庫端 // 執行SQL —————— 資料庫 105.java中的標準與實現:// 標準一般由 掌握話語權(有專利權)的公司/聯盟/組織 提供 , 實現由下面各個廠商去具體實現 標準(介面) 實現 聯盟 JDBC mysql-jdbc.jarSUN AOP AspectJAOP聯盟 Tcp/ip HTTP<——————SOAP W3C// 均為通訊協議————————通訊:傳輸資料 106.java基礎小知識: 1.又讀又寫: 位元組流 eg:copy檔案 中間過程為:位元組——————>位元組 但是如果用字元流:位元組——>字元——>位元組 效率肯定下降!!! 只讀/寫: 字元流 位元組讀/寫到頁面就OK! 不用轉換為位元組! 非要用字元流拷貝,也只能拷貝 純文字! 2.裝飾著模式: 1.A類 和 B類 實現相同的介面; 2.B類的構造中獲得 A類的引用; 3.B類重寫介面的方法中傳入 A類物件需要增強的方法, 然後再其上/下面寫需要增強的內容! 107.擴充套件小常識: 1. FIFO:先入先出(first in,first out) FILO:先進後出 (first-in,last-out) 2.POJO——————hashMap 每一個pojo物件都可以對映成一個map /** 掌控自己的思維!我們的大腦就是一臺高階計算機!思維就是執行在大腦上的程式! 我們需要不斷的學習,不斷的完善、升級大腦上的程式!修復負面思維————BUG! */