Java編碼規(guī)范終極版課件_第1頁(yè)
Java編碼規(guī)范終極版課件_第2頁(yè)
Java編碼規(guī)范終極版課件_第3頁(yè)
Java編碼規(guī)范終極版課件_第4頁(yè)
Java編碼規(guī)范終極版課件_第5頁(yè)
已閱讀5頁(yè),還剩73頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、編碼小貼士Coding Tips第1頁(yè),共78頁(yè)。目錄結(jié)構(gòu)編碼規(guī)范篇項(xiàng)目結(jié)構(gòu)篇java基礎(chǔ)篇java性能篇java線程篇java設(shè)計(jì)篇code review篇數(shù)據(jù)庫(kù)篇模板篇開(kāi)發(fā)運(yùn)維篇數(shù)據(jù)庫(kù)設(shè)計(jì)命名規(guī)范篇其他篇第2頁(yè),共78頁(yè)。編碼規(guī)范篇3第3頁(yè),共78頁(yè)。命名規(guī)范Package命名包名稱全部小寫,包的路徑符合所開(kāi)發(fā)的系統(tǒng)模塊的定義,盡量使用單一職責(zé)原則所有五阿哥的包路徑命名為com.wuage.xx(其中xx為具體業(yè)務(wù)相關(guān))比如:com.wuage.sellercom.wuage.crmcom.wuage.order類名 類名首字母應(yīng)該大寫。全局變量、方法以及所有標(biāo)識(shí)符(如參數(shù)、局部變量)的首

2、字母應(yīng)小寫,且使用駝峰法。命名滿足見(jiàn)名知意4第4頁(yè),共78頁(yè)。命名規(guī)范接口采用完整的英文描述符說(shuō)明接口封裝,所有單詞的第一個(gè)字母大寫。習(xí)慣上,名字前面加上大寫的 I, 遵守單一職責(zé)原則及接口隔離原則比如:interface Iraster方法方法采用完整的英文描述說(shuō)明成員方法功能,第一個(gè)單詞盡可能采用一個(gè)生動(dòng)的動(dòng)詞,盡量滿足見(jiàn)名知意且注意使用設(shè)計(jì)原則比如:sayHello()getName()run()5第5頁(yè),共78頁(yè)。命名規(guī)范常量字段一般全部采用大寫字母,單詞之間用下劃線分隔(也有特例,如Java 類庫(kù)中關(guān)于顏色的常數(shù)沒(méi)有嚴(yán)格地全部使用大寫字母)比如:static final int MI

3、N_WIDTHstatic final int MAX_WIDTH變量字段采用駝峰標(biāo)示法,遵守見(jiàn)名知意原則比如:int myIndex6第6頁(yè),共78頁(yè)。組合語(yǔ)句錯(cuò)誤代碼if (condition) statement1;if (condition1)if (condition2) statement2;else statement3;正確代碼if (condition) statement1;if (condition1) if (condition2) statement2; else statement3;7第7頁(yè),共78頁(yè)。DAO層命名規(guī)范DAO接口全部以I開(kāi)始以DAO結(jié)束,如IUse

4、rDAO.javaDAO實(shí)現(xiàn)類全部以IBatis開(kāi)始以Impl結(jié)束并繼承DAO接口 如:IBatisUserDAOImpl.java實(shí)體全部以Model結(jié)尾如:UserModel8第8頁(yè),共78頁(yè)。service設(shè)計(jì)規(guī)范讀寫分離接口寫接口以I開(kāi)始OperateService結(jié)束,比如IUserOperateService.java 讀接口以I開(kāi)始QueryService結(jié)束,比如IUserQueryService.java實(shí)現(xiàn)類以O(shè)perateServiceImpl或者QueryServiceImpl結(jié)束,比如UserQueryServiceImpl.java自包含盡量捕獲異常輸出日常并返回業(yè)

5、務(wù)方錯(cuò)誤的code9第9頁(yè),共78頁(yè)。使用正確的code format制作codetemplate和codeformat文件打開(kāi)Eclipse,導(dǎo)入code-style/codeformat.xml10第10頁(yè),共78頁(yè)。Eclipse code tempaltes11第11頁(yè),共78頁(yè)。Eclipse code tempaltes-auto add12第12頁(yè),共78頁(yè)。Eclipse Save Actions13第13頁(yè),共78頁(yè)。141 、應(yīng)用名中用_來(lái)連接 ,2 子工程的命名是用. 如:這個(gè)應(yīng)用是叫wuage_web 里面的子工程可以叫wuage_web.config注意:2 、aut

6、oconfig的文件需要放在src/main/resource中,或者是在war中Java工程命名第14頁(yè),共78頁(yè)。java文件目錄結(jié)構(gòu)使用標(biāo)準(zhǔn)maven結(jié)構(gòu),具體package待定15第15頁(yè),共78頁(yè)。Java基礎(chǔ)篇16第16頁(yè),共78頁(yè)。規(guī)范描述第17頁(yè),共78頁(yè)。提供文件注釋,列出:版權(quán)說(shuō)明、版本號(hào)、生成日期、作者、模塊目的、功能、修改日志等信息。文件注釋應(yīng)放在package之前。 說(shuō)明:姓名使用漢語(yǔ)姓名。示例:/* * Copyright (C), TODO*/第18頁(yè),共78頁(yè)。類注釋放在class 或者 interface 關(guān)鍵字之前類注釋放在class 或者 interfac

7、e 關(guān)鍵字之前,import 關(guān)鍵字之后。注釋使用“/* */”注釋方式。第19頁(yè),共78頁(yè)。公有方法格式公有和保護(hù)方法注釋內(nèi)容:列出方法的一句話功能簡(jiǎn)述、功能詳細(xì)描述、輸入?yún)?shù)、輸出參數(shù)、返回值、異常等。第20頁(yè),共78頁(yè)。異常注解第21頁(yè),共78頁(yè)。中文問(wèn)題描述:代碼里不能有中文,除了注釋錯(cuò)誤的代碼:if(topDomainSelection.equals(請(qǐng)選擇一個(gè)頂級(jí)域名,免費(fèi)開(kāi)通旺鋪)正確的代碼:if(topDomainSelection.equals(“none”)比如有中文時(shí): 需要把中文放到xml或properties文件中,java類引用22第22頁(yè),共78頁(yè)。構(gòu)造數(shù)字23第

8、23頁(yè),共78頁(yè)。在finally中釋放資源描述:在finally中釋放資源 數(shù)據(jù)庫(kù)連接、打開(kāi)的文件等/ 關(guān)閉文件OutputStream ostream = null;try ostream = new FileOutputStream(file); ostream.write(); finally if (ostream != null) try ostream.close(); catch (IOException e) / 關(guān)閉數(shù)據(jù)庫(kù)連接Connection conn = getConnection();try finally conn.close(); 推薦盡量使用java7的新特性

9、try-with-resources24第24頁(yè),共78頁(yè)。集合交集描述:怎么取兩個(gè)集合的交集,需要兩個(gè)for循環(huán)錯(cuò)誤代碼for(inti=0;iidArray.length;i+)while(checkedIdIt.hasNext()StringcheckedId=checkedIdIt.next();if(StringUtil.equals(idArrayi,checkedId)sorttedIdArray.add(checkedId);checkedIdIt.remove();break;正確代碼list1. retainAll(list2);此處應(yīng)該加上包含同種數(shù)據(jù)類型數(shù)據(jù),建議使用下

10、面語(yǔ)句,最好使用apache util類25第25頁(yè),共78頁(yè)。修飾符修飾符應(yīng)該按照如下順序排列:public, protected, 默認(rèn), private, abstract, static, final, transient, volatile, synchronized, native。類與接口的聲明順序: 靜態(tài)成員變量 / Static Fields靜態(tài)初始化塊 / Static Initializers成員變量 / Fields初始化塊 / Initializers構(gòu)造器 / Constructors靜態(tài)成員方法 / Static Methods成員方法 / Methods重載自O(shè)

11、bject的方法如toString(), hashCode() 和main方法類型(內(nèi)部類) / Types(Inner Classes)注意: 同等的類型,按public, protected,默認(rèn), private的順序排列,實(shí)現(xiàn)同一功能的多個(gè)方法應(yīng)放在一起,如果兩個(gè)規(guī)則有沖突,以后一條為準(zhǔn)。第26頁(yè),共78頁(yè)。描述:禁止使用魔法數(shù)字及字母,用有意義的常量名來(lái)替代錯(cuò)誤代碼正確代碼27private final static String TRUNK_IDLE = S;String orderNo = stat.getOrderNo();if(TRUNK_IDLE.equals(String

12、.valueOf(orderNo.charAt(0) orderNo = orderNo.substring(1); if(orderNo.matches(0-91,$) stat.setOrderNo(orderNo); statusForUpt.add(stat); String orderNo = stat.getOrderNo();if(S.equals(String.valueOf(orderNo.charAt(0) orderNo = orderNo.substring(1); if(orderNo.matches(0-91,$) stat.setOrderNo(orderNo);

13、 statussForUpt.add(stat); 第27頁(yè),共78頁(yè)。說(shuō)明:涉及物理狀態(tài)或者含有物理意義的常量,不應(yīng)直接使用數(shù)字或單個(gè)字母,必須用有意義的靜態(tài)常量或者枚舉來(lái)代替。常量名使用全大寫的英文描述,英文單詞之間用下劃線分隔開(kāi),并且使用 static final修飾。示例: public static final int PAGE_SIZE = 10;public static final String DEFAULT_START_DATE = 2001-12-08;第28頁(yè),共78頁(yè)。說(shuō)明:使用String customers 格式使程序的可讀性較差,String customers

14、 表示聲明了一個(gè)String數(shù)組(String )叫做customers示例:如下程序可讀性差:public String getCustomers() 如下程序可讀性好:public String getCustomers() 數(shù)組聲明第29頁(yè),共78頁(yè)。編碼規(guī)則使用自動(dòng)裝箱或靜態(tài)工廠方法valueOf代替包裝類構(gòu)造函數(shù)說(shuō)明:new一個(gè)對(duì)象時(shí)會(huì)創(chuàng)建一個(gè)新的對(duì)象。根據(jù)SUN公司說(shuō)明,使用自動(dòng)裝箱或靜態(tài)工廠方法比使用new一個(gè)對(duì)象快3.5倍。該規(guī)則可以用在有valueOf或其它靜態(tài)工廠的調(diào)用中。如 Long, Integer, Short, Character, Byte 和 Boolean。不

15、推薦的寫法:if (rs.next() bean.setCataLogId(new Long(rs.getLong(CATALOG_ID); bean.setCatgroupId(new Long(rs.getLong(CATGROUP_ID); bean.setBrandCode(rs.getString(BRANDCODE); bean.setSubTotal(new Integer(rs.getInt(SUBTOTAL); return bean; 規(guī)范的寫法: if (rs.next() bean.setCataLogId(Long.valueOf(rs.getLong(CATALOG

16、_ID); bean.setCatgroupId(Long.valueOf(rs.getLong(CATGROUP_ID); bean.setBrandCode(rs.getString(BRANDCODE); bean.setSubTotal(Integer.valueOf(rs.getInt(SUBTOTAL); return bean; 第30頁(yè),共78頁(yè)。面向接口編程面向接口編程,使用接口聲明不推薦方式:ArrayList list = new ArrayList();推薦方式:List list = new ArrayList();第31頁(yè),共78頁(yè)。IO操作不要使用 System.

17、out 與 System.err 進(jìn)行控制臺(tái)打印,應(yīng)該使用日志工具類進(jìn)行統(tǒng)一記錄或者打印。不推薦方式:catch(Exception exp1)System.out.println(Problem occured when process file: + remoteFileName);exp1.printStackTrace();catch(SocketException exp2)System.out.println(Problem occured when process file: + remoteFileName);exp2.printStackTrace();catch(IOExc

18、eption exp3)System.out.println(Problem occured when process file: + remoteFileName);exp3.printStackTrace();推薦用log打印 說(shuō)明:一個(gè)項(xiàng)目中應(yīng)該統(tǒng)一定義日志工具類的使用。1、異常中記錄日志:TODO2、調(diào)試信息跟蹤日志:TODO第32頁(yè),共78頁(yè)。IO操作流使用有Buffer功能的class說(shuō)明:更好的性能,沒(méi)有Buffer的輸出流頻繁IO操作,效率反倒低。示例FileOutputStream file= new FileOutputStream(test.txt); BufferedO

19、utputStream out = new BufferedOutputStream(file);int len = bytes.length; for (int i = 0; i len; i+ ) out.write(); out.flush();推薦用log打印 說(shuō)明:一個(gè)項(xiàng)目中應(yīng)該統(tǒng)一定義日志工具類的使用。1、異常中記錄日志:TODO2、調(diào)試信息跟蹤日志:TODO第33頁(yè),共78頁(yè)。避免在循環(huán)中使用try-catch語(yǔ)句避免在循環(huán)中使用try-catch語(yǔ)句不規(guī)范的寫法1: 未關(guān)閉IO對(duì)象,異常處理不正確。for (int i = 0; i 100; i+) try if( i 50

20、)DataBeanManager.activate(i); elseDataBeanManager.delete(i); catch(Exception exp) /TODO 推薦寫法try for(int i=0; i tmpCatEntry.length; i+) If(ItemBean.equals(tmpCatEntryi.getType() /Some exception maybe throw catch( Exception e) /異常處理第34頁(yè),共78頁(yè)。不規(guī)范的寫法1: 未關(guān)閉IO對(duì)象,異常處理不正確。try PrintWriter out = response.getW

21、riter(); out.write(flag); catch (IOException e) e.printStackTrace(); 不規(guī)范寫法2:關(guān)閉位置不合理,異常處理不正確try PrintWriter out = response.getWriter(); out.write(flag); out.flush(); out.close(); catch (IOException e) e.printStackTrace(); 推薦寫法try / . . catch(IOException ioe) /此處拋出異常 finally /先判斷對(duì)象是否存在 if(out != null)

22、 try out.close(); catch (IOException ioe) /此處使用log記錄日志 if(in != null) try in.close(); catch (IOException ioe) /此處使用log記錄日志 IO操作必須關(guān)閉IO對(duì)象第35頁(yè),共78頁(yè)。Java性能篇36第36頁(yè),共78頁(yè)。拼裝字符串描述:用StringBuffer,而不能用+或+=操作符來(lái)拼裝大量字符串錯(cuò)誤代碼String str = ;for (int i = 0; i 1000; i+) str += + i;System.out.println(str);正確代碼StringBuff

23、er buf = new StringBuffer();for (int i = 0; i 1000; i+) buf.append( ).append(i);String str = buf.toString();System.out.println(str);多線程下使用StringBuffer,單線程使用StringBuilder此點(diǎn)在java7 編譯器已經(jīng)做了優(yōu)化,但建議使用上面形式37第37頁(yè),共78頁(yè)。預(yù)編譯正則表達(dá)式38第38頁(yè),共78頁(yè)??綖锳rrayList預(yù)估初始化容量public ArrayList(); 默認(rèn)的構(gòu)造器,將會(huì)以默認(rèn)(10元素)的大小來(lái)初始化內(nèi)部的數(shù)組。pu

24、blic ArrayList(int); 用指定的大小來(lái)初始化內(nèi)部的數(shù)組。問(wèn)題1:多次擴(kuò)容。 如果數(shù)組大小不夠,系統(tǒng)會(huì)為當(dāng)前個(gè)數(shù)進(jìn)行int newCapacity= (oldCapacity* 3)/2 + 1,也就是1.5倍擴(kuò)容。例如我們要為數(shù)組動(dòng)態(tài)增加100個(gè)元素,以默認(rèn)10個(gè)元素大小創(chuàng)建的ArrayList中,將會(huì)經(jīng)過(guò)10,16,25,38,58,88,133共6次遞增擴(kuò)容才會(huì)滿足最終的要求。每次擴(kuò)容,系統(tǒng)會(huì)重新拷貝一遍已經(jīng)加入到ArrayList的數(shù)據(jù)。如果可以預(yù)計(jì)元素個(gè)數(shù),可以直接使用這個(gè)數(shù)字來(lái)實(shí)例化ArrayList。問(wèn)題2:過(guò)多的內(nèi)存開(kāi)銷。 上個(gè)例子,會(huì)產(chǎn)生13310033個(gè)元素

25、的內(nèi)存開(kāi)銷??梢允褂胠ist.trimToSize()方法去除剩余內(nèi)存空間。使用過(guò)程中可以考慮使用ensureCapacity(int minCapacity)來(lái)直接為已經(jīng)實(shí)例過(guò)的ArrayList對(duì)象進(jìn)行特定數(shù)量的擴(kuò)容。39第39頁(yè),共78頁(yè)。Java線程篇40第40頁(yè),共78頁(yè)。日期格式化41描述:日期格式化DateFormat有線程安全問(wèn)題。不推薦代碼private static final DateFormat dateFormat = new SimpleDateFormat(yyyy-MM-dd HH:mm:ss);public void save(Member member) S

26、tring ss = dateFormat.format(member.getGmtLastLoginIn();推薦代碼private static final String DEFAULT_DATE_FORMAT = yyyy-MM-dd HH:mm:ss;public void save(Member member) String ss = DateUtil. toLocaleString(member.getGmtLastLoginIn(), DEFAULT_DATE_FORMAT );第41頁(yè),共78頁(yè)。線程同步42第42頁(yè),共78頁(yè)。避免死鎖描述:以相同的順序同步對(duì)象,以避免死鎖。下

27、面的程序會(huì)啟動(dòng)兩個(gè)線程,并造成死鎖。原因是兩線程以不同順序取得兩個(gè)鎖,并互相等待。public class DeadLockMaker public static void main(String args) throws Exception final Object lock1 = new Object(); final Object lock2 = new Object(); Runnable run1 = new Runnable() public void run() synchronized (lock1) print(lock1); sleep(); synchronized (l

28、ock2) print(lock2); ; Runnable run2 = new Runnable() public void run() synchronized (lock2) print(lock2); sleep(); synchronized (lock1) print(lock1); ;43 Thread t1 = new Thread(run1, thread-1); Thread t2 = new Thread(run2, thread-2); t1.start(); t2.start(); t1.join(); t2.join(); private static void

29、sleep() try Thread.sleep(1000); catch (InterruptedException e) private static void print(String lock) System.out.printf(%s locks %sn, Thread.currentThread().getName(), lock); 第43頁(yè),共78頁(yè)。釋放ThreadLocal對(duì)象描述:服務(wù)器廣泛使用了線程池,即使線程用完也不會(huì)被丟棄。因此,假如ThreadLocal對(duì)象用完后沒(méi)被釋放,就會(huì)隨著線程長(zhǎng)期滯留在內(nèi)存中,從而導(dǎo)致內(nèi)存泄漏。解決方案:一般而言,應(yīng)用程序中應(yīng)避免使用Th

30、readLocal,因?yàn)檫@相當(dāng)于使用全局變量,會(huì)破壞OOP的良好結(jié)構(gòu)和封裝性。一個(gè)良好的框架如使用ThreadLocal,定會(huì)在某處釋放ThreadLocal對(duì)象。(Log4j MDC,WEBX,Spring等)應(yīng)用程序如一定要使用ThreadLocal,則秉承“誰(shuí)創(chuàng)建,誰(shuí)釋放”的原則,并且要在finally里釋放ThreadLocal對(duì)象。下一頁(yè)中包含了一個(gè)典型的應(yīng)用ThreadLocal的案例。44第44頁(yè),共78頁(yè)。ThreadLocal案例public class JdbcTemplate private final static ThreadLocal connectionHolde

31、r = new ThreadLocal(); public void execute(Callback callback) Connection conn = connectionHolder.get(); boolean ownership = false; if (conn = null) conn = getConnection(); connectionHolder.set(conn); ownership = true; try callback.doExecution(conn); finally if (ownership) / 原則:誰(shuí)創(chuàng)建,誰(shuí)釋放 connectionHold

32、er.set(null); try conn.close(); catch (SQLException e) 45第45頁(yè),共78頁(yè)。DB/IO等要使用結(jié)束closeDB、IO操作等需要使用結(jié)束close()的對(duì)象必須在try-catch-finally 的finally中close(),如果有多個(gè)對(duì)象需要close(),需要分別對(duì)每個(gè)對(duì)象的close()方法進(jìn)行try-catch,防止一個(gè)對(duì)象關(guān)閉失敗其他對(duì)象都未關(guān)閉推薦使用自動(dòng)裝箱寫法 catch(Exception exp) LOGGER.logp(Level.SERVRE, CLASSNAME, methodName); throw n

33、ew javax.ejb.EJBException(exp);finally stmt.close(); closeConnection();第46頁(yè),共78頁(yè)。Java設(shè)計(jì)篇47第47頁(yè),共78頁(yè)。盡快出錯(cuò)(Fail-Fast)描述:如果傳入的參數(shù)有錯(cuò)誤,應(yīng)該讓它盡快暴露出來(lái)。不推薦代碼public void save(Member member) if (member = null) member = new Member(); / 以默認(rèn)值取代非法的參數(shù),從而掩蓋了調(diào)用者的錯(cuò)誤 推薦代碼public void save(Member member) assertTrue(member !

34、= null); assertTrue(member.getAge() 0);public static void assertTrue(boolean condition) if (!condition) throw new IllegalAccessException( Assertion failed - the condition must be true); 48第48頁(yè),共78頁(yè)。避免NPE(NullPointException)描述:對(duì)于允許其值為null的變量,在對(duì)其操作前,需要預(yù)先判斷其是否為null。技巧1. 運(yùn)用“短路表達(dá)式”if (member = null | mem

35、ber.getName().equals(myname) 技巧2. 避免equals拋出NPEif (myconstant.equals(str) / 而不是str.equals(myconstant)技巧3. 利用StringUtil判斷空字符串if (StringUtil.isEmpty(str) 例外:對(duì)于不允許其值為null的變量,請(qǐng)參見(jiàn)Fail-Fast規(guī)則。49第49頁(yè),共78頁(yè)。異常處理只捕獲對(duì)自己有意義的特定異常,一般不要捕獲Exception異常try createMember(); catch (MemberAreadyExistsException e) / 避免catc

36、h (Exception e)如對(duì)某種異常做特殊處理,需要try此異常否則完全可以使用Exception捕獲異常拋出對(duì)自己無(wú)意義的異常,并保留原始的異常對(duì)象(嵌套異常)try createMember(); catch (SQLException e) throw new MemberCreationException(, e);描述異常的原因throw new MemberCreationException(Failed to create member, id= + memberId, e);所有異常要么拋出,要么處理,不能只是記錄,除非記錄就是邏輯上的處理(絕大多數(shù)情況,請(qǐng)不要吃掉異常)

37、try catch (SomeException e) log.error(eating exception, e);50第50頁(yè),共78頁(yè)。Serializable對(duì)象51第51頁(yè),共78頁(yè)。避免在代碼中“假設(shè)”用戶和系統(tǒng)的字符集編碼52第52頁(yè),共78頁(yè)。代碼review篇53第53頁(yè),共78頁(yè)。code review流程項(xiàng)目review在編碼過(guò)程中(尤其是大型項(xiàng)目),分多次review需求review根據(jù)需求的實(shí)際情況(業(yè)務(wù)重要性、復(fù)雜性)是否需要review通常是在完成代碼后進(jìn)行review54第54頁(yè),共78頁(yè)。reviewed&reviewer的要求reviewed(被review

38、方)需要遵守代碼規(guī)范,參考前面的章節(jié)。reviewer熟悉code部分的大致業(yè)務(wù)邏輯。review過(guò)程中,最好review記錄,push給相關(guān)人員修改,并最好check。熟悉codereview的checklist,下頁(yè)列出checklist。55第55頁(yè),共78頁(yè)。review check list熟悉代碼書寫規(guī)范(風(fēng)格&注釋)錯(cuò)誤和異常處理線程安全性邏輯循環(huán)(循環(huán)是否有優(yōu)化空間,是否死循環(huán)等)性能資源泄露配置文件、配置項(xiàng)數(shù)據(jù)庫(kù)相關(guān)(表結(jié)構(gòu)設(shè)計(jì)、sql注入風(fēng)險(xiǎn)、sql語(yǔ)句的性能、sql語(yǔ)句的查詢量評(píng)估)56第56頁(yè),共78頁(yè)。數(shù)據(jù)庫(kù)篇57第57頁(yè),共78頁(yè)。預(yù)防SQL Injection攻擊

39、58第58頁(yè),共78頁(yè)。批量操作SQL描述:有時(shí)需要做大量查詢、插入、更新。通過(guò)一個(gè)循環(huán)來(lái)逐條操作,其性能是很低的。解決方案如下: 請(qǐng)使用mybatis提供的批量操作來(lái)完成,而不是通過(guò)for循環(huán)59第59頁(yè),共78頁(yè)。分頁(yè)SQL須保證ORDER BY子句的唯一性60第60頁(yè),共78頁(yè)。查詢操作使用分頁(yè)61第61頁(yè),共78頁(yè)。Ibatis ID命名規(guī)則例如MS-INSERT-MS-UPDATE-MS-DELETE-MS-SELECT-MS Mapped Statement的簡(jiǎn)寫62第62頁(yè),共78頁(yè)。Ibatis sqlmap文件命名規(guī)則一般以“sqlmap-”加配置文件對(duì)應(yīng)的實(shí)體類名加“.xml”例如sqlmap-order.xml63第63頁(yè),

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論