bigdecimalsql
1. sqllite 如何存儲BigDecimal數據和boudle類型數據
第一個問題:
二者的區別就是運算後的精度問題,這個在對結果精度要求很高的情況下使用,如銀行系統,電子商務交易。
第二個問題:
Number可以對應java中任意的數字類型,如整型和浮點型,java中選取當然還是和業務有關啦。
第三個問題:
最後一點說的就是開發經驗了,有經驗的人都這么干,為的就是能更好更直接的與資料庫映射,更方便的使用框架進行開發如hibernate。
2. hibernate使用sql查詢
給你一個我寫的例子:
public List<Statistics> statistics(){
String sql="select "+
"sum(case when (t.type_code=3) then 1 else 0 end),"+
"sum(case when (t.type_code=5) then 1 else 0 end),"+
"sum(case when (t.type_code=8) then 1 else 0 end),"+
"sum(case when (t.type_code=0) then 1 else 0 end),"+
"sum(case when (t.type_code=6) then 1 else 0 end),"+
"sum(case when (t.type_code=9) then 1 else 0 end),"+
"count(*)"+
"from cs_cust_complaint_data t where t.from_flag='2'";
List<Statistics> stal = new ArrayList<Statistics>();
SQLQuery query = getSession().createSQLQuery(sql);
Object[] obj = (Object[])query.uniqueResult();
BigDecimal b0 = (BigDecimal)obj[0];
BigDecimal b1 = (BigDecimal)obj[1];
BigDecimal b2 = (BigDecimal)obj[2];
BigDecimal b3 = (BigDecimal)obj[3];
BigDecimal b4 = (BigDecimal)obj[4];
BigDecimal b5 = (BigDecimal)obj[5];
BigDecimal b6 = (BigDecimal)obj[6];
Double zs = b6.doubleValue();
DecimalFormat df=new DecimalFormat("#.00");
stal.add(new Statistics("卷煙營銷", b0.longValue(),Double.parseDouble(df.format(b0.doubleValue()/zs*100))));
stal.add(new Statistics("專賣法規", b1.longValue(),Double.parseDouble(df.format(b1.doubleValue()/zs*100))));
stal.add(new Statistics("煙葉生產", b2.longValue(),Double.parseDouble(df.format(b2.doubleValue()/zs*100))));
stal.add(new Statistics("政風行風", b3.longValue(),Double.parseDouble(df.format(b3.doubleValue()/zs*100))));
stal.add(new Statistics("人事勞資", b4.longValue(),Double.parseDouble(df.format(b4.doubleValue()/zs*100))));
stal.add(new Statistics("其他咨詢", b5.longValue(),Double.parseDouble(df.format(b5.doubleValue()/zs*100))));
return stal;
}
3. 如何執行綁定變數的SQL
1. 認識綁定變數:
綁定變數是為了減少解析的,比如你有個語句這樣
select aaa,bbb from ccc where ddd=eee;
如果經常通過改變eee這個謂詞賦值來查詢,像如下
select aaa,bbb from ccc where ddd=fff;
select aaa,bbb from ccc where ddd=ggg;
select aaa,bbb from ccc where ddd=hhh;
每條語句都要被資料庫解析一次,這樣比較浪費資源,如果把eee換成「:1」這樣的綁定變數形式,無論ddd後面是什麼值,都不需要重復解析
Java實現綁定變數的方法:
[java] view plain
PreparedStatement pstmt = con.prepareStatement("UPDATE employees SET salay = ? WHERE id = ?");
pstmt.setBigDecimal(1, 15.00);
pstmt.setInt(2, 110592);
/result statmement: UPDATE employees SET salay = 15.00 WHERE id = 110592
pstmt.executeQuery();
假設要將id從1到10000的員工的工資都更新為150.00元,不使用綁定變數,則:[java] view plain sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 1"); sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 2"); sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 3"); sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 4"); .... sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 10000"); 使用綁定變數,則:
[java] view plain PreparedStatement pstmt; for (id = 1; id < 10000; id++) { if (null == pstmt) pstmt = con.prepareStatement("UPDATE employees SET salay = ? WHERE id = ?"); pstmt.setBigDecimal(1, 150.00); pstmt.setInt(2, id); pstmt.executeQuery(); } 二者區別在於,不用綁定變數,則相當於反復解析、執行了1w個sql語句。使用綁定變數,解析sql語句只用了一次,之後的9999次復用第一次生成的執行計劃。顯然,後者效率會更高一些。
2. 什麼時候不應該/不必要使用綁定變數
a. 如果你用數據倉庫,一條大查詢一跑幾個小時,根本沒必要做綁定變數,因為解析的消耗微乎其微。b. 變數對優化器產生執行計劃有很重要的影響的時候:綁定變數被使用時,查詢優化器會忽略其具體值,因此其預估的准確性遠不如使用字面量值真實,尤其是在表存在數據傾斜(表上的數據非均勻分布)的列上會提供錯誤的執行計劃。從而使得非高效的執行計劃被使用。
3. 綁定變數在OceanBase中的實現
目前OceanBase中實現了綁定變數,目的主要是為了編程方便,而不是為了降低生成執行計劃的代價。為什麼呢?因為OceanBase中目前使用的是一種」靜態執行計劃「,無論什麼Query,執行流程都一樣。OB在前端代理ObConnector中實現綁定變數,將用戶傳入的變數進行to_string()操作,替代SQL語句中相應的部分,形成一個完整的SQL。然後這個SQL傳遞給MS,MS按照標准流程來解析和執行。相信不遠的將來,OB將會實現真正意義上的綁定變數,讓用戶享受到綁定變數帶來的好處。
4. mybatis bigdecimal 對應什麼類型
SQL數據類型和Java數據類型的對應關系
integer、int ---> int
tinyint、smallint ---> short
bigint ---> long
decimal、numeric ---> java.math.BigDecimal
float ---> float
double ---> double
char、varchar ---> String
boolean、bit ---> boolean
date ---> java.sql.Date
time ---> java.sql.Time
timestamp ---> java.sql.Timestamp
blob ---> java.sql.Blob
clob ---> java.sql.Clob
array ---> java.sql.Array
5. sql查詢語句
SQL查詢就是用的select相關的語句,根據不用的需求,設置關鍵屬性值和查詢區間即可完成一條查詢語句
6. 在hibernate運用sql查詢
基礎不扎實 list map等使用iterator 不是很簡單?
Iterator it=list.iterator();
while(it.hasNext()){
Permit permit=(Permit)it.next();
System.out.println(permit.getName());
}
如果在jsp裡面 直接用<s:iterator>標簽