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

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

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

    ourday

    ourday

      BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      8 Posts :: 2 Stories :: 11 Comments :: 0 Trackbacks

    2008年11月1日 #

    JPA是什么

     

    定義 Java Persistence API

    JPA通過(guò)JDK 5.0注解或XML描述對(duì)象-關(guān)系表的映射關(guān)系,并將運(yùn)行期的實(shí)體對(duì)象持久化到數(shù)據(jù)庫(kù)中。

    起源

    Sun引入新的JPA ORM規(guī)范出于兩個(gè)原因:其一,簡(jiǎn)化現(xiàn)有Java EE和Java SE應(yīng)用的對(duì)象持久化的開發(fā)工作;其二,Sun希望整合對(duì)ORM技術(shù),實(shí)現(xiàn)天下歸一。

    JPA由EJB 3.0軟件專家組開發(fā),作為JSR-220實(shí)現(xiàn)的一部分。但它不囿于EJB 3.0,你可以在Web應(yīng)用、甚至桌面應(yīng)用中使用。JPA的宗旨是為POJO提供持久化標(biāo)準(zhǔn)規(guī)范,由此可見(jiàn),經(jīng)過(guò)這幾年的實(shí)踐探索,能夠脫離容器獨(dú)立運(yùn) 行,方便開發(fā)和測(cè)試的理念已經(jīng)深入人心了。目前Hibernate 3.2、TopLink 10.1.3以及OpenJPA都提供了JPA的實(shí)現(xiàn)。

    JPA的總體思想和現(xiàn)有Hibernate、TopLink,JDO等ORM框架大體一致。總的來(lái)說(shuō),JPA包括以下3方面的技術(shù):

    ORM映射元數(shù)據(jù)

    JPA支持XML和JDK 5.0注解兩種元數(shù)據(jù)的形式,元數(shù)據(jù)描述對(duì)象和表之間的映射關(guān)系,框架據(jù)此將實(shí)體對(duì)象持久化到數(shù)據(jù)庫(kù)表中;

    JPA 的API

    用來(lái)操作實(shí)體對(duì)象,執(zhí)行CRUD操作,框架在后臺(tái)替我們完成所有的事情,開發(fā)者從繁瑣的JDBC和SQL代碼中解脫出來(lái)。

    查詢語(yǔ)言

    這是持久化操作中很重要的一個(gè)方面,通過(guò)面向?qū)ο蠖敲嫦驍?shù)據(jù)庫(kù)的查詢語(yǔ)言查詢數(shù)據(jù),避免程序的SQL語(yǔ)句緊密耦合。

    JPA的優(yōu)勢(shì)

    1 標(biāo)準(zhǔn)化

    JPA 是 JCP 組織發(fā)布的 Java EE 標(biāo)準(zhǔn)之一,因此任何聲稱符合 JPA 標(biāo)準(zhǔn)的框架都遵循同樣的架構(gòu),提供相同的訪問(wèn) API,這保證了基于JPA開發(fā)的企業(yè)應(yīng)用能夠經(jīng)過(guò)少量的修改就能夠在不同的JPA框架下運(yùn)行。

    2 對(duì)容器級(jí)特性的支持

    JPA 框架中支持大數(shù)據(jù)集、事務(wù)、并發(fā)等容器級(jí)事務(wù),這使得 JPA 超越了簡(jiǎn)單持久化框架的局限,在企業(yè)應(yīng)用發(fā)揮更大的作用。

    3 簡(jiǎn)單易用,集成方便

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

    4 可媲美JDBC的查詢能力

    JPA的查詢語(yǔ)言是面向?qū)ο蠖敲嫦驍?shù)據(jù)庫(kù)的,它以面向?qū)ο蟮淖匀徽Z(yǔ)法構(gòu)造查詢語(yǔ)句,可以看成 是Hibernate HQL的等價(jià)物。JPA定義了獨(dú)特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一種擴(kuò)展,它是針對(duì)實(shí)體的一種查詢語(yǔ)言,操作對(duì)象是實(shí)體,而不是關(guān)系數(shù)據(jù)庫(kù)的表,而且能夠支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能夠提供的高級(jí)查詢特性,甚至還能夠支持子查詢。

    5 支持面向?qū)ο蟮母呒?jí)特性

    JPA 中能夠支持面向?qū)ο蟮母呒?jí)特性,如類之間的繼承、多態(tài)和類之間的復(fù)雜關(guān)系,這樣的支持能夠讓開發(fā)者最大限度的使用面向?qū)ο蟮哪P驮O(shè)計(jì)企業(yè)應(yīng)用,而不需要自行處理這些特性在關(guān)系數(shù)據(jù)庫(kù)的持久化。

    JPA的供應(yīng)商

    JPA 的目標(biāo)之一是制定一個(gè)可以由很多供應(yīng)商實(shí)現(xiàn)的API,并且開發(fā)人員可以編碼來(lái)實(shí)現(xiàn)該API,而不是使用私有供應(yīng)商特有的API。因此開發(fā)人員只需使用供應(yīng) 商特有的API來(lái)獲得JPA規(guī)范沒(méi)有解決但應(yīng)用程序中需要的功能。盡可能地使用JPA API,但是當(dāng)需要供應(yīng)商公開但是規(guī)范中沒(méi)有提供的功能時(shí),則使用供應(yīng)商特有的API。

    1 Hibernate

    JPA是需要Provider來(lái)實(shí)現(xiàn)其功能的,Hibernate就是JPA Provider中很強(qiáng)的一個(gè),目前來(lái)說(shuō)應(yīng)該無(wú)人能出其右。從功能上來(lái)說(shuō),JPA現(xiàn)在就是Hibernate功能的一個(gè)子集。Hibernate 從3.2開始,就開始兼容JPA。Hibernate3.2獲得了Sun TCK的JPA(Java Persistence API) 兼容認(rèn)證。

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

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

    2 Spring

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

    在Spring 2.0.1中,正式提供對(duì)JPA的支持,這也促成了JPA的發(fā)展,要知道JPA的好處在于可以分離于容器運(yùn)行,變得更加的簡(jiǎn)潔。

    3 OpenJPA

    OpenJPA 是 Apache 組織提供的開源項(xiàng)目,它實(shí)現(xiàn)了 EJB 3.0 中的 JPA 標(biāo)準(zhǔn),為開發(fā)者提供功能強(qiáng)大、使用簡(jiǎn)單的持久化數(shù)據(jù)管理框架。OpenJPA 封裝了和關(guān)系型數(shù)據(jù)庫(kù)交互的操作,讓開發(fā)者把注意力集中在編寫業(yè)務(wù)邏輯上。OpenJPA 可以作為獨(dú)立的持久層框架發(fā)揮作用,也可以輕松的與其它 Java EE 應(yīng)用框架或者符合 EJB 3.0 標(biāo)準(zhǔn)的容器集成。

    4 其它

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

    對(duì)于EJB來(lái)說(shuō),實(shí)體Bean一直是被批評(píng)的對(duì)象,由于其太復(fù)雜和龐大。JPA的出現(xiàn),很大程度的分離了復(fù)雜性。這讓EJB的推廣也變得容易。

    總而言之,JPA規(guī)范主要關(guān)注的僅是API的行為方面,而由各種實(shí)現(xiàn)完成大多數(shù)性能有關(guān)的調(diào)優(yōu)。盡管如此,所有可靠的實(shí)現(xiàn)都應(yīng)該擁有某種數(shù)據(jù)緩存,以作為選擇。但愿不久的將來(lái),JPA能成為真正的標(biāo)準(zhǔn)。

    小結(jié)

    EJB 3.0和JPA 毫無(wú)疑問(wèn)將是Java EE 5的主要賣點(diǎn)。在某些領(lǐng)域中,它們給Java社區(qū)帶來(lái)了競(jìng)爭(zhēng)優(yōu)勢(shì),并使Java 在其他領(lǐng)域與競(jìng)爭(zhēng)對(duì)手不分伯仲(因?yàn)椋豢煞裾J(rèn),目前某些領(lǐng)域尚不存在基于標(biāo)準(zhǔn)的方法)。

    過(guò)去數(shù)年來(lái),Spring Framework一直是EJB在企業(yè)領(lǐng)域的主要競(jìng)爭(zhēng)對(duì)手。EJB3.0規(guī)范解決了很多促進(jìn)Spring興起的問(wèn)題。隨著它的出現(xiàn),EJB3.0毫無(wú)疑問(wèn)比Spring提供了更好的開發(fā)體驗(yàn)——最引人注目的優(yōu)勢(shì)是它不需要配置文件。

    JPA提供一種標(biāo)準(zhǔn)的OR映射解決方案,該解決方案完全集成到EJB3。0兼容的容器中。JPA的前輩將會(huì)繼續(xù)穩(wěn)定發(fā)展,但是業(yè)務(wù)應(yīng)用程序中的 raw 使用將可能會(huì)減少。實(shí)現(xiàn) JPA 兼容的實(shí)體管理器似乎很可能是此類技術(shù)的發(fā)展方向。

    Java EE系列規(guī)范的較大問(wèn)題與JPA沒(méi)有任何關(guān)系。Java EE 系列規(guī)范的問(wèn)題涉及到 Web和EJB容器之間的集成。Spring在此領(lǐng)域仍然具有主要競(jìng)爭(zhēng)優(yōu)勢(shì)。JBoss的Seam項(xiàng)目嘗試使用自定義的方法來(lái)解決這一問(wèn)題。Caucho Resin應(yīng)用服務(wù)器試圖擴(kuò)展容器邊界并支持在Web容器中使用@EJB注釋。我們希望Java EE 5.1將解決層集成的問(wèn)題,為我們提供一個(gè)全面而標(biāo)準(zhǔn)的依賴性注入方法。

    在不久的將來(lái),Sun可能會(huì)將JPA作為一個(gè)單獨(dú)的JSR對(duì)待,同時(shí)JPA還可能作為Java SE的一部分。不過(guò)這些都不太重要,重要的是,我們現(xiàn)在已經(jīng)可以在脫離容器的情況下、在Java SE應(yīng)用中使用JPA了。

    JPA已經(jīng)作為一項(xiàng)對(duì)象持久化的標(biāo)準(zhǔn),不但可以獲得Java EE應(yīng)用服務(wù)器的支持,還可以直接在Java SE中使用。開發(fā)者將無(wú)需在現(xiàn)有多種ORM框架中艱難地選擇,按照Sun的預(yù)想,現(xiàn)有ORM框架頭頂?shù)墓猸h(huán)將漸漸暗淡,不再具有以往的吸引力。

    值得注意的是Java Persistence API并不是J2EE環(huán)境

    專用,而是在java中的通用API。意味著我們可以在任何需要訪問(wèn)關(guān)系數(shù)據(jù)庫(kù)的地方使用JPA,

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

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

       JPA最主要的是一個(gè)統(tǒng)一的persistence.xml配置文件,可以放到每一個(gè)jar的META-INF/目錄下面,配置內(nèi)容主要有

    (以hibernate為例)

    1、數(shù)據(jù)庫(kù)連接的配置文件

    2、數(shù)據(jù)庫(kù)方言、連接URL、用戶名、密碼

    3、ORM映射的列表(Class)

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

    5、cache

    主要內(nèi)容,詳細(xì)內(nèi)容請(qǐng)看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的一個(gè)bug,否則會(huì)拋NullPointerException,springframework論壇告訴我的:)-->  
    10.   
    11. <bean class=  
    12.     "org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>  
    13.     <!--貌似這個(gè)部分所有spring配置文件還是僅允許一個(gè),可以配置到公共的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中可以通過(guò)getJpaTemplate()的各種方法進(jìn)行持久化操作-->  

     

    這樣就好了,可以使用entitymanager,每個(gè)jar里面可以相互不用影響,而且這個(gè)也符合我們新過(guò)程改進(jìn)推進(jìn)的每個(gè)子系統(tǒng)用jar發(fā)布的原則,當(dāng)然這里的還有作service層,對(duì)于子系統(tǒng)之間的交互,我覺(jué)得,原則上應(yīng)該僅允許他們?cè)趕ervice的層面上進(jìn)行,在DAO之間不應(yīng)該有相互的交叉,不過(guò)隱約覺(jué)

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

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

    還有,在j2se環(huán)境里,也可以通過(guò)代碼的方式取得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) | 評(píng)論 (1)編輯 收藏

    使用注解元數(shù)據(jù)
    基本注解:
    例子:
    @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 標(biāo)明該類 (Topic) 為一個(gè)實(shí)體類,它對(duì)應(yīng)數(shù)據(jù)庫(kù)中的表表名是 T_TOPIC ,這里也可以寫成: @Entity

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

    ③ Column 的一個(gè)屬性 length 指明的是該屬性的允許的長(zhǎng)度。 ( 個(gè)人認(rèn)為設(shè)定該屬性只是對(duì)于程序中操作該屬性時(shí)增加了一驗(yàn)證過(guò)程,對(duì)數(shù)據(jù)庫(kù)中該列原來(lái)的設(shè)置并沒(méi)有影響,但是 length 屬性指定的值必須不能大于數(shù)據(jù)庫(kù)創(chuàng)建表時(shí)給該列限制的最大長(zhǎng)度否則會(huì)出錯(cuò) )

    ④ Temporal(TemporalType.DATE) :如果屬性是時(shí)間類型,因?yàn)閿?shù)據(jù)表對(duì)時(shí)間類型有更嚴(yán)格的劃分,所以必須指定具體時(shí)間類型。在 javax.persistence.TemporalType 枚舉中定義了 3 種時(shí)間類型:
    1) DATE :等于 java.sql.Date

    2) TIME :等于 java.sql.Time

    3) TIMESTAMP :等于 java.sql.Timestamp



    繼承關(guān)系注解:
    對(duì)繼承關(guān)系進(jìn)行注解,必須在 父類 中聲明繼承實(shí)體的映射策略。
    例子:
    @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 通過(guò) strategy 屬性指明實(shí)體的繼承策略。
    在 javax.persistence.InheritanceType 定義了 3 種映射策略:
    1) SINGLE_TABLE :父子類都保存到同一個(gè)表中,通過(guò)字段值進(jìn)行區(qū)分。
    2) JOINED :父子類相同的部分保存在同一個(gè)表中,不同的部分分開存放,通過(guò)表連接獲取完整數(shù)據(jù);
    3) TABLE_PER_CLASS :每一個(gè)類對(duì)應(yīng)自己的表,一般不推薦采用這種方式。
    ② DiscriminatorColumn 如果繼承策略采用第一種繼承策略,則需要指明區(qū)分父子類的字段, DiscriminatorColumn 就是用來(lái)指明區(qū)分字段的注解。
    ③ DiscriminatorValue 同樣的采用第一種繼承策略通過(guò)字段區(qū)分父子類,則用這個(gè)注解給該實(shí)體的區(qū)分字段賦值在這里賦的值為 ”1”.



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

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

    // 省略 get/setter 方法
    }

    解釋 :

    ① 通過(guò) @DiscriminatorValue 將區(qū)分字段 TOPIC_TYPE 的值為 2 。由于 PollTopic 實(shí)體繼承于 Topic 實(shí)體,其它的元數(shù)據(jù)信息直接從 Topic 獲得。
    ④ OneToMany 指定了一個(gè)一對(duì)多的關(guān)聯(lián)關(guān)系, mappedBy 屬性指定 “Many” 方類引用 “One” 方類 的屬性名; cascade 屬性指明了級(jí)聯(lián)方式(如果這里不指定為 CascadeType.ALL 的話,那么有關(guān)聯(lián)關(guān)系的兩個(gè)對(duì)象在做保存和刪除操作時(shí)要分別來(lái)進(jìn)行) 建議 :盡可能使用 cascade=CascadeType.ALL 來(lái)減少持久化操作的復(fù)雜性和代碼量
    注意 : JPA 規(guī)范規(guī)定任何屬性都默認(rèn)映射到表中,所以雖然我們沒(méi)有給③處的 multiple 屬性提供注解信息,但 JPA 將按照 默認(rèn)的規(guī)則對(duì)該字段進(jìn)行映射:字段名和屬性名相同,類型相同。如果我們不希望將某個(gè)屬性持久化到數(shù)據(jù)表中,則可以通過(guò) @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 描述了多對(duì)一的關(guān)聯(lián)關(guān)系,他是對(duì)該類引用的 ”One” 類 (PollTopic) 的屬性( pollTopic )進(jìn)行注解的。
    ② JoinColumn 指定關(guān)聯(lián) ”One”(PollTopic) 實(shí)體所對(duì)應(yīng)表的 “ 外鍵 ” 。


    Lob 字段的注解:
    在 JPA 中 Lob 類型類型的持久化很簡(jiǎn)單,僅需要通過(guò)特殊的 Lob 注解就可以達(dá)到目的。
    例子:


    @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 通過(guò) @Lob 將屬性標(biāo)注為 Lob 類型 ;
    ① -2 通過(guò) @Basic 指定 Lob 類型數(shù)據(jù)的獲取策略, FetchType.EAGER 表示非延遲 加載,而 FetchType. LAZY 表示延遲加載 ;
    ① -3 通過(guò) @Column 的 columnDefinition 屬性指定數(shù)據(jù)表對(duì)應(yīng)的 Lob 字段類型。






    使用 XML 元數(shù)據(jù)


    除了使用注解提供元數(shù)據(jù)信息外, JPA 也允許我們通過(guò) XML 提供元數(shù)據(jù)信息。按照 JPA 的規(guī)范, 如果你提供了 XML 元數(shù)據(jù)描述信息,它將覆蓋實(shí)體類中的注解元數(shù)據(jù)信息 。 XML 元數(shù)據(jù)信息以 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">

    ①實(shí)體對(duì)象所在的包
    <package>com.baobaotao.domain</package>

    <entity class="Topic">

    ② Topic 實(shí)體配置

    <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 實(shí)體配置

    <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 實(shí)體配置

    <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 實(shí)體配置

    <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>



    使用這個(gè) orm.xml 來(lái)描述實(shí)體信息的話,這里并沒(méi)有標(biāo)明兩個(gè)繼承類之間的關(guān)系,其繼承信息將從實(shí)體類反射信息獲取。


    到這里我們的實(shí)體描述結(jié)束了,當(dāng)然我們只是做了比較簡(jiǎn)單的描述,對(duì)于那些復(fù)雜的信息描述并沒(méi)有進(jìn)行講述。實(shí)體描述結(jié)束了,有人會(huì)問(wèn)如果我要來(lái)操作這些實(shí)體該怎么操作?這就是我們接下來(lái)要講述的問(wèn)題。


    EntityManager 介紹

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

    通過(guò)dateadd和case..when...then.else函數(shù)來(lái)比較開始考試日期,考試結(jié)束日期與當(dāng)前時(shí)間來(lái)確定是否可以參加考試.
    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的函數(shù)是Last_INSERT_ID(),而MSSql2000的函數(shù)有以下三個(gè).
    IDENT_CURRENT() 返回為任何會(huì)話和任何作用域中的特定表最后生成的標(biāo)識(shí)值。  
    @@IDENTITY 返回為當(dāng)前會(huì)話的所有作用域中的任何表最后生成的標(biāo)識(shí)值。   
    推薦使用:SCOPE_IDENTITY () 返回為當(dāng)前會(huì)話和當(dāng)前作用域中的任何表最后生成的標(biāo)識(shí)值。(防止返回觸發(fā)器中的insert的IDENTITY值)  

    時(shí)間轉(zhuǎn)換函數(shù)
    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)

    對(duì)查詢結(jié)果隨機(jī)排序
    SELECT * FROM Northwind..Orders ORDER BY NEWID()
    SELECT TOP 10 * FROM Northwind..Orders ORDER BY NEWID()

    附1:SQLServer和Oracle的常用函數(shù)對(duì)比

      1.絕對(duì)值

      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為底的對(duì)數(shù)

      S:select log(2.7182818284590451) value 1

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

      8.取10為底對(duì)數(shù)

      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.求任意數(shù)為底的冪

      S:select power(3,4) value 81

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

      12.取隨機(jī)數(shù)

      S:select rand() value

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

      13.取符號(hào)

      S:select sign(-8) value -1

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

      ----------數(shù)學(xué)函數(shù)

      14.圓周率

      S:SELECT PI() value 3.1415926535897931

      O:不知道

      15.sin,cos,tan 參數(shù)都以弧度為單位

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

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

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

      DEGREES:弧度-〉角度

      RADIANS:角度-〉弧度

      ---------數(shù)值間比較

      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

    --------數(shù)值間比較

      21.求字符序號(hào)

      S:select ascii('a') value

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

      22.從序號(hào)求字符

      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,參數(shù)去掉中間%則返回7

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

      O:oracle沒(méi)發(fā)現(xiàn),但是instr可以通過(guò)第四霾問(wèn) 刂瞥魷執(zhí)問(wèn)?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:沒(méi)發(fā)現(xiàn)

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

      27.長(zhǎng)度

      S:len,datalength

      O:length

      28.大小寫轉(zhuǎn)換 lower,upper

      29.單詞首字母大寫

      S:沒(méi)發(fā)現(xiàn)

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

      30.左補(bǔ)空格(LPAD的第一個(gè)參數(shù)為空格則同space函數(shù))

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

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

      31.右補(bǔ)空格(RPAD的第一個(gè)參數(shù)為空格則同space函數(shù))

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

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

      32.刪除空格

      S:ltrim,rtrim

      O:ltrim,rtrim,trim

      33. 重復(fù)字符串

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

      O:沒(méi)發(fā)現(xiàn)

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

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

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

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

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

      --------------日期函數(shù)

      35.系統(tǒng)時(shí)間

      S:select getdate() value

      O:select sysdate value from dual

      36.前后幾日

      直接與整數(shù)相加減

      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.求時(shí)間

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

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

      39.取日期時(shí)間的其他部分

      S:DATEPART 和 DATENAME 函數(shù) (第一個(gè)參數(shù)決定)

      O:to_char函數(shù) 第二個(gè)參數(shù)決定

    參數(shù)---------------------------------下表需要補(bǔ)充

      year yy, yyyy

      quarter qq, q (季度)

      month mm, m (m O無(wú)效)

      dayofyear dy, y (O表星期)

      day dd, d (d O無(wú)效)

      week wk, ww (wk O無(wú)效)

      weekday dw (O不清楚)

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

      minute mi, n (n O無(wú)效)

      second ss, s (s O無(wú)效)

      millisecond ms (O無(wú)效)

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

      40.當(dāng)月最后一天

      S:不知道

      O:select LAST_DAY(sysdate) value from dual

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

      S:不知道

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

      42.字符串轉(zhuǎn)時(shí)間

      S:可以直接轉(zhuǎn)或者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:直接用兩個(gè)日期相減(比如d1-d2=12.3)

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

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

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

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

      45.求不同時(shí)區(qū)時(shí)間

      S:不知道

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

      -----時(shí)區(qū)參數(shù),北京在東8區(qū)應(yīng)該是Ydt-------

      AST ADT 大西洋標(biāo)準(zhǔn)時(shí)間

      BST BDT 白令海標(biāo)準(zhǔn)時(shí)間

      CST CDT 中部標(biāo)準(zhǔn)時(shí)間

      EST EDT 東部標(biāo)準(zhǔn)時(shí)間

      GMT 格林尼治標(biāo)準(zhǔn)時(shí)間

      HST HDT 阿拉斯加—夏威夷標(biāo)準(zhǔn)時(shí)間

      MST MDT 山區(qū)標(biāo)準(zhǔn)時(shí)間

      NST 紐芬蘭標(biāo)準(zhǔn)時(shí)間

      PST PDT 太平洋標(biāo)準(zhǔn)時(shí)間

      YST YDT YUKON標(biāo)準(zhǔn)時(shí)間

    Oracle支持的字符函數(shù)和它們的Microsoft SQL Server等價(jià)函數(shù):

    函數(shù) Oracle Microsoft SQL Server

    把字符轉(zhuǎn)換為ASCII ASCII ASCII

    字串連接 CONCAT (expression + expression)

    把ASCII轉(zhuǎn)換為字符 CHR CHAR

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

    把字符轉(zhuǎn)換為小寫 LOWER LOWER

    把字符轉(zhuǎn)換為大寫 UPPER UPPER

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

    清除開始的空白 LTRIM LTRIM

    清除尾部的空白 RTRIM RTRIM

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

    多次重復(fù)字符串 RPAD REPLICATE

    字符串的語(yǔ)音表示 SOUNDEX SOUNDEX

    重復(fù)空格的字串 RPAD SPACE

    從數(shù)字?jǐn)?shù)據(jù)轉(zhuǎn)換為字符數(shù)據(jù) TO_CHAR STR

    子串 SUBSTR SUBSTRING

    替換字符 REPLACE STUFF

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

    翻譯字符串 TRANSLATE N/A

    字符串長(zhǎng)度 LENGTH DATELENGTH or LEN

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

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

    如果為NULL則轉(zhuǎn)換字串 NVL ISNULL

     

    日期函數(shù)

    函數(shù) Oracle Microsoft SQL Server

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

    ADD_MONTHS DATEADD

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

    MONTHS_BETWEEN DATEDIFF

    當(dāng)前日期和時(shí)間 SYSDATE GETDATE()

    一個(gè)月的最后一天 LAST_DAY N/A

    時(shí)區(qū)轉(zhuǎn)換 NEW_TIME N/A

    日期后的第一個(gè)周日 NEXT_DAY N/A

    代表日期的字符串 TO_CHAR DATENAME

    代表日期的整數(shù) TO_NUMBER

    (TO_CHAR)) DATEPART

    日期舍入 ROUND CONVERT

    日期截?cái)?TRUNC CONVERT

    字符串轉(zhuǎn)換為日期 TO_DATE CONVERT

    如果為NULL則轉(zhuǎn)換日期 NVL ISNULL

     

    轉(zhuǎn)換函數(shù)

    函數(shù) Oracle Microsoft SQL Server

    數(shù)字轉(zhuǎn)換為字符 TO_CHAR CONVERT

    字符轉(zhuǎn)換為數(shù)字 TO_NUMBER CONVERT

    日期轉(zhuǎn)換為字符 TO_CHAR CONVERT

    字符轉(zhuǎn)換為日期 TO_DATE CONVERT

    16進(jìn)制轉(zhuǎn)換為2進(jìn)制 HEX_TO_RAW CONVERT

    2進(jìn)制轉(zhuǎn)換為16進(jìn)制 RAW_TO_HEX CONVERT

     

    其它行級(jí)別的函數(shù)

    函數(shù) Oracle Microsoft SQL Server

    返回第一個(gè)非空表達(dá)式 DECODE COALESCE

    當(dāng)前序列值 CURRVAL N/A

    下一個(gè)序列值 NEXTVAL N/A

    如果exp1 = exp2, 返回null DECODE NULLIF

    用戶登錄賬號(hào)ID數(shù)字 UID SUSER_ID

    用戶登錄名 USER SUSER_NAME

    用戶數(shù)據(jù)庫(kù)ID數(shù)字 UID USER_ID

    用戶數(shù)據(jù)庫(kù)名 USER USER_NAME

    當(dāng)前用戶 CURRENT_USER CURRENT_USER

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

    在CONNECT BY子句中的級(jí)別 LEVEL N/A

     

    合計(jì)函數(shù)

    函數(shù) 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還有一個(gè)有用的函數(shù)EXTRACT,提取并且返回日期時(shí)間或時(shí)間間隔表達(dá)式中特定的時(shí)間域:

    EXTRACT(YEAR FROM 日期)

    T_SQL命令大全

    --語(yǔ) 句 功 能

    --數(shù)據(jù)操作

    SELECT --從數(shù)據(jù)庫(kù)表中檢索數(shù)據(jù)行和列

    INSERT --向數(shù)據(jù)庫(kù)表添加新數(shù)據(jù)行

    DELETE --從數(shù)據(jù)庫(kù)表中刪除數(shù)據(jù)行

    UPDATE --更新數(shù)據(jù)庫(kù)表中的數(shù)據(jù)

    --數(shù)據(jù)定義

    CREATE TABLE --創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)表

    DROP TABLE --從數(shù)據(jù)庫(kù)中刪除表

    ALTER TABLE --修改數(shù)據(jù)庫(kù)表結(jié)構(gòu)

    CREATE VIEW --創(chuàng)建一個(gè)視圖

    DROP VIEW --從數(shù)據(jù)庫(kù)中刪除視圖

    CREATE INDEX --為數(shù)據(jù)庫(kù)表創(chuàng)建一個(gè)索引

    DROP INDEX --從數(shù)據(jù)庫(kù)中刪除索引

    CREATE PROCEDURE --創(chuàng)建一個(gè)存儲(chǔ)過(guò)程

    DROP PROCEDURE --從數(shù)據(jù)庫(kù)中刪除存儲(chǔ)過(guò)程

    CREATE TRIGGER --創(chuàng)建一個(gè)觸發(fā)器

    DROP TRIGGER --從數(shù)據(jù)庫(kù)中刪除觸發(fā)器

    CREATE SCHEMA --向數(shù)據(jù)庫(kù)添加一個(gè)新模式

    DROP SCHEMA --從數(shù)據(jù)庫(kù)中刪除一個(gè)模式

    CREATE DOMAIN --創(chuàng)建一個(gè)數(shù)據(jù)值域

    ALTER DOMAIN --改變域定義

    DROP DOMAIN --從數(shù)據(jù)庫(kù)中刪除一個(gè)域

    --數(shù)據(jù)控制

    GRANT --授予用戶訪問(wèn)權(quán)限

    DENY --拒絕用戶訪問(wèn)

    REVOKE --解除用戶訪問(wèn)權(quán)限

    --事務(wù)控制

    COMMIT --結(jié)束當(dāng)前事務(wù)

    ROLLBACK --中止當(dāng)前事務(wù)

    SET TRANSACTION --定義當(dāng)前事務(wù)數(shù)據(jù)訪問(wèn)特征

    --程序化SQL

    DECLARE --為查詢?cè)O(shè)定游標(biāo)

    EXPLAN --為查詢描述數(shù)據(jù)訪問(wèn)計(jì)劃

    OPEN --檢索查詢結(jié)果打開一個(gè)游標(biāo)

    FETCH --檢索一行查詢結(jié)果

    CLOSE --關(guān)閉游標(biāo)

    PREPARE --為動(dòng)態(tài)執(zhí)行準(zhǔn)備SQL 語(yǔ)句

    EXECUTE --動(dòng)態(tài)地執(zhí)行SQL 語(yǔ)句

    DESCRIBE --描述準(zhǔn)備好的查詢

     

    ---局部變量

    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 小時(shí)2 分零3 秒后才執(zhí)行SELECT 語(yǔ)句

    waitfor delay ’01:02:03’

    select * from employee

    --例 等到晚上11 點(diǎn)零8 分后才執(zhí)行SELECT 語(yǔ)句

    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關(guān)鍵字的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列號(hào)

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

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

    --------- 除非能確保內(nèi)層select只返回一個(gè)行的值,

    --------- 否則應(yīng)在外層where子句中用一個(gè)in限定符

    select distinct column_name form table_name --------- distinct指定檢索獨(dú)有的列值,不重復(fù)

    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中沒(méi)有得以null表示

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

    select stockname from table1

    union [all] ----- union合并查詢結(jié)果集,all-保留重復(fù)行

    select stockname from table2

    --STDEV()

    --STDEV()函數(shù)返回表達(dá)式中所有數(shù)據(jù)的標(biāo)準(zhǔn)差

    --STDEVP()

    --STDEVP()函數(shù)返回總體標(biāo)準(zhǔn)差

    --VAR()

    --VAR()函數(shù)返回表達(dá)式中所有值的統(tǒng)計(jì)變異數(shù)

    --VARP()

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

    ----算術(shù)函數(shù)----

    /***三角函數(shù)***/

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

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

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

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

    /***反三角函數(shù)***/

    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)

    --把弧度轉(zhuǎn)換為角度返回與表達(dá)式相同的數(shù)據(jù)類型可為

    --INTEGER/MONEY/REAL/FLOAT 類型

    RADIANS(numeric_expression) --把角度轉(zhuǎn)換為弧度返回與表達(dá)式相同的數(shù)據(jù)類型可為

    --INTEGER/MONEY/REAL/FLOAT 類型

    EXP(float_expression) --返回表達(dá)式的指數(shù)值

    LOG(float_expression) --返回表達(dá)式的自然對(duì)數(shù)值

    LOG10(float_expression)--返回表達(dá)式的以10 為底的對(duì)數(shù)值

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

    /***取近似值函數(shù)***/

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

    --INTEGER/MONEY/REAL/FLOAT 類型

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

    --INTEGER/MONEY/REAL/FLOAT 類型

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

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

    ABS(numeric_expression) --返回表達(dá)式的絕對(duì)值返回的數(shù)據(jù)類型與表達(dá)式相同可為

    --INTEGER/MONEY/REAL/FLOAT 類型

    SIGN(numeric_expression) --測(cè)試參數(shù)的正負(fù)號(hào)返回0 零值1 正數(shù)或-1 負(fù)數(shù)返回的數(shù)據(jù)類型

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

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

    RAND([integer_expression]) --用任選的[integer_expression]做種子值得出0-1 間的隨機(jī)浮點(diǎn)數(shù)

    ----字符串函數(shù)----

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

    CHAR() --函數(shù)用于將ASCII 碼轉(zhuǎn)換為字符

    --如果沒(méi)有輸入0 ~ 255 之間的ASCII 碼值CHAR 函數(shù)會(huì)返回一個(gè)NULL 值

    LOWER() --函數(shù)把字符串全部轉(zhuǎn)換為小寫

    UPPER() --函數(shù)把字符串全部轉(zhuǎn)換為大寫

    STR() --函數(shù)把數(shù)值型數(shù)據(jù)轉(zhuǎn)換為字符型數(shù)據(jù)

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

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

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

    CHARINDEX(),PATINDEX() --函數(shù)返回字符串中某個(gè)指定的子串出現(xiàn)的開始位置

    SOUNDEX() --函數(shù)返回一個(gè)四位字符碼

    --SOUNDEX函數(shù)可用來(lái)查找聲音相似的字符串但SOUNDEX函數(shù)對(duì)數(shù)字和漢字均只返回0 值

    DIFFERENCE() --函數(shù)返回由SOUNDEX 函數(shù)返回的兩個(gè)字符表達(dá)式的值的差異

    --0 兩個(gè)SOUNDEX 函數(shù)返回值的第一個(gè)字符不同

    --1 兩個(gè)SOUNDEX 函數(shù)返回值的第一個(gè)字符相同

    --2 兩個(gè)SOUNDEX 函數(shù)返回值的第一二個(gè)字符相同

    --3 兩個(gè)SOUNDEX 函數(shù)返回值的第一二三個(gè)字符相同

    --4 兩個(gè)SOUNDEX 函數(shù)返回值完全相同

    QUOTENAME() --函數(shù)返回被特定字符括起來(lái)的字符串

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

    運(yùn)行結(jié)果如下

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

    {abc} [abc]*/

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

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

    運(yùn)行結(jié)果如下

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

    abcabcabc NULL*/

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

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

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

    運(yùn)行結(jié)果如下

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

    abcdefg*/

    SPACE() --函數(shù)返回一個(gè)有指定長(zhǎng)度的空白字符串

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

    ----數(shù)據(jù)類型轉(zhuǎn)換函數(shù)----

    CAST() 函數(shù)語(yǔ)法如下

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

    CONVERT() 函數(shù)語(yǔ)法如下

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

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

    運(yùn)行結(jié)果如下

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

    199 Jan 15 2000

    ----日期函數(shù)----

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

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

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

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

    --函數(shù)返回指定日期date 加上指定的額外日期間隔number 產(chǎn)生的新日期

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

    --函數(shù)返回兩個(gè)指定日期在datepart 方面的不同之處

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

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

    GETDATE() --函數(shù)以DATETIME 的缺省格式返回系統(tǒng)當(dāng)前的日期和時(shí)間

    ----系統(tǒng)函數(shù)----

    APP_NAME() --函數(shù)返回當(dāng)前執(zhí)行的應(yīng)用程序的名稱

    COALESCE() --函數(shù)返回眾多表達(dá)式中第一個(gè)非NULL 表達(dá)式的值

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

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

    DATALENGTH() --函數(shù)返回?cái)?shù)據(jù)表達(dá)式的數(shù)據(jù)的實(shí)際長(zhǎng)度

    DB_ID(['database_name']) --函數(shù)返回?cái)?shù)據(jù)庫(kù)的編號(hào)

    DB_NAME(database_id) --函數(shù)返回?cái)?shù)據(jù)庫(kù)的名稱

    HOST_ID() --函數(shù)返回服務(wù)器端計(jì)算機(jī)的名稱

    HOST_NAME() --函數(shù)返回服務(wù)器端計(jì)算機(jī)的名稱

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

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

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

    into newtable

    from oldtable*/

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

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

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

    NEWID() --函數(shù)返回一個(gè)UNIQUEIDENTIFIER 類型的數(shù)值

    NULLIF(<expression1>, <expression2> )

    --NULLIF 函數(shù)在expression1 與expression2 相等時(shí)返回NULL 值若不相等時(shí)則返回expression1 的值

    附2:時(shí)間轉(zhuǎn)換函數(shù)
    convert(char,date,N)輸出的各中樣式
    convert(varchar(10),字段名,轉(zhuǎn)換格式)
    例:
    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) | 評(píng)論 (0)編輯 收藏

    主站蜘蛛池模板: 亚洲精品无码av片| 女人张开腿给人桶免费视频| 亚洲国产高清国产拍精品| 亚洲AV无码AV男人的天堂| 四虎免费久久影院| 一二三四影视在线看片免费| 无码人妻精品中文字幕免费| 成年网在线观看免费观看网址| 2021精品国产品免费观看| 九九免费久久这里有精品23| 亚洲精品无码高潮喷水A片软| 国内免费高清在线观看| 3344在线看片免费| 国产精品hd免费观看| 免费福利在线观看| 亚洲日本一线产区和二线产区对比 | 国产午夜无码片免费| 污污视频免费观看网站| 亚洲一线产区二线产区区| 337p日本欧洲亚洲大胆精品555588| 8x成人永久免费视频| 亚洲av无码成人影院一区| 在线观看亚洲AV日韩AV| 亚洲美女免费视频| 亚洲视频国产精品| 久久亚洲中文字幕精品有坂深雪| 四虎成人免费网址在线| 最新中文字幕电影免费观看| 很黄很色很刺激的视频免费| 国产精品色拉拉免费看| 人与禽交免费网站视频| 精品福利一区二区三区免费视频 | 一区二区三区视频免费| 欧美亚洲国产SUV| 成人亚洲国产精品久久| 黄色一级免费网站| 亚洲免费一区二区| 免费无码黄网站在线看| 中文字幕无码免费久久| 久久午夜羞羞影院免费观看| 4444www免费看|