æ¯ä¸ªæ¥éª¤éƒ½ä¼š(x¨¬)产生一个虚拟表åQŒè¯¥è™šæ‹Ÿè¡¨è¢«ç”¨ä½œä¸‹ä¸€ä¸ªæ¥éª¤çš„è¾“å…¥ã€‚è¿™äº›è™šæ‹Ÿè¡¨å¯¹è°ƒç”¨è€…ï¼ˆå®¢æˆ·ç«¯åº”ç”¨ç¨‹åºæˆ–者外部查询)ä¸å¯ç”¨ã€‚åªæ˜¯æœ€åŽä¸€æ¥ç”Ÿæˆçš„表æ‰ä¼?x¨¬)è¿”å?¾l™è°ƒç”¨è€…ã€‚å¦‚æžœæ²¡æœ‰åœ¨æŸ¥è¯¢ä¸æŒ‡å®šæŸä¸€åå¥åQŒå°†è·Œ™¿‡ç›¸åº”çš„æ¥éª¤ã€‚䏋颿˜¯å¯¹åº”用于SQL server 2000å’ŒSQL Server 2005çš„å„个逻辑æ¥éª¤çš„ç®€å•æ˜q°ã€?/p>
逻辑查询处ç†é˜¶æ®µ½Ž€ä»?/strong>
注:(x¨¬)æ¥éª¤10åQŒæŒ‰ORDER BYåå¥ä¸çš„列列表排åºä¸Šæ¥è¿”回的行,˜q”å›žæ¸¸æ ‡VC10.˜q™ä¸€æ¥æ˜¯½W¬ä¸€æ¥ä¹Ÿæ˜¯å”¯ä¸€ä¸€æ¥å¯ä»¥ä‹É用SELECT列表ä¸çš„列别åçš„æ¥éª¤ã€‚这一æ¥ä¸åŒäºŽå…¶å®ƒæ¥éª¤çš?是,它丘q”回有效的表åQŒè€Œæ˜¯˜q”å›žä¸€ä¸ªæ¸¸æ ‡ã€‚SQL是基于集åˆç†è®ºçš„。集åˆä¸ä¼?x¨¬)预先对它的行排åºï¼Œå®ƒåªæ˜¯æˆå‘˜çš„逻辑集åˆåQŒæˆå‘˜çš„™åºåºæ— 关紧è¦ã€‚对表进行排åº?的查询å¯ä»¥è¿”å›žä¸€ä¸ªå¯¹è±¡ï¼ŒåŒ…å«æŒ‰ç‰¹å®šç‰©ç†é¡ºåºç»„¾l‡çš„行。ANSI把这¿Uå¯¹è±¡ç§°ä¸ºæ¸¸æ ‡ã€‚ç†è§£è¿™ä¸€æ¥æ˜¯æ£ç¡®ç†è§£SQL的基¼‹€ã€?/p>
å› äØ“(f¨´)˜q™ä¸€æ¥ä¸˜q”回表(而是˜q”å›žæ¸¸æ ‡åQ‰ï¼Œä½¿ç”¨äº†ORDER BYåå¥çš„æŸ¥è¯¢ä¸èƒ½ç”¨ä½œè¡¨è¡¨è¾¾å¼ã€‚表表达å¼åŒ…括:(x¨¬)视图ã€å†…è”表值函数ã€åæŸ¥è¯¢ã€æ´¾ç”Ÿè¡¨å’Œå…±ç”¨è¡¨è¾‘ּ。它的结果必™å»è¿”回给期望得到物ç†è®°å½•的客æˆïL(f¨¥ng)«¯åº”用½E‹åºã€‚例如,下é¢çš„æ´¾ç”Ÿè¡¨æŸ¥è¯¢æ— 效åQŒåƈ产生一个错误:(x¨¬)
select *
from(select orderid,customerid from orders order by orderid)
as d
下é¢çš„视图也ä¼?x¨¬)äñ”生错è?/p>
create view my_view
as
select *
from orders
order by orderid
在SQLä¸ï¼Œè¡¨è¡¨è¾‘Ö¼ä¸ä¸å…许使用带有ORDER BYåå¥çš„æŸ¥è¯¢ï¼Œè€Œåœ¨T—SQLä¸å´æœ‰ä¸€ä¸ªä¾‹å¤–(应用TOP选项åQ‰ã€?/p>
所以è¦è®îC½åQŒä¸è¦äØ“(f¨´)表ä¸çš„行å‡è®¾ä»ÖM½•特定的顺åºã€‚æ¢å¥è¯è¯ß_(d¨¢)¼Œé™¤éžä½ ç¡®å®šè¦æœ‰åºè¡Œï¼Œå¦åˆ™ä¸è¦æŒ‡å®šORDER BY åå¥ã€‚æŽ’åºæ˜¯éœ€è¦æˆæœ¬çš„åQŒSQL Serveréœ€è¦æ‰§è¡Œæœ‰åºçƒ¦å¼•æ‰«ææˆ–使用排庘q行½W¦ã€?br />
匿å内部¾cÕd¾€å¾€æ˜¯åšä¸ÞZ¸€ä¸ªå†…部类åQˆæŽ¥å£ï¼‰çš„具体实现。在一些åã^å°ç±»åQˆplatform classåQ‰ä¸æœ‰ä¸€äº›æ¨¡æ¿æ–¹æ³•ã€‚æ¨¡æ¿æ–¹æ³•的包å«äº†å›ºå®šæµ½E‹ã€‚其䏿Ÿäº›æ¥éª¤æ˜¯è°ƒç”¨äº†å†…部类åQˆæŽ¥å£ï¼‰ä¸çš„æŸäº›æ–ÒŽ(gu¨©)³•。但是åã^å°ç±»ž®†è¿™äº›æ–¹æ³•的具体实现延迟åˆîCº†ä¸šåŠ¡¾cÖM¸ã€‚业务类调用òq›_°¾cÈš„æ¨¡æ¿æ–ÒŽ(gu¨©)³•åQŒä½†æ˜¯ä¼ 入匿å内部类的实现åšä¸ºæ¨¡æ¿æ–¹æ³•çš„å‚æ•°ã€?
½CÞZ¾‹åQ?/p>
package callback;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class AnonymousBusinessTemplateExample2 {
// 内部接å£ä¹Ÿæ˜¯å›žè°ƒæŽ¥å£åQŒåªå®šä¹‰æŠ½è±¡æ–ÒŽ(gu¨©)³•ã€?/span>
private interface Callback {
Object doIt(Connection conn) throws SQLException;
}
// æ¨¡æ¿æ–ÒŽ(gu¨©)³•åQˆæŠ½è±¡ï¼‰
private Object execute(Callback callback) throws SQLException {
Connection conn = openConnection();
try {
return callback.doIt(conn);
} finally {
closeConnection(conn);
}
}
// 业务æ–ÒŽ(gu¨©)³•(具体)
public Object sqlQuery(final String sql) throws SQLException {
//匿å内部¾cÕdšä¸ºæ¨¡æ¿æ–¹æ³•çš„å‚æ•°æ¥æ¨¡æ‹Ÿé—åŒ?/span>
return execute(new Callback() {
public Object doIt(Connection conn) throws SQLException {
return conn.createStatement().executeQuery(sql);
}
});
}
public Connection openConnection() throws SQLException {
return DriverManager.getConnection("", null);
}
public void closeConnection(Connection conn) throws SQLException {
if (conn != null && !conn.isClosed()) {
conn.close();
}
}
}
ä¸€èˆ¬å†…éƒ¨æŽ¥å£æ¯”内部¾cÈ”¨çš„æ›´å¤šã€‚内部类ä¸çš„æ–ÒŽ(gu¨©)³•å¯ä»¥æœ‰é»˜è®¤çš„实现。匿å内部类åšäØ“(f¨´)业务æ–ÒŽ(gu¨©)³•çš„å‚æ•îC¼ 入时åQŒä¼š(x¨¬)override默认的方æ³?/span>。内部接å£çš„è¯ï¼Œæ²¡æœ‰é»˜è®¤çš„实现。完全将具体的实çŽîCº¤¾l™äº†åŒ¿å内部¾c…R€?/p>
匿å内部¾cÈš„æ€æƒ³æ˜¯å›žè°ƒï¼Œå›_¥½èŒ‰åžåŽŸåˆ™ã€?span style="color: #ff0000">回调的一个好处是decoupleã€?/span> 客户端åªéœ€è¦å…³å¿ƒä¸šåŠ¡ï¼ˆæ¯”å¦‚åŒ¿å内部¾cÈš„具体实现åQ‰è€Œä¸ç”¨å†å…›_¿ƒä¸€äº›èµ„æºçš„˜qžæŽ¥é‡Šæ”¾ä»€ä¹ˆçš„åQŒè¿™äº›äº¤¾l™åã^å°ç±»ä¸çš„æ¨¡æ¿æ–ÒŽ(gu¨©)³•。rubyçš„é—包还支æŒå¯ÒŽ(gu¨©)•°¾l„ä¸çš„æ¯ä¸ªå…ƒç´ ï¼Œæ–‡äšgä¸çš„æ¯è¡ŒåQŒç»“果集ä¸çš„æ¯ä¸ªè®°å½•çš„æ“作。而用java实现˜q™æ ·çš?span style="color: #ff0000">˜q代òq¶æ“作其ä¸å…ƒç´?/span>éžå¸¸éºÈƒ¦ã€‚感觉javaä¸ç”¨çš„å¤šçš„åæ¨¡æ¿æ–ÒŽ(gu¨©)³•åQŒå³é€»è¾‘ä¸å›ºå®šä¸€äº›æµ½E‹ï¼Œåˆå§‹åŒ–åŠ(qi¨¢ng)释放æŸäº›èµ„æºã€?/p>
public Object get(final Class entityClass, final Serializable id, final LockMode lockMode)
JDK ByteBuffer
属性:(x¨¬)
Mark |
上次position的快�/span> |
Position |
当å‰è¯Õd†™ç´¢å¼•未知 |
Limit |
¾~“冲区é™åˆ?/p> |
Capacity |
¾~“å†²åŒø™ƒ½åŠ?/p> |
Offset |
åç§»é‡?/p> |
说明åQ?/p>
æ–ÒŽ(gu¨©)³•åQ?/p>
Limit(int) |
如果position>limit, position = limit,如果mark>limit, é‡ç½®mark |
Mark() |
å–当å‰çš„position的快ç…?/span>æ ‡è®°mark |
Reset() |
æ¢å¤positionåˆ°å…ˆå‰æ ‡è®°çš„mark |
Clear() |
limit=capacity , position=0,é‡ç½®mark,ä½†æ˜¯ä¸æ¸…½Iºæ•°æ®ï¼Œä¸ÞZº†ä»Žå¤´å¼€å§?/span>putåšå‡†å¤‡ï¼Œå…¶å®žž®±æ˜¯æ¸…空数æ®åQŒå› ä¸ÞZ½ putž®Þp¦†ç›–了原æ¥çš„æ•°æ?/span> |
Rewind() |
position=0,é‡ç½®mark,一¾pÕdˆ—写æ“作åŽåQŒäØ“(f¨´)了从头开å§?/span>getåšå‡†å¤‡ï¼Œå’?/span>clear()有用途上的区别,他大部分是用æ¥ä»Žå¤´å¼€å§‹è¯»å–,è€?/span>clear是大部分用æ¥é‡å¤´å¼€å§‹å¡«å……,ž®±æ˜¯æ¸…ç†çš„æ„æ€?/span> |
Flip() |
limit=position , position=0,é‡ç½®maskåQŒäØ“(f¨´)了将buf写出åšå¥½å‡†å¤‡åQŒä¸€èˆ¬æ˜¯¾l“æŸbufæ“作åQŒå°†buf写入输出‹¹æ—¶è°ƒç”¨åQŒè¿™ä¸ªå¿…™å»è¦è°ƒç”¨åQŒå¦åˆ™æžæœ‰å¯èƒ?/span>position!=limitåQŒå¯¼è‡?/span>positionåŽé¢æ²¡æœ‰æ•°æ®åQŒæ¯‹Æ¡å†™å…¥æ•°æ®åˆ°è¾“出‹¹æ—¶åQŒå¿…™åÈ¡®ä¿?/span>position=limitã€?/span> |
Remaining() |
˜q”回limit-position,˜q”回¾~“冲器ä¸çš„剩余å—èŠ?/span> |
Wrap(byte[]) |
¾l„装到新çš?/span>bufferåQ?/span>capacity=limit=byte[].lengthåQ?/span>position=0 é‡ç½®mark |
Slice() |
分割¾~“冲器,ž®?/span>remaining的空间åÅžæˆä¸€ä¸ªæ–°çš?/span>bufferåQŒæ–°çš?/span>position=0åQ?/span>limit=capacity=remainingåQŒé‡¾|?/span>markåQŒå’Œä¸È¼“冲区内容å…׃ínåQŒå…¶å®ƒéƒ½ç‹¬ç«‹ |
Duplicate() |
å¤åˆ¶¾~“冲区,内容å…׃ínåQŒå…¶å®ƒéƒ½ç‹¬ç«‹ |
asReadOnlyBuffer() |
å’Œduplicateä¸€æ øP¼Œåªæ˜¯ä¸å¯å†?/p> |
Compact() |
ž®?/span>positionå’?/span>limit之间的å—节移到最å‰é¢åQ?/span>position=limit-positionåQŒè¿™ž®±æ˜¯˜q™é‡Œçš„压¾~©çš„æ„æ€ï¼Œä¸€èˆ¬æ˜¯¾l“æŸbufæ“作åQŒå°†buf写入输出‹¹æ—¶è°ƒç”¨ |
Position(int) |
position=newPosition,如果position<mark,é‡ç½®mark |
Remaining() |
˜q”回positionå’?/span>limit之间的å—节数 |
|
JDK ByteBuffer |
Mina IoBuffer |
åŠ¨æ€æ‰©å±?/span>capacity |
å?/p> |
�/p> |
支æŒStringè¯Õd†™ |
å?/p> |
�/p> |
¾U¿ç¨‹å®‰å…¨ |
å?/p> |
å?/p> |
å¯ä¸»åŠ¨é‡Šæ”„¡¼“冲区å ç”¨å†…å˜ |
å?/p> |
�/p> |