2014年3月5日 星期三

spring4 + hibernate4 Java sample code

java code基本上我看跟3是一樣的XD...
就是那個hibernate currentSession怪怪的QQ...

就照基本的spring分吧~
不過偶省掉了一個有些版本在寫的interface/implement...

我通常使用非特定的物件來處理~
因為return資料的型態為json格式, 在Java上不用定死的Bean物件~
轉而利用List, Map來組成~
好處是不用處理特定的型態~ Json物件裡面還是有要分String/int/...bala
取用也要放對才有正確的型態~
不過用基礎物件的話~ 只要放好Integer/Double/String....etc...balabala...
甚至於null, 裡面若還是List/Map 多層也都會正確轉換~
要注意的大概是Date型態~ 自動轉換會變成非常複雜的js Date物件~
所以我大多是在轉入Map時~ 用SimpleDateFormat先轉成需要的字串格式就可以了~

spring協助處理了一些uri pattern的問題~
不過也會因為他包過~ 造成有時候不知道發生了什麼事~
碰過的幾項注意事項大概就是

1. uri pattern的結尾不要輸入有點"."的資料~
bad pattern: /aaa/{num}
因為spring會自己把"."後面的資料切掉~ 對數字來說~ 數字就錯了!!...ex: 11.993 --> 11
避免方式大概就是在會有點的資料多一個/, 或是不要以他為最後一個參數
call use: http://xxxxxxx/aaa/11.993/
或是改pattern為 /aaa/{num}/input

2.  pattern變數有空白
bad pattern: /aaa/{emp ty}/input
空白有時候很小~ 很容易沒看到XD...然後他就莫名的GG了

3. pattern和底下的變數名稱不一樣
copy 來copy去的時候~ 挺容易發生的...

4. 不同method使用到重覆的pattern
這個應該很好理解~ 命名規則最好一開始就能先有個規則~ 以免剛好跟共同開發的人~ 心有靈兮一點通後就打架了...

5. 中文轉碼問題...
因為web server本身就可以設定編碼(若不設定會看local/OS地區, 或你安裝的那一包...有時候外在主機環境~ 是不能改web server設定的~ 就只能從程式動)... 而filiter也可以設定... spring也會有小聰明...連Broswer都很貼心的幫你轉(FF/Chrome會, 老IE不會....)
為了可以write once..run anywhere....別人好心幫你搬家完後也不會出事 ...
最保險的還是前後端講好~ 前端先encodeURIComponent~
這樣子永遠不會被誰多轉一次

sample code
-----------------------------------
Controller
----------------------------------

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.apache.log4j.Logger;

import java.util.*;

@Controller
public class SampleController {

    @Autowired
    SampleService theService;

    @RequestMapping(value={"/test/list"}, method = RequestMethod.GET)
    public @ResponseBody List fn1(Model model){
        return theService.test1();
    }
}

-------------------------------------------
Service
-------------------------------------------
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

@Component
public class SampleService {

    @Autowired
    SampleDao dao = null;


    public List test1()  {
        return dao.test1();
    }
}

-----------------------------------------
Dao
----------------------------------------
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.stereotype.Component;
import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.SQLQuery;
import org.hibernate.type.StringType;
import org.hibernate.type.TimestampType;
import org.hibernate.type.IntegerType;

import java.util.*;
import java.text.SimpleDateFormat;
import com.iisi.commons.DBQuickUtils;

@Repository
public class SampleDao {

    Logger logg = Logger.getLogger(this.getClass());

    @Autowired
    SessionFactory sessionFactory;

     SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    private Session curSession()  {
        Session ses = sessionFactory.getCurrentSession();
        return ses;
    }

    public List test1()  {

        String sql = "select * from test_table";
        SQLQuery qry = curSession().createSQLQuery(sql);
        qry = qry.addScalar("id", IntegerType.INSTANCE).addScalar("name", StringType.INSTANCE)
                 .addScalar("utime", TimestampType.INSTANCE);

        List lst = qry.list();

        List re = hibernateResultToMap(lst, sf, new String[]{"ID", "NAME", "TIME"});

        return re;
    }
}

沒有留言: