1. 程式人生 > >java學習筆記————本質篇7

java學習筆記————本質篇7

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!
*/