這些天過的好亂,也許是因為考完試了,心裡有些松懈吧。也許是最近發生的事對我有些觸動
吧。感覺自己都已經不懂自己了。面對一些人的教導,我很感激。因為很多話都對我有非常大的幫助和
啟發,也讓我除了做技術,玩程式設計外,明白了很多道理,也許這就是一個人成熟的過程吧。我真的很希
望我能夠忘掉以前的不懂事,忘掉以前的輕狂,踏踏實實的做技術。
自己的“真理”有時也會錯,自己的想法有時也很“天真”。我真的很想靜一靜。晚飯後看了
高深的東西。
我很想從現在做起,使自己能夠真正享受程式設計帶來的快樂,沒有虛榮,沒有競争,沒有雜念。
隻有快樂,隻有充實,隻有無悔。當然我說到做到,那篇日志講的是一個從點到面,從面到點的哲理。
我覺得有必要寫一個hibernate的總結性随筆,從點到面,講講hibernate查詢的6種方法。分别是hql查詢
,對象化查詢criteria方法,動态查詢detachedcriteria,例子查詢,sql查詢,命名查詢。
如果單純的使用hibernate查詢資料庫隻需要懂其中的一項就可以完成想要實作的一般功能,但是
從一個點,讓我們掌握6中方法,則提供了更多選擇。每一種方法都有其适用的情況與前提。
hql查詢
hql是hibernate自己的一套查詢語言,于sql文法不同,具有跨資料庫的優點。示例代碼:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiMx0iMx0CM9U2YzZSM9A3amETPrVmJw0Ddw9DMwgzLcZTYkFjN0QGZ2EGN40yNkhDNtgDMlBTL2EmZz0yYhhTY1MWO28CXw8CX0BXYkF2Lc52YuMWawFnLjdWdvw1LcpDc0RHaiojIsJye.jpg)
static void query(string name){
session s=null;
try{
s=hibernateutil.getsession();
//from後面是對象,不是表名
string hql="from admin as admin where admin.aname=:name";//使用命名參數,推薦使用,易讀。
query query=s.createquery(hql);
query.setstring("name", name);
list<admin> list=query.list();
for(admin admin:list){
system.out.println(admin.getaname());
}
}finally{
if(s!=null)
s.close();
}
}
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiMx0iMx0CM9U2YzZSM9A3amETPrVmJw0Ddw9DMwgzLcZTYkFjN0QGZ2EGN40yNkhDNtgDMlBTL2EmZz0yYhhTY1MWO28CXw8CX0BXYkF2Lc52YuMWawFnLjdWdvw1LcpDc0RHaiojIsJye.jpg)
适用情況:常用方法,比較傳統,類似jdbc。缺點:新的查詢語言,适用面有限,僅适用于hibernate架構。
對象化查詢criteria方法:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiMx0iMx0CM9U2YzZSM9A3amETPrVmJw0Ddw9DMwgzLcZTYkFjN0QGZ2EGN40yNkhDNtgDMlBTL2EmZz0yYhhTY1MWO28CXw8CX0BXYkF2Lc52YuMWawFnLjdWdvw1LcpDc0RHaiojIsJye.jpg)
static void cri(string name,string password){
criteria c=s.createcriteria(admin.class);
c.add(restrictions.eq("aname",name));//eq是等于,gt是大于,lt是小于,or是或
c.add(restrictions.eq("apassword", password));
list<admin> list=c.list();
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiMx0iMx0CM9U2YzZSM9A3amETPrVmJw0Ddw9DMwgzLcZTYkFjN0QGZ2EGN40yNkhDNtgDMlBTL2EmZz0yYhhTY1MWO28CXw8CX0BXYkF2Lc52YuMWawFnLjdWdvw1LcpDc0RHaiojIsJye.jpg)
适用情況:面向對象操作,革新了以前的資料庫操作方式,易讀。缺點:适用面較hql有限。
動态分離查詢detachedcriteria
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiMx0iMx0CM9U2YzZSM9A3amETPrVmJw0Ddw9DMwgzLcZTYkFjN0QGZ2EGN40yNkhDNtgDMlBTL2EmZz0yYhhTY1MWO28CXw8CX0BXYkF2Lc52YuMWawFnLjdWdvw1LcpDc0RHaiojIsJye.jpg)
static list dc(detachedcriteria dc) {
session s = hibernateutil.getsession();
criteria c = dc.getexecutablecriteria(s);
list rs = c.list();
s.close();
return rs;
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiMx0iMx0CM9U2YzZSM9A3amETPrVmJw0Ddw9DMwgzLcZTYkFjN0QGZ2EGN40yNkhDNtgDMlBTL2EmZz0yYhhTY1MWO28CXw8CX0BXYkF2Lc52YuMWawFnLjdWdvw1LcpDc0RHaiojIsJye.jpg)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiMx0iMx0CM9U2YzZSM9A3amETPrVmJw0Ddw9DMwgzLcZTYkFjN0QGZ2EGN40yNkhDNtgDMlBTL2EmZz0yYhhTY1MWO28CXw8CX0BXYkF2Lc52YuMWawFnLjdWdvw1LcpDc0RHaiojIsJye.jpg)
detachedcriteria dc = detachedcriteria.forclass(user.class);
int id = 1;
if (id != 0)
dc.add(restrictions.eq("id", id));
date age = new date();
if (age != null)
dc.add(restrictions.le("birthday", age));
list users = dc(dc);
system.out.println("離線查詢傳回結果:" + users);
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiMx0iMx0CM9U2YzZSM9A3amETPrVmJw0Ddw9DMwgzLcZTYkFjN0QGZ2EGN40yNkhDNtgDMlBTL2EmZz0yYhhTY1MWO28CXw8CX0BXYkF2Lc52YuMWawFnLjdWdvw1LcpDc0RHaiojIsJye.jpg)
适用情況:面向對象操作,分離業務與底層,不需要字段屬性攝入到dao實作層。 缺點:适用面較hql有限。
例子查詢
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiMx0iMx0CM9U2YzZSM9A3amETPrVmJw0Ddw9DMwgzLcZTYkFjN0QGZ2EGN40yNkhDNtgDMlBTL2EmZz0yYhhTY1MWO28CXw8CX0BXYkF2Lc52YuMWawFnLjdWdvw1LcpDc0RHaiojIsJye.jpg)
static list example(user user) {
list<user> users = s.createcriteria(user.class).add(
example.create(user)).list();
// list<user>
// users2=s.createcriteria(user.class).add((example.create(user)).ignorecase())
// .createcriteria("child").add((example.create(user))).list();
return users;
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiMx0iMx0CM9U2YzZSM9A3amETPrVmJw0Ddw9DMwgzLcZTYkFjN0QGZ2EGN40yNkhDNtgDMlBTL2EmZz0yYhhTY1MWO28CXw8CX0BXYkF2Lc52YuMWawFnLjdWdvw1LcpDc0RHaiojIsJye.jpg)
适用情況:面向對象操作。 缺點:适用面較hql有限,不推薦。
sql查詢
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiMx0iMx0CM9U2YzZSM9A3amETPrVmJw0Ddw9DMwgzLcZTYkFjN0QGZ2EGN40yNkhDNtgDMlBTL2EmZz0yYhhTY1MWO28CXw8CX0BXYkF2Lc52YuMWawFnLjdWdvw1LcpDc0RHaiojIsJye.jpg)
static list sql() {
query q = s.createsqlquery("select * from user").addentity(user.class);
list<user> rs = q.list();
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiMx0iMx0CM9U2YzZSM9A3amETPrVmJw0Ddw9DMwgzLcZTYkFjN0QGZ2EGN40yNkhDNtgDMlBTL2EmZz0yYhhTY1MWO28CXw8CX0BXYkF2Lc52YuMWawFnLjdWdvw1LcpDc0RHaiojIsJye.jpg)
适用情況:不熟悉hql的朋友,又不打算轉資料庫平台的朋友,萬能方法 缺點:破壞跨平台,不易維護,不面向對象。
命名查詢
static list namedquery(int id) {
query q = s.getnamedquery("getuserbyid");
q.setinteger("id", id);
return q.list();
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiMx0iMx0CM9U2YzZSM9A3amETPrVmJw0Ddw9DMwgzLcZTYkFjN0QGZ2EGN40yNkhDNtgDMlBTL2EmZz0yYhhTY1MWO28CXw8CX0BXYkF2Lc52YuMWawFnLjdWdvw1LcpDc0RHaiojIsJye.jpg)
<?xml version="1.0" encoding="utf-8"?>
<!doctype hibernate-mapping public "-//hibernate/hibernate mapping dtd 3.0//en"
<hibernate-mapping>
<class name="com.sy.vo.user" table="user" catalog="news">
</class>
<!-- 命名查詢:定義查詢條件 -->
<query name="getuserbyid">
<![cdata[from user where id=:id]]>
</query>
<!-- 命名查詢中使用sql,不推薦使用,影響跨資料庫
<sql-query name="getuserbyid2">
<![cdata[select * from user where
]]>
</sql-query> -->
</hibernate-mapping>
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiMx0iMx0CM9U2YzZSM9A3amETPrVmJw0Ddw9DMwgzLcZTYkFjN0QGZ2EGN40yNkhDNtgDMlBTL2EmZz0yYhhTY1MWO28CXw8CX0BXYkF2Lc52YuMWawFnLjdWdvw1LcpDc0RHaiojIsJye.jpg)
适用情況:萬能方法,有點像ibatis輕量級架構的操作,友善維護。 缺點:不面向對象。基于hql和sql,有一定缺陷。
**************精品軟體推薦:netbeans6.5 java和php開發人員的利器*****************
程式員雜志上robbin推薦了這個ide,于是昨天下載下傳了一個,個人感覺很好用。以下是我覺得比較好的地方:
netbeans6.5(最新版)是一個免費的ide工具,很利于推廣。
基于jdk5和6,基于tomcat6,mysql5。
支援插件,有完美漢化的開發環境,利于新手使用。
目前支援j2se,j2ee(jsf,ejb,hibernate,spring,jpa),j2me,
php,ruby,c/c++,groovy,javafx,js......的開發。
c/c++需要自己添加配置,預設不支援編譯。ruby預設有内置解析器。
别的支援有待嘗試。
具備自動提示,但是感覺速度較慢,不夠強。
xml配置檔案操作智能化,友善開發。
記憶體占用少160mb左右,軟體大小不到250mb。