<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    ourday

    ourday

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      8 Posts :: 2 Stories :: 11 Comments :: 0 Trackbacks

    2008年10月11日 #

    JPA是什么

     

    定義 Java Persistence API

    JPA通過JDK 5.0注解或XML描述對象-關系表的映射關系,并將運行期的實體對象持久化到數據庫中。

    起源

    Sun引入新的JPA ORM規范出于兩個原因:其一,簡化現有Java EE和Java SE應用的對象持久化的開發工作;其二,Sun希望整合對ORM技術,實現天下歸一。

    JPA由EJB 3.0軟件專家組開發,作為JSR-220實現的一部分。但它不囿于EJB 3.0,你可以在Web應用、甚至桌面應用中使用。JPA的宗旨是為POJO提供持久化標準規范,由此可見,經過這幾年的實踐探索,能夠脫離容器獨立運 行,方便開發和測試的理念已經深入人心了。目前Hibernate 3.2、TopLink 10.1.3以及OpenJPA都提供了JPA的實現。

    JPA的總體思想和現有Hibernate、TopLink,JDO等ORM框架大體一致。總的來說,JPA包括以下3方面的技術:

    ORM映射元數據

    JPA支持XML和JDK 5.0注解兩種元數據的形式,元數據描述對象和表之間的映射關系,框架據此將實體對象持久化到數據庫表中;

    JPA 的API

    用來操作實體對象,執行CRUD操作,框架在后臺替我們完成所有的事情,開發者從繁瑣的JDBC和SQL代碼中解脫出來。

    查詢語言

    這是持久化操作中很重要的一個方面,通過面向對象而非面向數據庫的查詢語言查詢數據,避免程序的SQL語句緊密耦合。

    JPA的優勢

    1 標準化

    JPA 是 JCP 組織發布的 Java EE 標準之一,因此任何聲稱符合 JPA 標準的框架都遵循同樣的架構,提供相同的訪問 API,這保證了基于JPA開發的企業應用能夠經過少量的修改就能夠在不同的JPA框架下運行。

    2 對容器級特性的支持

    JPA 框架中支持大數據集、事務、并發等容器級事務,這使得 JPA 超越了簡單持久化框架的局限,在企業應用發揮更大的作用。

    3 簡單易用,集成方便

    JPA的主要目標之一就是提供更加簡單的編程模型:在JPA框架下創建實體和創建Java 類一樣簡單,沒有任何的約束和限制,只需要使用 javax.persistence.Entity進行注釋;JPA的框架和接口也都非常簡單,沒有太多特別的規則和設計模式的要求,開發者可以很容易的 掌握。JPA基于非侵入式原則設計,因此可以很容易的和其它框架或者容器集成。

    4 可媲美JDBC的查詢能力

    JPA的查詢語言是面向對象而非面向數據庫的,它以面向對象的自然語法構造查詢語句,可以看成 是Hibernate HQL的等價物。JPA定義了獨特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一種擴展,它是針對實體的一種查詢語言,操作對象是實體,而不是關系數據庫的表,而且能夠支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能夠提供的高級查詢特性,甚至還能夠支持子查詢。

    5 支持面向對象的高級特性

    JPA 中能夠支持面向對象的高級特性,如類之間的繼承、多態和類之間的復雜關系,這樣的支持能夠讓開發者最大限度的使用面向對象的模型設計企業應用,而不需要自行處理這些特性在關系數據庫的持久化。

    JPA的供應商

    JPA 的目標之一是制定一個可以由很多供應商實現的API,并且開發人員可以編碼來實現該API,而不是使用私有供應商特有的API。因此開發人員只需使用供應 商特有的API來獲得JPA規范沒有解決但應用程序中需要的功能。盡可能地使用JPA API,但是當需要供應商公開但是規范中沒有提供的功能時,則使用供應商特有的API。

    1 Hibernate

    JPA是需要Provider來實現其功能的,Hibernate就是JPA Provider中很強的一個,目前來說應該無人能出其右。從功能上來說,JPA現在就是Hibernate功能的一個子集。Hibernate 從3.2開始,就開始兼容JPA。Hibernate3.2獲得了Sun TCK的JPA(Java Persistence API) 兼容認證。

    只要熟悉Hibernate或者其他ORM框架,在使用JPA時會發現其實非常容易上手。例如 實體對象的狀態,在Hibernate有自由、持久、游離三種,JPA里有new,managed,detached,removed,明眼人一看就知 道,這些狀態都是一一對應的。再如flush方法,都是對應的,而其他的再如說Query query = manager.createQuery(sql),它在Hibernate里寫法上是session,而在JPA中變成了manager,所以從 Hibernate到JPA的代價應該是非常小的

    同樣,JDO,也開始兼容JPA。在ORM的領域中,看來JPA已經是王道,規范就是規范。在各大廠商的支持下,JPA的使用開始變得廣泛。

    2 Spring

    Spring + Hibernate 常常被稱為 Java Web 應用人氣最旺的框架組合。而在 JCP 通過的 Web Beans JSR ,卻欲將JSF + EJB + JPA 、來自 JBoss Seam(Spring 除外)的一些組件和EJB 3(目前能夠提供有基本攔截和依賴注入功能的簡化 Session Bean 框架)的一個 Web 組合進行標準化。如今的 Spring 2.0 為 JPA 提供了完整的 EJB 容器契約,允許 JPA在任何環境內可以在 Spring 管理的服務層使用(包括 Spring 的所有 AOP 和 DI 增強)。同時,關于下一個Web應用組合會是 EJB、Spring + Hibernate 還是 Spring + JPA 的論戰,早已充斥于耳。

    在Spring 2.0.1中,正式提供對JPA的支持,這也促成了JPA的發展,要知道JPA的好處在于可以分離于容器運行,變得更加的簡潔。

    3 OpenJPA

    OpenJPA 是 Apache 組織提供的開源項目,它實現了 EJB 3.0 中的 JPA 標準,為開發者提供功能強大、使用簡單的持久化數據管理框架。OpenJPA 封裝了和關系型數據庫交互的操作,讓開發者把注意力集中在編寫業務邏輯上。OpenJPA 可以作為獨立的持久層框架發揮作用,也可以輕松的與其它 Java EE 應用框架或者符合 EJB 3.0 標準的容器集成。

    4 其它

    目前支持的實現包括Toplink、Hibernate Entitymanager等。TopLink以前需要收費,如今開源了。OpenJPA雖然免費,但功能、性能、普及性等方面更加需要加大力度。

    對于EJB來說,實體Bean一直是被批評的對象,由于其太復雜和龐大。JPA的出現,很大程度的分離了復雜性。這讓EJB的推廣也變得容易。

    總而言之,JPA規范主要關注的僅是API的行為方面,而由各種實現完成大多數性能有關的調優。盡管如此,所有可靠的實現都應該擁有某種數據緩存,以作為選擇。但愿不久的將來,JPA能成為真正的標準。

    小結

    EJB 3.0和JPA 毫無疑問將是Java EE 5的主要賣點。在某些領域中,它們給Java社區帶來了競爭優勢,并使Java 在其他領域與競爭對手不分伯仲(因為,不可否認,目前某些領域尚不存在基于標準的方法)。

    過去數年來,Spring Framework一直是EJB在企業領域的主要競爭對手。EJB3.0規范解決了很多促進Spring興起的問題。隨著它的出現,EJB3.0毫無疑問比Spring提供了更好的開發體驗——最引人注目的優勢是它不需要配置文件。

    JPA提供一種標準的OR映射解決方案,該解決方案完全集成到EJB3。0兼容的容器中。JPA的前輩將會繼續穩定發展,但是業務應用程序中的 raw 使用將可能會減少。實現 JPA 兼容的實體管理器似乎很可能是此類技術的發展方向。

    Java EE系列規范的較大問題與JPA沒有任何關系。Java EE 系列規范的問題涉及到 Web和EJB容器之間的集成。Spring在此領域仍然具有主要競爭優勢。JBoss的Seam項目嘗試使用自定義的方法來解決這一問題。Caucho Resin應用服務器試圖擴展容器邊界并支持在Web容器中使用@EJB注釋。我們希望Java EE 5.1將解決層集成的問題,為我們提供一個全面而標準的依賴性注入方法。

    在不久的將來,Sun可能會將JPA作為一個單獨的JSR對待,同時JPA還可能作為Java SE的一部分。不過這些都不太重要,重要的是,我們現在已經可以在脫離容器的情況下、在Java SE應用中使用JPA了。

    JPA已經作為一項對象持久化的標準,不但可以獲得Java EE應用服務器的支持,還可以直接在Java SE中使用。開發者將無需在現有多種ORM框架中艱難地選擇,按照Sun的預想,現有ORM框架頭頂的光環將漸漸暗淡,不再具有以往的吸引力。

    值得注意的是Java Persistence API并不是J2EE環境

    專用,而是在java中的通用API。意味著我們可以在任何需要訪問關系數據庫的地方使用JPA,

    甚至包括面應用。JPA也不要求一定在J2EE容器中才能運行,而是任何有JVM的環境都可以運用。

    這就使得我們可以很容易的把JPA作為一個持久化組件自由的和各種容器/框架(EJB3容器, Spring等等)組合。

       JPA最主要的是一個統一的persistence.xml配置文件,可以放到每一個jar的META-INF/目錄下面,配置內容主要有

    (以hibernate為例)

    1、數據庫連接的配置文件

    2、數據庫方言、連接URL、用戶名、密碼

    3、ORM映射的列表(Class)

    4、配置其它的Hibernate屬性(其他的Provider屬性)

    5、cache

    主要內容,詳細內容請看hibernate的reference

    xml 代碼

    1. xml version="1.0" encoding="UTF-8"?>  
    2. <persistence>  
    3.    <persistence-unit name="TestEntityManager" transaction-type="RESOURCE_LOCAL">  
    4.       <provider>org.hibernate.ejb.HibernatePersistenceprovider>     
    5.       <class>com.jl.sub1.mapping.Productclass>  
    6.       <class>com.jl.sub1.mapping.ProductItemclass>  
    7.         
    8.       <properties>  
    9.           <property name="hibernate.dialect" value="org.hibernate.dialect.DB2Dialect" />  
    10.           <property name="hibernate.connection.driver_class" value="com.ibm.db2.jcc.DB2Driver" />  
    11.           <property name="hibernate.connection.password" value="db2admin" />  
    12.           <property name="hibernate.connection.url" value="jdbc:db2://10.1.1.10:50000/dbjl" />  
    13.           <property name="hibernate.connection.username" value="db2admin" />  
    14.           <property name="hibernate.ejb.autodetection" value="class" />  
    15.     properties>               
    16.    persistence-unit>  
    17. persistence>  
    18.   
    19.   
    20.   
    21.   
    22. <property name="kodo.ConnectionDriverName" value="..."/>  
    23. <property name="kodo.ConnectionURL" value="..."/>  
    24. <property name="kodo.ConnectionUserName" value="..."/>  
    25. <property name="kodo.ConnectionPassword" value="..."/>  
    26. <property name="kodo.Log" value="DefaultLevel=INFO, Runtime=DEBUG, Tool=INFO"/>  
    27.              

     

    spring配置

    xml 代碼

    1. <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">  
    2.     <property name="entityManagerName"         value="TestEntityManager" />     
    3.     <property name="jpaProperties">  
    4.         <props></props>  
    5.     </property>  
    6.       
    7. </bean>  
    8. <!-- 此處的名字要和persistence.xml中定義的name一致-->  
    9. <!-- jpaProperties此屬性必須要加,hibernate3.1.2的一個bug,否則會拋NullPointerException,springframework論壇告訴我的:)-->  
    10.   
    11. <bean class=  
    12.     "org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>  
    13.     <!--貌似這個部分所有spring配置文件還是僅允許一個,可以配置到公共的xml中-->  
    14.       
    15. <!--引用上面建立的entityManagerFactory-->  
    16. <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">  
    17.     <property name="entityManagerFactory“ ref="entityManagerFactory" />  
    18.           
    19. </bean>  
    20.   
    21. <bean id="transactionInterceptor"  
    22.     class="org.springframework.transaction.interceptor.TransactionInterceptor">  
    23.     <property name="transactionManager" ref="transactionManager" />  
    24.     <property name="transactionAttributeSource">  
    25.     <bean class=  
    26.     "org.springframework.transaction.annotation.AnnotationTransactionAttributeSource" />  
    27.     </property>  
    28. </bean>  
    29.   
    30. <bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">  
    31.     <property name="transactionInterceptor" ref="transactionInterceptor" />  
    32. </bean>  
    33.   
    34. <!--自定義DAO-->  
    35. <bean id="numberDao" class="dao.JpaNumberDAO">  
    36.     <property name="entityManagerFactory“ ref="entityManagerFactory" />  
    37. </bean>  
    38. <!--DAO需繼承自org.springframework.orm.jpa.support.JpaDaoSupport-->  
    39. <!--DAO中可以通過getJpaTemplate()的各種方法進行持久化操作-->  

     

    這樣就好了,可以使用entitymanager,每個jar里面可以相互不用影響,而且這個也符合我們新過程改進推進的每個子系統用jar發布的原則,當然這里的還有作service層,對于子系統之間的交互,我覺得,原則上應該僅允許他們在service的層面上進行,在DAO之間不應該有相互的交叉,不過隱約覺

    得還有很多東西要做,嗯,很晚了,肚子餓,明天再想,呵呵

    哦,對了,Spring真是好東西,封裝了這么多東西給我們用,真是期待更好的版本出來啊,

    還有,在j2se環境里,也可以通過代碼的方式取得JPA的api

    java 代碼

    1. EntityManagerFactory emf =  
    2. Peristence.createEntityManagerFactory(“TestEntityManager”) ;  
    3. //此處的名字要和persistence.xml中  
    4.   
    5. //定義的name一致  
    6.   
    7.   
    8. EntityManager em = emf.createEntityManager();  
    9. ...//使用  
    10. em.close();  
    11. ...  
    12. emf.close();  
    13. EntityManagerFactory emf =  
    14. Peristence.createEntityManagerFactory(“TestEntityManager”) ;  
    15. EntityManager em = emf.createEntityManager();  
    16. ...//使用  
    17. em.close();  
    18. ...  
    19. emf.close();  

    posted @ 2010-05-09 15:02 ourday 閱讀(1793) | 評論 (1)編輯 收藏

    使用注解元數據
    基本注解:
    例子:
    @Entity(name = "T_TOPIC") ①
    public class Topic implements Serializable ...{

    @Id ② -1

    @GeneratedValue(strategy = GenerationType.TABLE) ② -2

    @Column(name = "TOPIC_ID") ② -3

    private int topicId;

    @Column(name = "TOPIC_TITLE", length = 100) ③
    private String topicTitle;

    @Column(name = "TOPIC_TIME") @Temporal(TemporalType.DATE) ④
    private Date topicTime;

    @Column(name = "TOPIC_VIEWS")

    private int topicViews;

    ...

    }



    解釋:
    ① Entity 標明該類 (Topic) 為一個實體類,它對應數據庫中的表表名是 T_TOPIC ,這里也可以寫成: @Entity

    @Table(name = "T_TOPIC") 其作用都是一樣的
    ② -1 Id 標明該屬性對應數據表中的主鍵
    ② -2 GeneratedValue 通過 strategy 屬性指明主鍵生成策略,默認情況下, JPA 自動選擇一個最適合底層數據庫的主鍵生成策略。在 javax.persistence.GenerationType 中定義了以下幾種可供選擇的策略:
    1) IDENTITY :表自增鍵字段, Oracle 不支持這種方式;
    2) AUTO : JPA 自動選擇合適的策略,是默認選項;
    3) SEQUENCE :通過序列產生主鍵,通過 @SequenceGenerator 注解指定序列名, MySql 不支持這種方式;
    4) TABLE :通過表產生主鍵,框架借由表模擬序列產生主鍵,使用該策略可以使應用更易于數據庫移植。
    ② -3 Column 標明這個屬性是數據表中的一列,該列的名字是 TOPIC_ID

    ③ Column 的一個屬性 length 指明的是該屬性的允許的長度。 ( 個人認為設定該屬性只是對于程序中操作該屬性時增加了一驗證過程,對數據庫中該列原來的設置并沒有影響,但是 length 屬性指定的值必須不能大于數據庫創建表時給該列限制的最大長度否則會出錯 )

    ④ Temporal(TemporalType.DATE) :如果屬性是時間類型,因為數據表對時間類型有更嚴格的劃分,所以必須指定具體時間類型。在 javax.persistence.TemporalType 枚舉中定義了 3 種時間類型:
    1) DATE :等于 java.sql.Date

    2) TIME :等于 java.sql.Time

    3) TIMESTAMP :等于 java.sql.Timestamp



    繼承關系注解:
    對繼承關系進行注解,必須在 父類 中聲明繼承實體的映射策略。
    例子:
    @Entity(name = "T_TOPIC")

    @Inheritance(strategy = InheritanceType.SINGLE_TABLE) ① @DiscriminatorColumn(name = "TOPIC_TYPE", discriminatorType =

    DiscriminatorType.INTEGER, length = 1) ②
    @DiscriminatorValue(value="1") ③
    public class Topic implements Serializable ...{ … }



    解釋:
    ① Inheritance 通過 strategy 屬性指明實體的繼承策略。
    在 javax.persistence.InheritanceType 定義了 3 種映射策略:
    1) SINGLE_TABLE :父子類都保存到同一個表中,通過字段值進行區分。
    2) JOINED :父子類相同的部分保存在同一個表中,不同的部分分開存放,通過表連接獲取完整數據;
    3) TABLE_PER_CLASS :每一個類對應自己的表,一般不推薦采用這種方式。
    ② DiscriminatorColumn 如果繼承策略采用第一種繼承策略,則需要指明區分父子類的字段, DiscriminatorColumn 就是用來指明區分字段的注解。
    ③ DiscriminatorValue 同樣的采用第一種繼承策略通過字段區分父子類,則用這個注解給該實體的區分字段賦值在這里賦的值為 ”1”.



    關聯關系注解:
    例子:
    @Entity @DiscriminatorValue(value="2") ①
    public class PollTopic extends Topic ...{ ②繼承于 Topic 實體
    private boolean multiple; ③
    @Column(name = "MAX_CHOICES")

    private int maxChoices; @OneToMany(mappedBy="pollTopic",cascade=CascadeType.ALL) ④
    private Set options = new HashSet();

    // 省略 get/setter 方法
    }

    解釋 :

    ① 通過 @DiscriminatorValue 將區分字段 TOPIC_TYPE 的值為 2 。由于 PollTopic 實體繼承于 Topic 實體,其它的元數據信息直接從 Topic 獲得。
    ④ OneToMany 指定了一個一對多的關聯關系, mappedBy 屬性指定 “Many” 方類引用 “One” 方類 的屬性名; cascade 屬性指明了級聯方式(如果這里不指定為 CascadeType.ALL 的話,那么有關聯關系的兩個對象在做保存和刪除操作時要分別來進行) 建議 :盡可能使用 cascade=CascadeType.ALL 來減少持久化操作的復雜性和代碼量
    注意 : JPA 規范規定任何屬性都默認映射到表中,所以雖然我們沒有給③處的 multiple 屬性提供注解信息,但 JPA 將按照 默認的規則對該字段進行映射:字段名和屬性名相同,類型相同。如果我們不希望將某個屬性持久化到數據表中,則可以通過 @Transient 注解顯式指定:
    @Transient

    private boolean tempProp1;





    @Entity(name="T_POLL_OPTION")

    Public class PollOption implements Serializable ...{

    @Id

    @GeneratedValue(strategy = GenerationType.TABLE)

    @Column(name = "OPTION_ID")

    private int optionId;

    @Column(name = "OPTION_ITEM")

    private String optionItem;

    @ManyToOne ①
    @JoinColumn(name="TOPIC_ID", nullable=false) ②
    private PollTopic pollTopic;

    }



    解釋:
    ① ManyToOne 描述了多對一的關聯關系,他是對該類引用的 ”One” 類 (PollTopic) 的屬性( pollTopic )進行注解的。
    ② JoinColumn 指定關聯 ”One”(PollTopic) 實體所對應表的 “ 外鍵 ” 。


    Lob 字段的注解:
    在 JPA 中 Lob 類型類型的持久化很簡單,僅需要通過特殊的 Lob 注解就可以達到目的。
    例子:


    @Lob ① -1

    @Basic(fetch = FetchType.EAGER) ① -2

    @Column(name = "POST_TEXT", columnDefinition = "LONGTEXT NOT NULL") ① -3

    private String postText;



    @Lob

    @Basic(fetch = FetchType. LAZY) ② -2

    @Column(name = "POST_ATTACH", columnDefinition = "BLOB") ② -3

    private byte[] postAttach;



    解釋:
    ① -1 JPA 通過 @Lob 將屬性標注為 Lob 類型 ;
    ① -2 通過 @Basic 指定 Lob 類型數據的獲取策略, FetchType.EAGER 表示非延遲 加載,而 FetchType. LAZY 表示延遲加載 ;
    ① -3 通過 @Column 的 columnDefinition 屬性指定數據表對應的 Lob 字段類型。






    使用 XML 元數據


    除了使用注解提供元數據信息外, JPA 也允許我們通過 XML 提供元數據信息。按照 JPA 的規范, 如果你提供了 XML 元數據描述信息,它將覆蓋實體類中的注解元數據信息 。 XML 元數據信息以 orm.xml 命名,放置在類路徑的 META-INF 目錄下。


    <?xml version="1.0" encoding="UTF-8"?>

    <entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"

    version="1.0">

    ①實體對象所在的包
    <package>com.baobaotao.domain</package>

    <entity class="Topic">

    ② Topic 實體配置

    <table name="T_TOPIC" />

    <attributes>

    <id name="topicId">

    <column name="TOPIC_ID"/>

    <generated-value strategy="TABLE" />

    </id>

    <basic name="topicTitle">

    <column name="TOPIC_TITLE" length="30" />

    </basic>

    <basic name="topicTime">

    <column name="TOPIC_TIME" />

    <temporal>DATE</temporal>

    </basic>

    <basic name="topicViews">

    <column name="TOPIC_VIEWS" />

    </basic>

    </attributes>

    </entity>

    <entity class="PollTopic">

    ② PollTopic 實體配置

    <discriminator-value>2</discriminator-value>

    <attributes>

    <basic name="maxChoices">

    <column name="MAX_CHOICES" />

    </basic>

    <one-to-many name="options" mapped-by="pollTopic">

    <cascade>

    <cascade-all/>

    </cascade>

    </one-to-many>

    </attributes>

    </entity>

    <entity class="PollOption">

    ② PollOption 實體配置

    <table name="T_POLL_OPTION" />

    <attributes>

    <id name="optionId">

    <column name="OPTION_ID" />

    <generated-value strategy="TABLE" />

    </id>

    <basic name="optionItem">

    <column name="OPTION_ITEM"/>

    </basic>

    <many-to-one name="pollTopic" >

    <join-column name="TOPIC_ID" nullable="false"/>

    </many-to-one>

    </attributes>

    </entity>

    <entity class="Post">

    ② Post 實體配置

    <table name="T_POST" />

    <attributes>

    <id name="postId">

    <column name="POST_ID" />

    <generated-value strategy="TABLE" />

    </id>

    <basic name="postText" fetch="EAGER">

    <column name="POST_TEXT" column-definition="LONGTEXT NOT NULL"/>

    <lob/>

    </basic>

    <basic name="postAttach" fetch="LAZY">

    <column name="POST_ATTACH" column-definition="BLOB"/>

    <lob/>

    </basic>

    </attributes>

    </entity>

    </entity-mappings>



    使用這個 orm.xml 來描述實體信息的話,這里并沒有標明兩個繼承類之間的關系,其繼承信息將從實體類反射信息獲取。


    到這里我們的實體描述結束了,當然我們只是做了比較簡單的描述,對于那些復雜的信息描述并沒有進行講述。實體描述結束了,有人會問如果我要來操作這些實體該怎么操作?這就是我們接下來要講述的問題。


    EntityManager 介紹

    實體對象由實體管理器進行管理, JPA 使用 javax.persistence.EntityManager 代表實體管理器。實體管理器和持久化上下文關聯,持久化上下文是一系列實體的管理環境,我們通過 EntityManager 和持久化上下文進
    posted @ 2010-05-09 14:57 ourday 閱讀(1341) | 評論 (0)編輯 收藏

    通過dateadd和case..when...then.else函數來比較開始考試日期,考試結束日期與當前時間來確定是否可以參加考試.
    select   name,test_num,test_paper,begin_date,end_date,
          valid=case   when   begin_date>dateadd(dd,0,getdate()) or end_date<dateadd(dd,0,getdate()) then   0   else   1   end    
    from test where id=1
    或者
    SELECT    'valid '=
          CASE         
           WHEN datediff(dd,begin_date,getdate())<0 THEN 0
           WHEN datediff(dd,end_date,getdate())>0 THEN 0
    else 1     
          END,
    name,test_num,test_paper,begin_date,end_date
    from test where id=1

    Mysql中的獲取最后一條插入ID的函數是Last_INSERT_ID(),而MSSql2000的函數有以下三個.
    IDENT_CURRENT() 返回為任何會話和任何作用域中的特定表最后生成的標識值。  
    @@IDENTITY 返回為當前會話的所有作用域中的任何表最后生成的標識值。   
    推薦使用:SCOPE_IDENTITY () 返回為當前會話和當前作用域中的任何表最后生成的標識值。(防止返回觸發器中的insert的IDENTITY值)  

    時間轉換函數
    SELECT convert(varchar(10),mn_test.begin_date,23)+'至'+convert(varchar(10),mn_test.end_date,23) as testtime FROM test LEFT OUTER JOIN grade ON (test.grade_note = grade.note)

    對查詢結果隨機排序
    SELECT * FROM Northwind..Orders ORDER BY NEWID()
    SELECT TOP 10 * FROM Northwind..Orders ORDER BY NEWID()

    附1:SQLServer和Oracle的常用函數對比

      1.絕對值

      S:select abs(-1) value

      O:select abs(-1) value from dual

      2.取整(大)

      S:select ceiling(-1.001) value

      O:select ceil(-1.001) value from dual

      3.取整(小)

      S:select floor(-1.001) value

      O:select floor(-1.001) value from dual

      4.取整(截取)

      S:select cast(-1.002 as int) value

      O:select trunc(-1.002) value from dual

      5.四舍五入

      S:select round(1.23456,4) value 1.23460

      O:select round(1.23456,4) value from dual 1.2346

      6.e為底的冪

      S:select Exp(1) value 2.7182818284590451

      O:select Exp(1) value from dual 2.71828182

      7.取e為底的對數

      S:select log(2.7182818284590451) value 1

      O:select ln(2.7182818284590451) value from dual; 1

      8.取10為底對數

      S:select log10(10) value 1

      O:select log(10,10) value from dual; 1

      9.取平方

      S:select SQUARE(4) value 16

      O:select power(4,2) value from dual 16

      10.取平方根

      S:select SQRT(4) value 2

      O:select SQRT(4) value from dual 2

      11.求任意數為底的冪

      S:select power(3,4) value 81

      O:select power(3,4) value from dual 81

      12.取隨機數

      S:select rand() value

      O:select sys.dbms_random.value(0,1) value from dual;

      13.取符號

      S:select sign(-8) value -1

      O:select sign(-8) value from dual -1

      ----------數學函數

      14.圓周率

      S:SELECT PI() value 3.1415926535897931

      O:不知道

      15.sin,cos,tan 參數都以弧度為單位

      例如:select sin(PI()/2) value 得到1(SQLServer)

      16.Asin,Acos,Atan,Atan2 返回弧度

      17.弧度角度互換(SQLServer,Oracle不知道)

      DEGREES:弧度-〉角度

      RADIANS:角度-〉弧度

      ---------數值間比較

      18. 求集合最大值

      S:select max(value) value from

      (select 1 value

      union

      select -2 value

      union

      select 4 value

      union

      select 3 value)a

      O:select greatest(1,-2,4,3) value from dual

      19. 求集合最小值

      S:select min(value) value from

      (select 1 value

      union

      select -2 value

      union

      select 4 value

      union

      select 3 value)a

      O:select least(1,-2,4,3) value from dual

      20.如何處理null值(F2中的null以10代替)

      S:select F1,IsNull(F2,10) value from Tbl

      O:select F1,nvl(F2,10) value from Tbl

    --------數值間比較

      21.求字符序號

      S:select ascii('a') value

      O:select ascii('a') value from dual

      22.從序號求字符

      S:select char(97) value

      O:select chr(97) value from dual

      23.連接

      S:select '11'+'22'+'33' value

      O:select CONCAT('11','22')||33 value from dual

      23.子串位置 --返回3

      S:select CHARINDEX('s','sdsq',2) value

      O:select INSTR('sdsq','s',2) value from dual

      23.模糊子串的位置 --返回2,參數去掉中間%則返回7

      S:select patindex('%d%q%','sdsfasdqe') value

      O:oracle沒發現,但是instr可以通過第四霾問 刂瞥魷執問?BR>  select INSTR('sdsfasdqe','sd',1,2) value from dual 返回6

      24.求子串

      S:select substring('abcd',2,2) value

      O:select substr('abcd',2,2) value from dual

      25.子串代替 返回aijklmnef

      S:SELECT STUFF('abcdef', 2, 3, 'ijklmn') value

      O:SELECT Replace('abcdef', 'bcd', 'ijklmn') value from dual

      26.子串全部替換

      S:沒發現

      O:select Translate('fasdbfasegas','fa','我' ) value from dual

      27.長度

      S:len,datalength

      O:length

      28.大小寫轉換 lower,upper

      29.單詞首字母大寫

      S:沒發現

      O:select INITCAP('abcd dsaf df') value from dual

      30.左補空格(LPAD的第一個參數為空格則同space函數)

      S:select space(10)+'abcd' value

      O:select LPAD('abcd',14) value from dual

      31.右補空格(RPAD的第一個參數為空格則同space函數)

      S:select 'abcd'+space(10) value

      O:select RPAD('abcd',14) value from dual

      32.刪除空格

      S:ltrim,rtrim

      O:ltrim,rtrim,trim

      33. 重復字符串

      S:select REPLICATE('abcd',2) value

      O:沒發現

      34.發音相似性比較(這兩個單詞返回值一樣,發音相同)

      S:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe')

      O:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') from dual

      SQLServer中用SELECT DIFFERENCE('Smithers', 'Smythers') 比較soundex的差

      返回0-4,4為同音,1最高

      --------------日期函數

      35.系統時間

      S:select getdate() value

      O:select sysdate value from dual

      36.前后幾日

      直接與整數相加減

      37.求日期

      S:select convert(char(10),getdate(),20) value

      O:select trunc(sysdate) value from dual

      select to_char(sysdate,'yyyy-mm-dd') value from dual

      38.求時間

      S:select convert(char(8),getdate(),108) value

      O:select to_char(sysdate,'hh24:mm:ss') value from dual

      39.取日期時間的其他部分

      S:DATEPART 和 DATENAME 函數 (第一個參數決定)

      O:to_char函數 第二個參數決定

    參數---------------------------------下表需要補充

      year yy, yyyy

      quarter qq, q (季度)

      month mm, m (m O無效)

      dayofyear dy, y (O表星期)

      day dd, d (d O無效)

      week wk, ww (wk O無效)

      weekday dw (O不清楚)

      Hour hh,hh12,hh24 (hh12,hh24 S無效)

      minute mi, n (n O無效)

      second ss, s (s O無效)

      millisecond ms (O無效)

      ----------------------------------------------

      40.當月最后一天

      S:不知道

      O:select LAST_DAY(sysdate) value from dual

      41.本星期的某一天(比如星期日)

      S:不知道

      O:SELECT Next_day(sysdate,7) vaule FROM DUAL;

      42.字符串轉時間

      S:可以直接轉或者select cast('2004-09-08'as datetime) value

      O:SELECT To_date('2004-01-05 22:09:38','yyyy-mm-dd hh24-mi-ss') vaule FROM DUAL;

      43.求兩日期某一部分的差(比如秒)

      S:select datediff(ss,getdate(),getdate()+12.3) value

      O:直接用兩個日期相減(比如d1-d2=12.3)

      SELECT (d1-d2)*24*60*60 vaule FROM DUAL;

      44.根據差值求新的日期(比如分鐘)

      S:select dateadd(mi,8,getdate()) value

      O:SELECT sysdate+8/60/24 vaule FROM DUAL;

      45.求不同時區時間

      S:不知道

      O:SELECT New_time(sysdate,'ydt','gmt' ) vaule FROM DUAL;

      -----時區參數,北京在東8區應該是Ydt-------

      AST ADT 大西洋標準時間

      BST BDT 白令海標準時間

      CST CDT 中部標準時間

      EST EDT 東部標準時間

      GMT 格林尼治標準時間

      HST HDT 阿拉斯加—夏威夷標準時間

      MST MDT 山區標準時間

      NST 紐芬蘭標準時間

      PST PDT 太平洋標準時間

      YST YDT YUKON標準時間

    Oracle支持的字符函數和它們的Microsoft SQL Server等價函數:

    函數 Oracle Microsoft SQL Server

    把字符轉換為ASCII ASCII ASCII

    字串連接 CONCAT (expression + expression)

    把ASCII轉換為字符 CHR CHAR

    返回字符串中的開始字符(左起) INSTR CHARINDEX

    把字符轉換為小寫 LOWER LOWER

    把字符轉換為大寫 UPPER UPPER

    填充字符串的左邊 LPAD N/A

    清除開始的空白 LTRIM LTRIM

    清除尾部的空白 RTRIM RTRIM

    字符串中的起始模式(pattern) INSTR PATINDEX

    多次重復字符串 RPAD REPLICATE

    字符串的語音表示 SOUNDEX SOUNDEX

    重復空格的字串 RPAD SPACE

    從數字數據轉換為字符數據 TO_CHAR STR

    子串 SUBSTR SUBSTRING

    替換字符 REPLACE STUFF

    將字串中的每個詞首字母大寫 INITCAP N/A

    翻譯字符串 TRANSLATE N/A

    字符串長度 LENGTH DATELENGTH or LEN

    列表中最大的字符串 GREATEST N/A

    列表中最小的字符串 LEAST N/A

    如果為NULL則轉換字串 NVL ISNULL

     

    日期函數

    函數 Oracle Microsoft SQL Server

    日期相加 (date column +/- value) or

    ADD_MONTHS DATEADD

    兩個日期的差 (date column +/- value) or

    MONTHS_BETWEEN DATEDIFF

    當前日期和時間 SYSDATE GETDATE()

    一個月的最后一天 LAST_DAY N/A

    時區轉換 NEW_TIME N/A

    日期后的第一個周日 NEXT_DAY N/A

    代表日期的字符串 TO_CHAR DATENAME

    代表日期的整數 TO_NUMBER

    (TO_CHAR)) DATEPART

    日期舍入 ROUND CONVERT

    日期截斷 TRUNC CONVERT

    字符串轉換為日期 TO_DATE CONVERT

    如果為NULL則轉換日期 NVL ISNULL

     

    轉換函數

    函數 Oracle Microsoft SQL Server

    數字轉換為字符 TO_CHAR CONVERT

    字符轉換為數字 TO_NUMBER CONVERT

    日期轉換為字符 TO_CHAR CONVERT

    字符轉換為日期 TO_DATE CONVERT

    16進制轉換為2進制 HEX_TO_RAW CONVERT

    2進制轉換為16進制 RAW_TO_HEX CONVERT

     

    其它行級別的函數

    函數 Oracle Microsoft SQL Server

    返回第一個非空表達式 DECODE COALESCE

    當前序列值 CURRVAL N/A

    下一個序列值 NEXTVAL N/A

    如果exp1 = exp2, 返回null DECODE NULLIF

    用戶登錄賬號ID數字 UID SUSER_ID

    用戶登錄名 USER SUSER_NAME

    用戶數據庫ID數字 UID USER_ID

    用戶數據庫名 USER USER_NAME

    當前用戶 CURRENT_USER CURRENT_USER

    用戶環境(audit trail) USERENV N/A

    在CONNECT BY子句中的級別 LEVEL N/A

     

    合計函數

    函數 Oracle Microsoft SQL Server

    Average AVG AVG

    Count COUNT COUNT

    Maximum MAX MAX

    Minimum MIN MIN

    Standard deviation STDDEV STDEV or STDEVP

    Summation SUM SUM

    Variance VARIANCE VAR or VARP

    Oracle還有一個有用的函數EXTRACT,提取并且返回日期時間或時間間隔表達式中特定的時間域:

    EXTRACT(YEAR FROM 日期)

    T_SQL命令大全

    --語 句 功 能

    --數據操作

    SELECT --從數據庫表中檢索數據行和列

    INSERT --向數據庫表添加新數據行

    DELETE --從數據庫表中刪除數據行

    UPDATE --更新數據庫表中的數據

    --數據定義

    CREATE TABLE --創建一個數據庫表

    DROP TABLE --從數據庫中刪除表

    ALTER TABLE --修改數據庫表結構

    CREATE VIEW --創建一個視圖

    DROP VIEW --從數據庫中刪除視圖

    CREATE INDEX --為數據庫表創建一個索引

    DROP INDEX --從數據庫中刪除索引

    CREATE PROCEDURE --創建一個存儲過程

    DROP PROCEDURE --從數據庫中刪除存儲過程

    CREATE TRIGGER --創建一個觸發器

    DROP TRIGGER --從數據庫中刪除觸發器

    CREATE SCHEMA --向數據庫添加一個新模式

    DROP SCHEMA --從數據庫中刪除一個模式

    CREATE DOMAIN --創建一個數據值域

    ALTER DOMAIN --改變域定義

    DROP DOMAIN --從數據庫中刪除一個域

    --數據控制

    GRANT --授予用戶訪問權限

    DENY --拒絕用戶訪問

    REVOKE --解除用戶訪問權限

    --事務控制

    COMMIT --結束當前事務

    ROLLBACK --中止當前事務

    SET TRANSACTION --定義當前事務數據訪問特征

    --程序化SQL

    DECLARE --為查詢設定游標

    EXPLAN --為查詢描述數據訪問計劃

    OPEN --檢索查詢結果打開一個游標

    FETCH --檢索一行查詢結果

    CLOSE --關閉游標

    PREPARE --為動態執行準備SQL 語句

    EXECUTE --動態地執行SQL 語句

    DESCRIBE --描述準備好的查詢

     

    ---局部變量

    declare @id char(10)

    --set @id = '10010001'

    select @id = '10010001'

    ---全局變量

    ---必須以@@開頭

    --IF ELSE

    declare @x int @y int @z int

    select @x = 1 @y = 2 @z=3

    if @x > @y

    print 'x > y' --打印字符串'x > y'

    else if @y > @z

    print 'y > z'

    else print 'z > y'

    --CASE

    use pangu

    update employee

    set e_wage =

    case

    when job_level = ’1’ then e_wage*1.08

    when job_level = ’2’ then e_wage*1.07

    when job_level = ’3’ then e_wage*1.06

    else e_wage*1.05

    end

    --WHILE CONTINUE BREAK

    declare @x int @y int @c int

    select @x = 1 @y=1

    while @x < 3

    begin

    print @x --打印變量x 的值

    while @y < 3

    begin

    select @c = 100*@x + @y

    print @c --打印變量c 的值

    select @y = @y + 1

    end

    select @x = @x + 1

    select @y = 1

    end

    --WAITFOR

    --例 等待1 小時2 分零3 秒后才執行SELECT 語句

    waitfor delay ’01:02:03’

    select * from employee

    --例 等到晚上11 點零8 分后才執行SELECT 語句

    waitfor time ’23:08:00’

    select * from employee

     

    ***SELECT***

    select *(列名) from table_name(表名) where column_name operator value

    ex 宿主)

    select * from stock_information where stockid = str(nid)

    stockname = 'str_name'

    stockname like '% find this %'

    stockname like '[a-zA-Z]%' --------- ([]指定值的范圍)

    stockname like '[^F-M]%' --------- (^排除指定范圍)

    --------- 只能在使用like關鍵字的where子句中使用通配符)

    or stockpath = 'stock_path'

    or stocknumber < 1000

    and stockindex = 24

    not stocksex = 'man'

    stocknumber between 20 and 100

    stocknumber in(10,20,30)

    order by stockid desc(asc) --------- 排序,desc-降序,asc-升序

    order by 1,2 --------- by列號

    stockname = (select stockname from stock_information where stockid = 4)

    --------- 子查詢

    --------- 除非能確保內層select只返回一個行的值,

    --------- 否則應在外層where子句中用一個in限定符

    select distinct column_name form table_name --------- distinct指定檢索獨有的列值,不重復

    select stocknumber ,"stocknumber + 10" = stocknumber + 10 from table_name

    select stockname , "stocknumber" = count(*) from table_name group by stockname

    --------- group by 將表按行分組,指定列中有相同的值

    having count(*) = 2 --------- having選定指定的組

    select *

    from table1, table2

    where table1.id *= table2.id -------- 左外部連接,table1中有的而table2中沒有得以null表示

    table1.id =* table2.id -------- 右外部連接

    select stockname from table1

    union [all] ----- union合并查詢結果集,all-保留重復行

    select stockname from table2

    --STDEV()

    --STDEV()函數返回表達式中所有數據的標準差

    --STDEVP()

    --STDEVP()函數返回總體標準差

    --VAR()

    --VAR()函數返回表達式中所有值的統計變異數

    --VARP()

    --VARP()函數返回總體變異數

    ----算術函數----

    /***三角函數***/

    SIN(float_expression) --返回以弧度表示的角的正弦

    COS(float_expression) --返回以弧度表示的角的余弦

    TAN(float_expression) --返回以弧度表示的角的正切

    COT(float_expression) --返回以弧度表示的角的余切

    /***反三角函數***/

    ASIN(float_expression) --返回正弦是FLOAT 值的以弧度表示的角

    ACOS(float_expression) --返回余弦是FLOAT 值的以弧度表示的角

    ATAN(float_expression) --返回正切是FLOAT 值的以弧度表示的角

    ATAN2(float_expression1,float_expression2)

    --返回正切是float_expression1 /float_expres-sion2的以弧度表示的角

    DEGREES(numeric_expression)

    --把弧度轉換為角度返回與表達式相同的數據類型可為

    --INTEGER/MONEY/REAL/FLOAT 類型

    RADIANS(numeric_expression) --把角度轉換為弧度返回與表達式相同的數據類型可為

    --INTEGER/MONEY/REAL/FLOAT 類型

    EXP(float_expression) --返回表達式的指數值

    LOG(float_expression) --返回表達式的自然對數值

    LOG10(float_expression)--返回表達式的以10 為底的對數值

    SQRT(float_expression) --返回表達式的平方根

    /***取近似值函數***/

    CEILING(numeric_expression) --返回>=表達式的最小整數返回的數據類型與表達式相同可為

    --INTEGER/MONEY/REAL/FLOAT 類型

    FLOOR(numeric_expression) --返回<=表達式的最小整數返回的數據類型與表達式相同可為

    --INTEGER/MONEY/REAL/FLOAT 類型

    ROUND(numeric_expression) --返回以integer_expression 為精度的四舍五入值返回的數據

    --類型與表達式相同可為INTEGER/MONEY/REAL/FLOAT 類型

    ABS(numeric_expression) --返回表達式的絕對值返回的數據類型與表達式相同可為

    --INTEGER/MONEY/REAL/FLOAT 類型

    SIGN(numeric_expression) --測試參數的正負號返回0 零值1 正數或-1 負數返回的數據類型

    --與表達式相同可為INTEGER/MONEY/REAL/FLOAT 類型

    PI() --返回值為π 即3.1415926535897936

    RAND([integer_expression]) --用任選的[integer_expression]做種子值得出0-1 間的隨機浮點數

    ----字符串函數----

    ASCII() --函數返回字符表達式最左端字符的ASCII 碼值

    CHAR() --函數用于將ASCII 碼轉換為字符

    --如果沒有輸入0 ~ 255 之間的ASCII 碼值CHAR 函數會返回一個NULL 值

    LOWER() --函數把字符串全部轉換為小寫

    UPPER() --函數把字符串全部轉換為大寫

    STR() --函數把數值型數據轉換為字符型數據

    LTRIM() --函數把字符串頭部的空格去掉

    RTRIM() --函數把字符串尾部的空格去掉

    LEFT(),RIGHT(),SUBSTRING() --函數返回部分字符串

    CHARINDEX(),PATINDEX() --函數返回字符串中某個指定的子串出現的開始位置

    SOUNDEX() --函數返回一個四位字符碼

    --SOUNDEX函數可用來查找聲音相似的字符串但SOUNDEX函數對數字和漢字均只返回0 值

    DIFFERENCE() --函數返回由SOUNDEX 函數返回的兩個字符表達式的值的差異

    --0 兩個SOUNDEX 函數返回值的第一個字符不同

    --1 兩個SOUNDEX 函數返回值的第一個字符相同

    --2 兩個SOUNDEX 函數返回值的第一二個字符相同

    --3 兩個SOUNDEX 函數返回值的第一二三個字符相同

    --4 兩個SOUNDEX 函數返回值完全相同

    QUOTENAME() --函數返回被特定字符括起來的字符串

    /*select quotename('abc', '{') quotename('abc')

    運行結果如下

    ----------------------------------{

    {abc} [abc]*/

    REPLICATE() --函數返回一個重復character_expression 指定次數的字符串

    /*select replicate('abc', 3) replicate( 'abc', -2)

    運行結果如下

    ----------- -----------

    abcabcabc NULL*/

    REVERSE() --函數將指定的字符串的字符排列順序顛倒

    REPLACE() --函數返回被替換了指定子串的字符串

    /*select replace('abc123g', '123', 'def')

    運行結果如下

    ----------- -----------

    abcdefg*/

    SPACE() --函數返回一個有指定長度的空白字符串

    STUFF() --函數用另一子串替換字符串指定位置長度的子串

    ----數據類型轉換函數----

    CAST() 函數語法如下

    CAST() (<expression> AS <data_ type>[ length ])

    CONVERT() 函數語法如下

    CONVERT() (<data_ type>[ length ], <expression> [, style])

    select cast(100+99 as char) convert(varchar(12), getdate())

    運行結果如下

    ------------------------------ ------------

    199 Jan 15 2000

    ----日期函數----

    DAY() --函數返回date_expression 中的日期值

    MONTH() --函數返回date_expression 中的月份值

    YEAR() --函數返回date_expression 中的年份值

    DATEADD(<datepart> ,<number> ,<date> )

    --函數返回指定日期date 加上指定的額外日期間隔number 產生的新日期

    DATEDIFF(<datepart> ,<number> ,<date> )

    --函數返回兩個指定日期在datepart 方面的不同之處

    DATENAME(<datepart> , <date> ) --函數以字符串的形式返回日期的指定部分

    DATEPART(<datepart> , <date> ) --函數以整數值的形式返回日期的指定部分

    GETDATE() --函數以DATETIME 的缺省格式返回系統當前的日期和時間

    ----系統函數----

    APP_NAME() --函數返回當前執行的應用程序的名稱

    COALESCE() --函數返回眾多表達式中第一個非NULL 表達式的值

    COL_LENGTH(<'table_name'>, <'column_name'> ) --函數返回表中指定字段的長度值

    COL_NAME(<table_id>, <column_id> ) --函數返回表中指定字段的名稱即列名

    DATALENGTH() --函數返回數據表達式的數據的實際長度

    DB_ID(['database_name']) --函數返回數據庫的編號

    DB_NAME(database_id) --函數返回數據庫的名稱

    HOST_ID() --函數返回服務器端計算機的名稱

    HOST_NAME() --函數返回服務器端計算機的名稱

    IDENTITY(<data_type>[, seed increment]) [AS column_name]}

    --IDENTITY() 函數只在SELECT INTO 語句中使用用于插入一個identity column列到新表中

    /*select identity(int, 1, 1) as column_name

    into newtable

    from oldtable*/

    ISDATE() --函數判斷所給定的表達式是否為合理日期

    ISNULL(<check_expression>, <replacement_value> ) --函數將表達式中的NULL 值用指定值替換

    ISNUMERIC() --函數判斷所給定的表達式是否為合理的數值

    NEWID() --函數返回一個UNIQUEIDENTIFIER 類型的數值

    NULLIF(<expression1>, <expression2> )

    --NULLIF 函數在expression1 與expression2 相等時返回NULL 值若不相等時則返回expression1 的值

    附2:時間轉換函數
    convert(char,date,N)輸出的各中樣式
    convert(varchar(10),字段名,轉換格式)
    例:
    select id,convert(varchar(10),date,11) as date from sb

    N 日期樣式
    0 04 2 2005 9:06AM .....
    20 2005-04-02 09:06:18
    21 2005-04-02 09:06:18.857
    22 04/02/05 9:06:18 AM
    23 2005-04-02
    24 09:06:18
    25 2005-04-02 09:06:18.857
    100 04 2 2005 9:06AM
    101 04/02/2005
    102 2005.04.02
    103 02/04/2005
    104 02.04.2005
    105 02-04-2005

    108 09:06:18
    109 04 2 2005 9:06:18:857AM
    110 04-02-2005
    114 09:06:18:857
    120 2005-04-02 09:06:18
    121 2005-04-02 09:06:18.857
    126 2005-04-02T09:06:18.857   

    posted @ 2008-11-01 19:25 ourday 閱讀(693) | 評論 (0)編輯 收藏

    JDK 是整個Java的核心,包括了Java運行環境(Java Runtime Envirnment),一堆Java工具和Java基礎的類庫(rt.jar)。不論什么Java應用服務器實質都是內置了某個版本的JDK。因此掌握 JDK是學好Java的第一步。最主流的JDK是Sun公司發布的JDK,除了Sun之外,還有很多公司和組織都開發了自己的JDK,例如IBM公司開發的JDK,BEA公司的Jrocket,還有GNU組織開發的JDK等等。其中IBM的JDK包含的JVM(Java Virtual Machine)運行效率要比Sun JDK包含的JVM高出許多。而專門運行在x86平臺的Jrocket在服務端運行效率也要比Sun JDK好很多。但不管怎么說,我們還是需要先把Sun JDK掌握好。
    JDK(Java Development Kit,Java開發包,Java開發工具)是一個寫Java的applet和應用程序的程序開發環境。它由一個處于操作系統層之上的運行環境還有開發者編譯,調試和運行用Java語言寫的applet和應用程序所需的工具組成。
    JDK
    JDK(Java Development Kit)是Sun Microsystems針對Java開發員的產品。自從Java推出以來,JDK已經成為使用最廣泛的Java SDK(Software development kit)。
    JDK包含的基本組件包括:
    ·javac – 編譯器,將源程序轉成字節碼
    ·jar – 打包工具,將相關的類文件打包成一個文件
    ·javadoc – 文檔生成器,從源碼注釋中提取文檔
    ·jdb – debugger,查錯工具
    ·java – 運行編譯后的java程序(.class后綴的)
    JDK中還包括各種例子程序,用以展示Java API中的各部分。
    從初學者角度來看,采用JDK開發Java程序能夠很快理解程序中各部分代碼之間的關系,有利于理解Java面向對象的設計思想。JDK的另一個顯著特點是隨著Java (J2EE、J2SE以及J2ME)版本的升級而升級。但它的缺點也是非常明顯的就是從事大規模企業級Java應用開發非常困難,不能進行復雜的Java軟件開發,也不利于團體協同開發。
    JDK一般有三種版本:
    SE(J2SE),standard edition,標準版,是我們通常用的一個版本
    EE(J2EE),enterpsise edtion,企業版,使用這種JDK開發J2EE應用程序,
    ME(J2ME),micro edtion,主要用于移動設備、嵌入式設備上的java應用程序
    Java開發工具(JDK)是許多Java專家最初使用的開發環境。盡管許多編程人員已經使用第三方的開發工具,但JDK仍被當作Java開發的重要工具。
    JDK由一個標準類庫和一組建立,測試及建立文檔的Java實用程序組成。其核心Java
    API是一些預定義的類庫,開發人員需要用這些類來訪問Java語言的功能。Java API包括一些重要的語言結構以及基本圖形,網絡和文件I/O。一般來說,Java API的非I/O部分對于運行Java的所有平臺是相同的,而I/O部分則僅在通用Java環境中實現。
    作為JDK實用程序,工具庫中有七種主要程序。
    Javac:Java編譯器,將Java源代碼轉換成字節碼。
    Java:Java解釋器,直接從類文件執行Java應用程序字節代碼。
    appletviewer:小程序瀏覽器,一種執行HTML文件上的Java小程序的Java瀏覽器。
    Javadoc:根據Java源碼及說明語句生成HTML文檔。
    Jdb:Java調試器,可以逐行執行程序,設置斷點和檢查變量。
    Javah:產生可以調用Java過程的C過程,或建立能被Java程序調用的C過程的頭文件。
    Javap:Java反匯編器,顯示編譯類文件中的可訪問功能和數據,同時顯示字節代碼含義。
    posted @ 2008-10-11 10:43 ourday 閱讀(978) | 評論 (1)編輯 收藏

    javaMail API(1.3.2)
    http://java.sun.com/products/javamail/downloads/index.html
    javaBeans Activation Framework(1.0.2)
    http://www.javafan.net/down?ID=40&URL=1
    Apache上的javaMail開發組件(commons-email-1.1):
    http://commons.apache.org
    JSValidation驗證框架的官方網址為:
    http://cosoft.org.cn/projects/jsvalidation
    FCKeditor的網址:
    http://www.fckeditor.net/download
    SQL Server驅動程序的下載地址:
    http://www.microsoft.com/downloads
    struts的官方網站:
    http://struts.apache.org/
    WebWork的官方網站:
    http://www.opensymphony.com/webwork/
    Spring的官方網站:
    http://www.springframework.org
    Jakarta Taglibs標簽庫:
    http://jakarta.apache.org/
    Display tag標簽庫:
    http://displaytag.sf.net/
    posted @ 2008-10-11 09:29 ourday 閱讀(306) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 一本大道一卡二大卡三卡免费 | 一个人看的www在线免费视频| 免费看成人AA片无码视频羞羞网| 久久丫精品国产亚洲av不卡 | 最近在线2018视频免费观看| 亚洲小视频在线观看| 在线精品免费视频无码的| 亚洲国产成a人v在线| 免费精品国偷自产在线在线| 中文字幕在线日亚洲9| 欧亚一级毛片免费看| 亚洲精品国产高清嫩草影院| 精品97国产免费人成视频| 国产gv天堂亚洲国产gv刚刚碰| 2022免费国产精品福利在线| 亚洲熟妇无码八AV在线播放| 久久久99精品免费观看| 亚洲日本在线播放| 成人免费福利电影| 亚洲成人免费网站| 影音先锋在线免费观看| 青青视频免费在线| 国产亚洲欧洲精品| 日韩在线一区二区三区免费视频| 奇米影视亚洲春色| 亚欧免费视频一区二区三区| 久久亚洲精品中文字幕三区| 222www在线观看免费| 亚洲成av人无码亚洲成av人| 亚洲综合色区在线观看| 午夜不卡久久精品无码免费| 在线aⅴ亚洲中文字幕| 2048亚洲精品国产| 国产曰批免费视频播放免费s| 香蕉视频亚洲一级| 亚洲一区二区三区首页| 毛片免费vip会员在线看| 国产久爱免费精品视频| 亚洲免费电影网站| 免费大黄网站在线观| 亚洲一区免费视频|