2014年1月19日 星期日

HQL 使用簡介

HQL是官方推薦的查詢語法,

有點類似SQL,

比較不同的是所使用的查詢指令,

都是依照物件的屬性和類別名稱,

必須用物件的方式來下HQL指令,

簡單的查詢指令如下:
   
   Query query = session.createQuery("from Member m");
   List<Member> list = query.list();

   for (Member m : list) {
    System.out.println(m.getName() + "\t" + m.getAge());
   }

Criteria 查詢方式

在hibernate中,

你可以使用criteria的查詢方式,

不需要下SQL或HQL指令,

也可避免因為換資料庫造成SQL的不相容,

而需要重新改寫SQL的負擔,

最簡單的查詢方式如下:
   Criteria criteria = session.createCriteria(Member.class);
   List<Member> list = criteria.list();


2014年1月14日 星期二

雙向多對多 XML Mapping

在多對多的配置中,

會採用一個中介表來記錄對應的資料,

最常見的就是使用者(User)與角色(Role)的多對多配置,

一個User可以有很多種Role,

一個Role也對應很多個User,

可參考下圖:











2014年1月13日 星期一

單向一對多 XML Mapping

如果今天考慮一對多的配置模式,

例如一個老師教很多位學生,

如下圖:












單向多對一 XML Mapping

如果今天兩個資料表考慮的情況是多對一,

例如員工跟部門,

多個員工屬於同一個部門,一個部門有許多員工,

如下圖:













2014年1月11日 星期六

雙向一對一(唯一外鍵關聯) XML Mapping

假設今天一個供應商對應一個銀行帳戶,

但這兩個table有各自的primary key,

我們可以考慮在供應商的table裡面,

增加一個外鍵欄位來連結銀行帳戶,

參考以下的供應商(Supply)和銀行帳戶(BankAccount)的關聯圖,










2014年1月9日 星期四

單向一對一(主鍵關聯) XML Mapping

在hibernate的一對一配置中,

如果你採用的是如下的主鍵關聯方式,











可看到人和車的一對一關聯設定,

並且採用的是同一主鍵關聯對應,

2014年1月6日 星期一

JSON 格式介紹及範例

以前的交換訊息格式都是採用XML,

最近在使用AJAX時接觸到了JSON,

格式更簡單明瞭,而且剖析也更方便了,

先簡單介紹一下JSON,

在寫JS時,可以用以下的方式宣告物件和陣列,

var person = {
 "name" : "David",
 "age" : 18
};
var people = [ {
 "name" : "Apple",
 "age" : 15
}, {
 "name" : "John",
 "age" : 25
} ];

2014年1月5日 星期日

SQL查詢的inner join & outer join

剛開始學習SQL時,

常聽到關於inner join和outer join的問題,

自己研究了之後,

用以下簡單的例子分享給對此有疑慮的開發者,

Table Member











Table Dept









一般的inner join,

指的是兩個table都有相互對應到資料,

簡單的說就是只會查詢出交集的部分,

SQL語法通常會這樣下:

select * from member m,dept d where m.dept=d.no

查詢結果









可以看到查詢出來的結果,只有兩邊有交集的部分,

member的Daniel和dept的machine因為沒有交集所以不會列出來。

在outer join的部分,分成left join和right join,

left join以左邊table為主,附加對應出右邊table的資料,沒有的顯示null

right join 則以右邊table為主,附加顯示左邊table的資料

如果以下left join語法查詢

select * from member m left join dept d on m.dept=d.no

查詢結果










可看到Daniel的部門E7無法在dept裡找到資料,則顯示為null

如果用以下的right join語法查詢

select * from member m right join dept d on m.dept=d.no











在dept裡的W0 machine也因為對應不到member的人員資料而顯示為null。

2013年12月28日 星期六

JDom解析XML範例

解析XML的方式有很多種,

以下介紹使用jdom套件的方式,

使用的版本為jdom-2.0.5.jar

首先是xml的資料檔案

2013年11月24日 星期日

dataTables table plug-in

DataTables是一個應用jquery套用table資料表的插件,

可以輕鬆幫你套出有各欄位排序的資料表,

包含搜尋跟分頁的功能,

只是要套用其他CSS的話需要去修改class及css檔案內容,

如果有研究成功的話再另開一篇介紹,

資料來源官方有提供很多example,

2013年11月21日 星期四

盒子模型 Box Model

css 將每個元素都當成是一個盒子的模型,

分別由邊界(margin)、外框(border)、留白(padding)、內容(content)組成,

如下圖:


SpringMVC hello~springMVC

首先用maven建立J2EE project,可參考 build maven project

在pom.xml中配置spring及springmvc,

我採用的版本為3.0.5.RELEASE

利用m2eclipse建立J2EE project

1.安裝Maven Plugin

先到Help --> Eclipse Marketplace中搜尋maven


















選擇自己eclipse版本適用的maven plugin





















安裝完畢後會重新啟動 eclipse
2.新增一個maven專案

新增一個project,選擇其他


















搜尋maven


















選擇預設的workspace,也就是目前的workspace


















選擇Archetype,搜尋webapp















填寫相關參數

Group Id:project的唯一標示,並形成相對路徑,如com.davis.tempSpring形成/com/davis/tempSpring的相對路徑
Artifact Id:project的名稱
Version:project的版本
Packaging:打包的方式,如pom, jar, maven-plugin, ejb, war, ear, rar, par















完成之後可以看到如下項目




















最後記得確認Java Resources底下是否有三個項目

src/main/java、src/main/resources、src/test/java

以及下面的src目錄,底下的main是否含

java、resources、webapp

2013年7月4日 星期四

Hibernate get() vs load()

在Hibernate中載入數據常使用這兩個方法,

在看了一些書之後,

對其中的差異有了比較明確的瞭解,

查詢順序

get():

Hibernate會先確認id是否存在,然後在session緩存中尋找,

沒有的話找二級緩存,也沒有就查詢資料庫,

還是沒有就返回null。

2013年7月3日 星期三

Hibernate 延遲加載

在Hibernate中,

延遲加載是一個很常用的技術,

它可以在程式需要時才去調用資料庫內的對象,

避免過早加載,也可防止載入過多用不到的資源,

減少記憶體的消耗,

默認情況下,Hibernate對於其對象的關聯對象和集合類都使用延遲加載,

Hibernate Query list() vs iterator()

初次使用Hibernate時,

常會使用到這兩個查詢方式,

網路查詢到的資料有些不是很正確,

這邊分享一些自己看Hibernate實戰的心得,

查詢方式

list():

只會送出一條SQL,將結果集都存在一級和二級緩存(有開的話),

2013年6月27日 星期四

String vs StringBuilder vs StringBuffer

以前沒有考慮執行效率時

在做字串處理的時候都使用String,

如果你的字串處理需要常常變換長度和內容的話,

String s="";
for(int i=1;i<=a;i++){
 s+="2";
}

計算質數的作法

當初就有打算在工作一段時間後,

要回去看以前自己寫的高中生解題,

實在蠻汗顏的,

以前的我會這樣寫,

for(int i=1;i<=b;i++){
 time=0;
 for(int j=1;j<=i;j++){
  if(i%j==0){
   time++;
   if(time>2){
    break;
   }else if(j==i){
    System.out.println(i+" ");
   }
  }
 }
}

2013年6月25日 星期二

abstract class vs interface

對於從事JAVA的開發人員來說,

抽象類這個概念應該並不陌生,

但實際上這兩個的差異似乎又說不上來,

最近剛好有朋友問到這個部分,

索性就把自己研究的心得分享一下。

程式面的差異