1. 程式人生 > >HibernateTransactionManager 和 hibernateTemplate的區別

HibernateTransactionManager 和 hibernateTemplate的區別

HibernateTransactionManager
管理事務巢狀,開啟,關閉,資源執行緒同步,提交,回滾
HibernateTemplate是可以感知到執行緒內的事務和資源(存放在RESOURCESYCHRONIZEDMANAGER貌似叫這個,由AbstractPlatformTransactionManager)
Session s = sessionFactory.getCurrentSession();

sessionFactory.getCurrentSession()無法感知到SPRING開啟的事務和資源(SESSION)

在applicationContext.xml中有如下配置:

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>


也可以:
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>

兩種實現方式其實沒有區別,尤其是第二種不要自己去關閉session,session在事務結束後都會自動關閉。


DataSource ->SessionFactory-> HibernateTranscationManager
Hibernate中通過SessionFactory建立和維護Session。Spring對SessionFactory的配置進行了整合,無需再通過Hibernate.cfg.xml對SessionFactory進行設定。SessionFactory節點的mappingResources屬性包含了對映檔案的路徑,list節點下可配置多個對映檔案。hibernateProperties節點則容納了所有的屬性配置。可以對應傳統的Hibernate.cfg.xml檔案結構對這裡的SessionFactory配置進行解讀。

如果一個方法中既用了HibernateTemplate,又用了JdbcTemplate,應該怎麼配單例項的db事務呢(多例免談)用 DataSouceTransactionManager是不行的,而用HibernateTransactionManager就可以保證
原因的話看下它們源

程式碼,會發現HibernateTransactionManager中的處理可以保證SessionFactoryUtil和datasourceutil都能在一個事務裡取到同一個連線


所以如果使用hibernateTransactionManager的話,就完全可以保證SessionFactoryUtil和datasourceutil都能在一個事務裡取到同一個連線!所有的疑問煙消雲散了,
所以大家還是使用hibernateTransactionManager從而隨心所欲的使用jdbctemplate和hibernatetemplate吧

    下面是HibernateSessionFactory 和 HibernateTransactionManager的配置:

    在applicationContext-hibernate.xml中:

1<bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean"> 2    <property name="dataSource"><ref bean="dataSource"/></property> 3    <property name="mappingResources"> 4        <list> 5            <value>com/mycompany/model/User.hbm.xml</value> 6                …………………………… 7        </list> 8    </property> 9    <property name="hibernateProperties">10    <props>11        <prop key="hibernate.dialect">@HIBERNAT[email protected]</prop>12        <!--prop key="hibernate.show_sql">true</prop-->13        <!--prop key="hibernate.hbm2ddl.auto">update</prop-->14    </props>15    </property>16</bean>


    Spring 提供了一個 HibernateTransactionManager,採用面向Hibernate的TransactionManager實現:org.springframework.orm.hibernate.HibernateTransactionManager。他用執行緒捆綁了一個Hibernate Session,用它來支援transactions。
1<bean id="transactionManager" 2     class="org.springframework.orm.hibernate.HibernateTransactionManager">3     <property name="sessionFactory"><ref local="sessionFactory"/></property>4 </bean>


sessionFactory Bean引用了HibernateSessionFactory,而transactionManager Bean引用了HibernateTransactionManage。 transactionManager Bean中有個sessionFactory屬性。 HibernateTransactionManager有個sessionFactory setter 和 getter方法,用來在Spring啟動的時候實現“依賴注入” (dependency injection)的。 在sessionFactory 屬性裡引用sessionFactory Bean。這兩個物件在Spring容器初始化後就被組裝了起來了。
  
    User使用一個TransactionProxyFactoryBean,它定義了一個setTransactionManager()。能很方便的處理申明的事物還有Service Object。TransactionProxyFactoryBean 還有個setter. 這會被Business service object(UserManager)引用, UserManager定義了業務層,並且它還有個屬性,由setUserDAO()引用。

DataSource->SessionFactory->HibernateTemplate->HibernateDaoSupport


    系統持久層中所有的類都繼承自Spring提供的HibernateDaoSupport類,HibernateSupport實現了HibernateTemplate和SessionFactory例項的關聯。HibernateTemplate對Hibernate Session操作進行了封裝,提供了一個簡單的方式實現了Hibernate-based DAO物件。藉助HibernateTemplate我們可以脫離每次資料操作必須首先獲得Session例項、啟動事務、提交/回滾事務以及煩雜的try/catch/finally的繁瑣操作。一個簡單的Hibernate訪問方法就完全解決了些麻煩! 無論是在多個DAO介面還是在多方事務的情況下,Spring使得多種DAO物件無縫地協同工作。

Spring為Hibernate的DAO提供工具類:HibernateDaoSupport。該類主要提供如下兩個方法,方便DAO的實現:

     
public final HibernateTemplate getHibernateTemplate()      public final void setSessionFactory(SessionFactory sessionFactory)

其中,setSessionFactory方法用來接收Spring的ApplicationContext的依賴注入,可接收配置在Spring的SessionFactory例項,getHibernateTemplate方法則用來根據剛才的SessionFactory產生Session,最後生成HibernateTemplate來完成資料庫訪問。


    對於簡單的單步的動作,象find, load, saveOrUpdate或者delete的呼叫,HibernateTemplate提供更為便利的選擇以代替象一行的回撥的執行。此外HibernateDaoSupport類提供了setSessionFactory方法來接受一個SessionFactory,同時提供了getSessionFactory和getHibernateTemplate方法供其繼承類使用。將這些結合起來,允許對於典型的需求給出了非常簡單的DAO實現,如獲得所有使用者的方法:
   
public List getUsers(User user) {        return getHibernateTemplate().find("from User u order by upper(u.username)");    } HibernateTemplate:public void saveUser(Person person){ 4 5              getHibernateTemplate().saveOrUpdate(person); 6 7         }

採用事物配置,我們就不需要寫那麼多的try catch和finally了,因為容器會自動幫我們在執行方法前給我們加上。

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">    <property name="sessionFactory">       <ref bean="sessionFactory"/>    </property></bean>


也可以:
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTransactionManager">    <property name="sessionFactory">       <ref bean="sessionFactory"/>    </property></bean>


兩種實現方式其實沒有區別,尤其是第二種不要自己去關閉session,session在事務結束後都會自動關閉。 但是一定要注意延遲載入的問題,當物件在session關閉前沒有從資料庫中取得,而jsp中需要展示物件時,會提示LazyInitializationException,你可以通過
OpenSessionInViewFilter來保證延遲載入不會出現錯誤,即:<filter>     <filter-name>opensession</filter-name>     <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class></filter><filter-mapping>     <filter-name>opensession</filter-name>     <url-pattern>*.do</url-pattern></filter-mapping>


======================================================================
spring提供訪問資料庫的有三種方式:

HibernateDaoSupport

HibernateTemplate(推薦使用)

jdbcTemplate(我們一般不用)



類所在包:

HibernateTemplate:org.springframework.orm.hibernate3.HibernateTemplateHibernateDaoSupport:org.springframework.orm.hibernate3.support.HibernateDaoSupport


    spring如果想整合hibernate的話,首先就應該獲得SessionFactory這個類,然後再通過獲得session就可以進行訪問資料庫了,即spring提供的類HibernateDaoSupport,HibernateTemplate應該是有setSessionFactory,在使用的時候注入一下就可以了。HibernateTemplate類中的方法是spring封裝了hibernate中的方法,在使用完了以後會自動釋放session。而如果使用了HibernateDaoSupport的getSession方法,就需要配套的用releaseSession(Session session)或者session.close來關閉session,無法實現自動管理session。所以很多人都傾向於用spring的 Hibernatetemplate類或者HibernateDaoSupport的getHibernateTemplate方法來實現實現資料庫的互動,當然,如果遇到hibernatetemplate無法實現的功能,可以使用 HibernateDaoSupport。

首先我們先來看一下HibernateTemplate類:

    首先我們來說一下我們為什麼要用HibernateTemplate,其實這個類就是我們平常使用hibernate進行dao操作的一個模版,我們不需要那些開頭的開啟事務、獲得session,結尾的提交事務,關閉session等操作了,這些工作是HibernateTemplate都給我們封裝好了,我們直接呼叫其dao的操作方法就可以了,並且他還給我們封裝了hibernate的幾乎所有的異常,這樣我們在處理異常的時候就不要記住那麼多繁瑣的異常了。所以我們就叫他是一個hibernate中dao操作的模版,他提供的常用方法:

get 從資料庫相關表中獲取一條記錄並封裝返回一個物件(Object) 
load 作用與get基本相同,不過只有在對該物件的資料實際呼叫時,才會去查詢資料庫 
save 新增記錄 
saveOrUpdate 判斷相應記錄是否已存在,據此進行新增或修改記錄
update 修改記錄 
delete 刪除記錄  

    下面我們來看一下HibernateTemplate的原始碼來看一下他的具體方法是怎麼樣實現的,其實你觀察原始碼可以發現,他所提供的方法幾乎都是一個實現實現的。下面我們就以save方法來具體看一下:

[Java] view plaincopyprint?public Serializable save(final Object entity) throws       DataAccessException {      return (Serializable) executeWithNativeSession(new  HibernateCallback() {      public Object doInHibernate(Session session) throws HibernateException {      checkWriteOperationAllowed(session);      return session.save(entity);      }  });}  public Serializable save(final Object entity) throws DataAccessException {    return (Serializable) executeWithNativeSession(new HibernateCallback() {    public Object doInHibernate(Session session) throws      HibernateException {    checkWriteOperationAllowed(session);    return session.save(entity);    }});}


    我們從原始碼中可以發現,HibernateTemplate把我們hibernate的異常都封裝成了一個DataAccessException 。好了,解釋一下上面的程式碼,上面程式碼中主要是呼叫了executeWithNativeSession這個方法,其實這個方法就是給我們封裝好的hibernate開頭和結尾一些列操作,他需要一個引數,這個引數是一個回撥的物件,其實這個物件是實現了一個HibernateCallback的介面,實現這個介面需要實現這個接口裡面的方法doInHibernate,這個方法需要把當前的session傳遞過來,其實他就是把他原先模版裡獲得的session傳過去。然後在在doInHibernate中利用模版中得到的session進行儲存資料。其實我們呼叫save的過程就是給他傳一個回撥物件的過程,我們可以看到,他的回撥物件是new出來的。

     如果你還沒看懂的話,那大家來看一下下面我們實現自己的HibernateTemplate,他的思路和spring提供的基本是一樣的:其中MyHibernateCallback 是一個簡單介面:


[java] view plaincopyprint?import org.hibernate.Session;  public class MyHibernateTemplate {  public void executeWithNativeSession(MyHibernateCallback callback) {      Session s = null;      try {          s = getSession();          s.beginTransaction();          callback.doInHibernate(s);          s.getTransaction().commit();      } catch (Exception e) {          s.getTransaction().rollback();      } finally {          //...       }  }  private Session getSession() {      // TODO Auto-generated method stub       return null;  }  public void save(final Object o) {      new MyHibernateTemplate().executeWithNativeSession(new  MyHibernateCallback() {          public void doInHibernate(Session s) {              s.save(o);          }      });  }  }  import org.hibernate.Session;public class MyHibernateTemplate {public void executeWithNativeSession(MyHibernateCallback callback) {Session s = null;try {s = getSession();s.beginTransaction();callback.doInHibernate(s);s.getTransaction().commit();} catch (Exception e) {s.getTransaction().rollback();} finally {//...}}private Session getSession() {// TODO Auto-generated method stubreturn null;}public void save(final Object o) {new MyHibernateTemplate().executeWithNativeSession(new MyHibernateCallback() {public void doInHibernate(Session s) {s.save(o);}});}}


    好了,原理我們介紹完了之後,下面我們來看一下具體應用,這個HibernateTemplate在我們的程式中怎麼用,在上面我們也說過了,這個用法主要是把sessionfactory注入給我們的HibernateTemplate

首先我們來看一下beans.xml的配置:

[html] view plaincopyprint?01.<?xml version="1.0" encoding="UTF-8"?>  02.<beans xmlns="http://www.springframework.org/schema/beans"  03.xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  04.xmlns:context="http://www.springframework.org/schema/context"  05.xmlns:aop="http://www.springframework.org/schema/aop"  06.xmlns:tx="http://www.springframework.org/schema/tx"  07.xsi:schemaLocation="http://www.springframework.org/schema/beans  08.           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  09.           http://www.springframework.org/schema/context  10.           http://www.springframework.org/schema/context/spring-context-2.5.xsd  11.           http://www.springframework.org/schema/aop  12.           http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  13.           http://www.springframework.org/schema/tx   14.           http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  15.<bean id="dataSource"  16.class="org.apache.commons.dbcp.BasicDataSource"  17.destroy-method="close">  18.<property name="driverClassName" value="http://zhb0917.iteye.com/blog/com.mysql.jdbc.Driver" />  19.<property name="url" value="http://zhb0917.iteye.com/blog/jdbc:mysql://localhost:3306/spring" />  20.<property name="username" value="http://zhb0917.iteye.com/blog/root" />  21.<property name="password" value="http://zhb0917.iteye.com/blog/bjsxt" />  22.</bean>  23.<bean id="sessionFactory"  24.class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">  25.<property name="dataSource" ref="dataSource" />  26.<property name="annotatedClasses">  27.<list>  28.<value>com.bjsxt.model.User</value>  29.<value>com.bjsxt.model.Log</value>  30.</list>  31.</property>  32.<property name="hibernateProperties">  33.<props>  34.<prop key="hibernate.dialect">  35.org.hibernate.dialect.MySQLDialect  36.</prop>  37.<prop key="hibernate.show_sql">true</prop>  38.</props>  39.</property>  40.</bean>  41.<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">  42.<property name="sessionFactory" ref="sessionFactory"></property>  43.</bean>  44.<bean id="UserDao" class="com.bzu.dao.userDao">  45.<property name="hibernateTemplate" ref="hibernateTemplate"></property>  46.</bean>  47.</beans>  <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd           http://www.springframework.org/schema/context           http://www.springframework.org/schema/context/spring-context-2.5.xsd           http://www.springframework.org/schema/aop           http://www.springframework.org/schema/aop/spring-aop-2.5.xsd           http://www.springframework.org/schema/tx            http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"><bean id="dataSource"class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"><property name="driverClassName" value="http://zhb0917.iteye.com/blog/com.mysql.jdbc.Driver" /><property name="url" value="http://zhb0917.iteye.com/blog/jdbc:mysql://localhost:3306/spring" /><property name="username" value="http://zhb0917.iteye.com/blog/root" /><property name="password" value="http://zhb0917.iteye.com/blog/bjsxt" /></bean><bean id="sessionFactory"class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="annotatedClasses"><list><value>com.bjsxt.model.User</value><value>com.bjsxt.model.Log</value></list></property><property name="hibernateProperties"><props><prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop><prop key="hibernate.show_sql">true</prop></props></property></bean><bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"><property name="sessionFactory" ref="sessionFactory"></property></bean><bean id="UserDao" class="com.bzu.dao.userDao"><property name="hibernateTemplate" ref="hibernateTemplate"></property></bean></beans>


下一步我們來看一下hibernateTemplate的使用:

[html] view plaincopyprint?01.public class UserDAOImpl implements UserDAO {  02.private HibernateTemplate hibernateTemplate;  03.public HibernateTemplate getHibernateTemplate() {  04.return hibernateTemplate;  05.}  06.public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {  07.this.hibernateTemplate = hibernateTemplate;  08.}  09.public void save(User user) {  10.hibernateTemplate.save(user);  11.}}  public class UserDAOImpl implements UserDAO {private HibernateTemplate hibernateTemplate;public HibernateTemplate getHibernateTemplate() {return hibernateTemplate;}public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {this.hibernateTemplate = hibernateTemplate;}public void save(User user) {hibernateTemplate.save(user);}}



這基本上就是我們的hibernateTemplate原理及使用了,其實他的使用很簡單

下面,我們來看一下HibernateDaoSupport:

通過上面我們可以看出,通過xml注入hibernateTemplate,我們可以想象的到所有DAO類中都會有HibernateTemplate的bean方法,於是上面hibernateTemplate的set、get的方法和xml配置會有大量的,於是就出現了程式碼冗餘和重複,我們怎麼才能避免這個重複呢,我們很容易應該能想到,把上面注入hibernateTemplate抽出一個類,然後讓我們的dao類來繼承這個類。不過這個類Spring已經有了,那就是HibernateDaoSupport,除此之外,HibernateDaoSupport也有SessionFactory的bean方法,所以我們在用HibernateDaoSupport的時候同樣也要給我們注入sessionfactory或者hibernateTemplate,在用的時候你會發現HibernateDaoSupport也給我們提供了getHibernateDaoSupport方法。

相關配置示例:userdao繼承了HibernateDaoSupport

[html] view plaincopyprint?01.<bean id="userdao" class="com.bzu.dao.uerdao">  02.<property name="sessionFactory" ref="sessionFactory"></property>  03.</bean>  <bean id="userdao" class="com.bzu.dao.uerdao"><property name="sessionFactory" ref="sessionFactory"></property></bean>


     用上面的方法我們可以發現一個問題,我們同樣解決不了xml配置重複的問題,我們每一個dao都要在xml注入sessionfactory或者hibernateTemplate,解決這個問題的辦法就是我們自己在抽出一個SuperDao類,讓這個類去繼承HibernateDaoSupport,然後我們給SuperDao類去配置,這樣的話,我們在我的dao類中直接去繼承SuperDao類就可以了,這樣不管有多少dao類,只要繼承SuperDao,我們就可以實現我們想要的功能了。

相關推薦

HibernateTransactionManager hibernateTemplate區別

HibernateTransactionManager管理事務巢狀,開啟,關閉,資源執行緒同步,提交,回滾HibernateTemplate是可以感知到執行緒內的事務和資源(存放在RESOURCESYCHRONIZEDMANAGER貌似叫這個,由AbstractPlatfo

GETPOST區別總結

get 、post 、區別一、GET和POST區別的普遍看法:HTTP 定義了與服務器交互的不同方法,最常用的有4種,Get、Post、Put、Delete,如果我換一下順序就好記了,Put(增),Delete(刪),Post(改),Get(查),即增刪改查,下面簡單敘述一下:1)Get, 它用於獲取信息,註

JS中const、varlet區別

方法 pre 命令 con 使用 它的 comm 作用 影響 在JavaScript中有三種聲明變量的方式:var、let、const。 1.const 聲明創建一個只讀的常量。這不意味著常量指向的值不可變,而是變量標識符的值只能賦值一次,必須初始化。 const b

equals == 的區別

strong 都是 什麽 brush -s 新的 equals方法 實現 繼承 首先 看比較的對象是否為字符串,若為(String)字符串用equals 比較, 比較的是他們的值。相同返回 true ,不相同返回false. package one; p

mybatis中的#$的區別

背景 插入 trac sql註入 -m .com article 參數 -s 1. #將傳入的數據都當成一個字符串,會對自動傳入的數據加一個雙引號。如:order by #user_id#,如果傳入的值是111,那麽解析成sql時的值為order by "111", 如果傳

hibernate中hql語句中listiterate區別

每次 hibernate 寫入 所有 讀取 條件 iter 查詢 hql 1.使用list()方法獲取查詢結果,每次發出一條語句,獲取全部數據。2.使用iterate()方法獲取查詢結果,先發出一條SQL語句用來查詢滿足條件數據的id,然後依次按照這些id查詢記錄,也就是要

java中ArrayListLinkedList區別

插入 list 新的 查找 arr tro 基於 列表 時間復雜度 ArrayList和LinkedList最主要的區別是基於不同數據結構 ArrayList是基於動態數組的數據結構,LinkedList基於鏈表的數據結構,針對這點,從時間復雜度和空間復雜度來看主要區別:

mysql中replicate_wild_do_tablereplicate_do_db區別

lan rep cati mil 多人 pan think lte 避免 使用replicate_do_db和replicate_ignore_db時有一個隱患,跨庫更新時會出錯。 如在Master(主)服務器上設置 replicate_do_db=test(my.conf

2000行之宏中###的區別

ret fun color bsp nbsp urn div def include #include<stdio.h> #define Fun(a,b) a##b int main() { x=‘H‘; y=‘W‘; printf("

HTML提交方式postget區別(實驗)

des url action 通過 性別 清除數據 map pass pack HTML提交方式post和get區別(實驗) 一、post和get區別 get提交,提交的信息都顯示在地址欄中。 post提交,提交的信息不顯示地址欄中,顯示在消息體中。 二、客戶端代碼

stringbuffer stringbuilder區別

uil build 線程 區別 單線程 線程安全 多線程操作 buffer 少量數據 stringbuffer 和 stringbuilder速度 小於 線程安全 線程非安全 單線程操作

水晶頭鍍金30U50區別

style 價格 -1 font 質量 穩定性 tex 穩定 size U是厚度單位,1μm≈40u。一般來說鍍金越厚,越耐插播,耐酸堿腐蝕,觸點壽命越長,傳輸穩定性越好,價格越貴。但是事實上,鍍金層的質量,或者說鍍金對水晶頭質量的影響,跟工藝的關系更密切。水晶頭鍍金30U

MyBatis Mapper.xml文件中 $#的區別

優先 註入 sql註入 jdb 防止 自動 || myba 由於 1.優先使用#{paramName,jdbcType=VARCHAR} 寫法,除了可以防止sql註入以外,它還能在參數裏含有單引號的時候自動轉義, 而${paramName}由於是類似於拼接sql的寫法,不具

require(),include(),require_once()include_once()區別

流程 code 一個 str 定義 檔案 目標 失敗 錯誤處理 require 的使用方法如 require("MyRequireFile.php"); 。這個函數通常放在 PHP 程序的最前面,PHP 程序在執行前,就會先讀入 require 所指定引入的文件,使它變成

ZeptoJquery區別

-- error exce cal lba 滑動 set 忽略 瀏覽器 ---恢復內容開始--- 《zepto移動端事件》 1、$("#xx").tap(function(){ //tap在屏幕點擊時觸發     alert("sssss"); }) 2、$("d

Antelope Barracuda區別

iter strong 大小 實驗 時也 uda cuda int innodb Antelope和Barracuda均為innodb存儲引擎的文件格式,Antelope為默認格式,非壓縮;Barracuda為壓縮格式;兩者主要的不同在於對大數據量的存儲時所占用的空間差異

MongoDBRedis區別

一定的 虛擬 數據結構 提升 b數 技術 處理 aof memcach 簡介 MongoDB更類似MySQL,支持字段索引、遊標操作,其優勢在於查詢功能比較強大,擅長查詢JSON數據,能存儲海量數據,但是不支持事務。 mysql在大數據量時效率顯著下降,mongodb更多時

linux中 ll ls 區別

彩色 顯示文件 時間排序 linux 常用 所有 數字 名稱 sub ll 列出來的結果詳細,有時間,是否可讀寫等信息 ,象windows裏的 詳細信息ls 只列出文件名或目錄名 就象windows裏的 列表ll -t 是降序, ll -t | tac 是升序 ll不是

GIT checkout reset 區別

stage res 區別 存儲 mit 新的 其他 reset 情況 git checkout -- file;撤銷對工作區修改;這個命令是以最新的存儲時間節點(add和commit)為參照,覆蓋工作區對應文件file;這個命令改變的是工作區  git reset HEAD

【轉載】shardingpartition區別

spl break iss sys div ica dividing shard ati Partitioning is a general term used to describe the act of breaking up your logical dat