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

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

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

    posts - 495,  comments - 11,  trackbacks - 0
     

    > 引言
      在Jorm中,主鍵的生成策略主要有AUTO、UUID、GUID、FOREIGN、SEQUENCE、INCREMENT、IDENTITY、ASSIGNED,下面分別來講述這幾種策略的應(yīng)用場景

    > GenerationType.AUTO
      Jorm的默認(rèn)主鍵策略,自動增長型,自增步長為1,適用數(shù)據(jù)類型int,long,如:
      private int id // 默認(rèn)策略就是AUTO,故可以不寫主鍵策略
      或
      @Id(GenerationType.AUTO) // 默認(rèn)策略可以省去不寫的哦~
      private int id

    > GenerationType.INCREMENT
      顧名思義,增長型,適用數(shù)據(jù)類型int,long。自增步長為1
      1> 使用默認(rèn)自增步長1,如:
         @Id(GenerationType.INCREMENT)
         @Column("item_id")
         private long id;
      2> 使用自定義步長,如:
         @Id(value = GenerationType.INCREMENT, incrementBy=3) // 這里自增步長為3,注意寫法
         private int id;

    > GenerationType.IDENTITY
      對于那些實現(xiàn)了自動增長的數(shù)據(jù)庫,可以使用IDENTITY,如MySQL,SQL Server,PostreSQL,前提是
      MySQL數(shù)據(jù)庫中建表語句定義了主鍵為:id(你的主鍵列名) int NOT NULL AUTO_INCREMENT 或
                                                                          
    id(你的主鍵列名) bigint NOT NULL AUTO_INCREMENT
      SQL Server數(shù)據(jù)庫中建表語句定義了主鍵為:id int identity(xx, xx) 如此類似
      PostreSQL數(shù)據(jù)庫中建表語句定義了主鍵為:id bigserial  或  id serial
      使用例子
      @Id(GenerationType.IDENTITY)
      @Column("id")
      private long sid;

    > GenerationType.UUID
      與數(shù)據(jù)庫無關(guān)的策略,適用數(shù)據(jù)類型:字符串類型,適用所有數(shù)據(jù)庫,長度須大于或等于32
      @Id(GenerationType.UUID)
      private String id;

    > GenerationType.GUID
      與UUID有點類似,不過這個id值是又?jǐn)?shù)據(jù)庫來生成的,適用于數(shù)據(jù)庫MySQL、PostgreSQL、SQL Server、Oracle等
      @Id(GenerationType.GUID)
      private String id;

    > GenerationType.FOREIGN
      適用于一對一關(guān)系中引用了另一個對象的主鍵作為自己的主鍵的情形,如:
      @Id(GenerationType.FOREIGN)
      @Column("identity_number")
      private String identity;

    > GenerationType.SEQUENCE
      這個不用多說,應(yīng)用于Oracle、H2、PostgreSQL等有sequence序列功能的數(shù)據(jù)庫

    > GenerationType.ASSIGNED
      用戶自定義生成,需要由程序員手工給主鍵主動賦值

     

    項目地址:http://javaclub.sourceforge.net/jorm.html
    下載地址:http://sourceforge.net/projects/javaclub/files/jorm/


    posted @ 2011-10-10 15:17 jadmin 閱讀(1493) | 評論 (3)編輯 收藏

    直接上代碼吧:

    > Demo one
    public void batch_op_one() {

        session = Jorm.getSession();
        JdbcBatcher batcher = session.createBatcher();
        batcher.addBatch("delete from t_id_auto");
        batcher.addBatch("delete from t_incre");
        batcher.addBatch("delete from t_user");
        batcher.execute();
       
        session.beginTransaction();
        long start;
        try {
            start = System.currentTimeMillis();
            String sql = "INSERT INTO t_user(sex,age,career,name,id) VALUES(?,?,?,?,?)";
            for (int i = 0; i < 100000; i++) {
                batcher.addBatch(sql, new Object[] {"男", Numbers.random(98), Strings.random(10), Strings.fixed(6), (i+1) });}
                String sqlx = "INSERT INTO t_id_auto(name, id) VALUES(?, ?)";
                for (int i = 0; i < 100000; i++) {
                    batcher.addBatch(sqlx, new Object[] {Strings.fixed(6), (i+1)});
                    if(i > 200) {
                        //Integer.parseInt("kkk");
                    }
                }
                batcher.execute();   
                System.out.println(System.currentTimeMillis() - start);
        } catch (Exception e) {
            session.rollback();
        } finally {
            session.endTransaction();
            session.close();
        }
    }

    > Demo two
    public void batch_op_two() {

        session = Jorm.getSession();
        session.beginTransaction();
        session.clean(User.class);
        JdbcBatcher batcher = session.createBatcher();
        batcher.setBatchSize(500);// 指定每批處理的記錄數(shù)
       
        User u;
        int times = 20 * 100;
        long start = System.currentTimeMillis();
        for(int i = 0; i < times; i++) {
         String sex = (i % 2 == 0 ? "男" : "女");
         u = new User(Strings.fixed(6), sex, Numbers.random(100), Strings.random(16));
         batcher.save(u);
        }
        batcher.execute();
        session.endTransaction();
        long cost = (System.currentTimeMillis() - start);
        System.out.println("Total:" + cost);
        System.out.println("Each:" + (float) cost / times);
        session.close();
    }

    項目地址:http://javaclub.sourceforge.net/jorm.html
    下載地址: http://sourceforge.net/projects/javaclub/files/jorm/

    posted @ 2011-10-09 20:09 jadmin 閱讀(1294) | 評論 (0)編輯 收藏
    關(guān)系數(shù)據(jù)庫不支持繼承,我們可以做如下的映射,這些映射都是犧牲關(guān)系模式的范式基礎(chǔ)的
    ?
    1, ?用一個表包含所有繼承層次的所有字段,然后標(biāo)識列來標(biāo)示是哪個類。這種映射方法最簡單,但是是違反規(guī)范化的,而且有些字段要強制為NULL值,無法保證關(guān)系數(shù)據(jù)模型的數(shù)據(jù)完整性,這種映射方式性能最高,最簡單。
    ?
    2, ?每個具體類一張表(意思就是父類不需要表),所有父屬性在具體類表中重復(fù),這種映射如果要查詢父類要全部掃描子類表,而且一旦父類變化,這些字表要全部變化。
    ?
    3, ?每個類一張表,表里只包含所屬類的屬性,然后子類和父類共享外鍵,這種映射避免了第2種的可怕的修改,但是查詢的時候要執(zhí)行連接。
    posted @ 2011-09-27 09:38 jadmin 閱讀(202) | 評論 (0)編輯 收藏

    ??????在一般情況下,在新增領(lǐng)域?qū)ο蠛螅夹枰@取對應(yīng)的主鍵值。使用應(yīng)用層來維護主鍵,在一定程度上有利于程序性能的優(yōu)化和應(yīng)用移植性的提高。在采用數(shù)據(jù)庫自增主鍵的方案里,如果JDBC驅(qū)動不能綁定新增記錄對應(yīng)的主鍵,就需要手工執(zhí)行查詢語句以獲取對應(yīng)的主鍵值,對于高并發(fā)的系統(tǒng),這很容易返回錯誤的主鍵。通過帶緩存的DataFieldMaxValueIncrementer,可以一次獲取批量的主鍵值,供多次插入領(lǐng)域?qū)ο髸r使用,它的執(zhí)行性能是很高的。

    ??????我們經(jīng)常使用數(shù)據(jù)的自增字段作為表主鍵,也即主鍵值不在應(yīng)用層產(chǎn)生,而是在新增記錄時,由數(shù)據(jù)庫產(chǎn)生。這樣,應(yīng)用層在保存對象前并不知道對象主鍵值,而必須在保存數(shù)據(jù)后才能從數(shù)據(jù)庫中返回主鍵值。在很多情況下,我們需要獲取新對象持久化后的主鍵值。在Hibernate等ORM框架,新對象持久化后,Hibernate會自動將主鍵值綁定到對象上,給程序的開發(fā)帶來了很多方便。?

    ??????在JDBC 3.0規(guī)范中,當(dāng)新增記錄時,允許將數(shù)據(jù)庫自動產(chǎn)生的主鍵值綁定到Statement或PreparedStatement中。

    ??????使用Statement時,可以通過以下方法綁定主鍵值:?int executeUpdate(String sql, int autoGeneratedKeys)?

    ??????也可以通過Connection創(chuàng)建綁定自增值的PreparedStatement:?PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)?

    ??????當(dāng)autoGeneratedKeys參數(shù)設(shè)置為Statement.RETURN_GENERATED_KEYS值時即可綁定數(shù)據(jù)庫產(chǎn)生的主鍵值,設(shè)置為Statement.NO_GENERATED_KEYS時,不綁定主鍵值。下面的代碼演示了Statement綁定并獲取數(shù)據(jù)庫產(chǎn)生的主鍵值的過程:

    ????? Statement stmt = conn.createStatement();
    ????? String sql = "INSERT INTO t_topic(topic_title,user_id) VALUES(‘測試主題’,’123’)";
    ????? stmt.executeUpdate(sql,Statement.RETURN_GENERATED_KEYS); // ①指定綁定表自增主鍵值
    ????? ResultSet rs = stmt.getGeneratedKeys();
    ????? if( rs.next() ) {
    ?????????? intkey = rs.getInt(); // ②獲取對應(yīng)的表自增主鍵值
    ????? }

    ??????Spring利用這一技術(shù),提供了一個可以返回新增記錄對應(yīng)主鍵值的方法:?int update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder)?,其中第二個參數(shù)類型org.springframework.jdbc.support.KeyHolder,它是一個回調(diào)接口,Spring使用它保存新增記錄對應(yīng)的主鍵,該接口的接口方法描述如下:?

    ??????Number getKey() throws InvalidDataAccessApiUsageException;

    ??????當(dāng)僅插入一行數(shù)據(jù),主鍵不是復(fù)合鍵且是數(shù)字類型時,通過該方法可以直接返回新的主鍵值。如果是復(fù)合主鍵,或者有多個主鍵返回時,該方法拋出 InvalidDataAccessApiUsageException。該方法是最常用的方法,因為一般情況下,我們一次僅插入一條數(shù)據(jù)并且主鍵字段類型為數(shù)字類型;?

    ??????如果是復(fù)合主鍵,則列名和列值構(gòu)成Map中的一個Entry。如果返回的是多個主鍵,則拋出InvalidDataAccessApiUsageException異常;?

    ??????Map getKeys() throws InvalidDataAccessApiUsageException;

    ??????如果返回多個主鍵,即PreparedStatement新增了多條記錄,則每一個主鍵對應(yīng)一個Map,多個Map構(gòu)成一個List。

    ??????List getKeyList():?

    ??????Spring為KeyHolder接口指代了一個通用的實現(xiàn)類GeneratedKeyHolder,該類返回新增記錄時的自增長主鍵值。假設(shè)我們希望在新增論壇板塊對象后,希望將主鍵值加載到對象中,則可以按以下代碼進行調(diào)整:

    ????? public voidaddForum(final Forum forum) {
    ??????????? final String sql = "INSERT INTO t_forum(forum_name,forum_desc) VALUES(?,?)";
    ??????????? KeyHolder keyHolder = newGeneratedKeyHolder(); // ①創(chuàng)建一個主鍵執(zhí)有者
    ??????????? getJdbcTemplate().update(newPreparedStatementCreator() {
    ????????????????? public PreparedStatement createPreparedStatement(Connection conn) throws SQLException {
    ??????????????????????? PreparedStatement ps = conn.prepareStatement(sql);
    ??????????????????????? ps.setString(1, forum.getForumName());
    ??????????????????????? ps.setString(2, forum.getForumDesc());
    ??????????????????????? returnps;
    ????????????????? }
    ??????????? }, keyHolder);
    ??????????? forum.setForumId(keyHolder.getKey().intValue()); // ②從主鍵執(zhí)有者中獲取主鍵
    ????? }

    ??????這樣,在調(diào)用addForum(Forum forum)新增forum領(lǐng)域?qū)ο蠛螅琭orum將擁有對應(yīng)的主鍵值,方便后繼的使用。在JDBC 3.0之前的版本中,PreparedStatement不能綁定主鍵,如果采用表自增鍵(如MySQL的auto increment或SQLServer的identity)將給獲取正確的主鍵值帶來挑戰(zhàn)——因為你必須在插入數(shù)據(jù)后,馬上執(zhí)行另一條獲取新增主鍵的查詢語句。下面給出了不同數(shù)據(jù)庫獲取最新自增主鍵值的查詢語句:?

    posted @ 2011-09-25 14:27 jadmin 閱讀(992) | 評論 (0)編輯 收藏

    1) Assigned
    主鍵由外部程序負(fù)責(zé)生成,無需Hibernate參與。


    2) hilo
    通過hi/lo 算法實現(xiàn)的主鍵生成機制,需要額外的數(shù)據(jù)庫表保存主鍵生成歷史狀態(tài)。


    3) seqhilo
    與hilo 類似,通過hi/lo 算法實現(xiàn)的主鍵生成機制,只是主鍵歷史狀態(tài)保存在Sequence中,適用于支持Sequence的數(shù)據(jù)庫,如Oracle。


    4) increment
    主鍵按數(shù)值順序遞增。此方式的實現(xiàn)機制為在當(dāng)前應(yīng)用實例中維持一個變量,以保存著當(dāng)前的最大值,之后每次需要生成主鍵的時候?qū)⒋酥导?作為主鍵。 這種方式可能產(chǎn)生的問題是:如果當(dāng)前有多個實例訪問同一個數(shù)據(jù)庫,那么由于各個實例各自維護主鍵狀態(tài),不同實例可能生成同樣的主鍵,從而造成主鍵重復(fù)異常。因此,如果同一數(shù)據(jù)庫有多個實例訪問,此方式必須避免使用。


    5) identity
    采用數(shù)據(jù)庫提供的主鍵生成機制。如DB2、SQL Server、MySQL中的主鍵生成機制。


    6) sequence
    采用數(shù)據(jù)庫提供的sequence 機制生成主鍵。如Oralce 中的Sequence。


    7) native
    由Hibernate根據(jù)底層數(shù)據(jù)庫自行判斷采用identity、hilo、sequence其中一種作為主鍵生成方式。


    8) uuid.hex
    由Hibernate基于128 位唯一值產(chǎn)生算法生成16 進制數(shù)值(編碼后以長度32 的字符串表示)作為主鍵。


    9) uuid.string
    與uuid.hex 類似,只是生成的主鍵未進行編碼(長度16)。在某些數(shù)據(jù)庫中可能出現(xiàn)問題(如PostgreSQL)。


    10) foreign
    使用外部表的字段作為主鍵。一般而言,利用uuid.hex方式生成主鍵將提供最好的性能和數(shù)據(jù)庫平臺適應(yīng)性。
    另外由于常用的數(shù)據(jù)庫,如Oracle、DB2、SQLServer、MySql 等,都提供了易用的主鍵生成機制(Auto-Increase 字段或者Sequence)。我們可以在數(shù)據(jù)庫提供的主鍵生成機制上,采用generator-class=native的主鍵生成方式。不過值得注意的是,一些數(shù)據(jù)庫提供的主鍵生成機制在效率上未必最佳,


    大量并發(fā)insert數(shù)據(jù)時可能會引起表之間的互鎖。數(shù)據(jù)庫提供的主鍵生成機制,往往是通過在一個內(nèi)部表中保存當(dāng)前主鍵狀態(tài)(如對于自增型主鍵而言,此內(nèi)部表中就維護著當(dāng)前的最大值和遞增量), 之后每次插入數(shù)據(jù)會讀取這個最大值,然后加上遞增量作為新記錄的主鍵,之后再把這個新的最大值更新回內(nèi)部表中,這樣,一次Insert操作可能導(dǎo)致數(shù)據(jù)庫內(nèi)部多次表讀寫操作,同時伴隨的還有數(shù)據(jù)的加鎖解鎖操作,這對性能產(chǎn)生了較大影響。 因此,對于并發(fā)Insert要求較高的系統(tǒng),推薦采用uuid.hex 作為主鍵生成機制。


    如果需要采用定制的主鍵生成算法,則在此處配置主鍵生成器,主鍵生成器須實現(xiàn)org.hibernate.id.IdentifierGenerator 接口

    ?

    關(guān)鍵詞: Hibernate? 主鍵?? 主鍵生成方式? IdentifierGenerator

    ?

    posted @ 2011-09-25 13:47 jadmin 閱讀(1007) | 評論 (0)編輯 收藏
         摘要:   閱讀全文
    posted @ 2011-09-23 16:17 jadmin 閱讀(1274) | 評論 (1)編輯 收藏

    http://www.oschina.net/news/21642/jdbc-orm-framework-1-0-6

    主要更新:
    ----------------------------------------
     * [35] fix: oracle下一個分頁取limit數(shù)錯誤的bug.
     * [34] fix: oracle下檢測是否支持Savepoints時,一個未捕獲的異常.
     * [33] add: 對bonecp的支持
     * [32] add: 對proxool的支持
     * [31] add: 對commons-dbcp的支持
     * [30] fix: classpath沒有config.properties文件會報錯


    posted @ 2011-09-23 10:53 jadmin 閱讀(201) | 評論 (0)編輯 收藏
    > 引言
    有時候我們有這樣的需求,對象有一個屬性可能有多個值,需要在數(shù)據(jù)庫中作為一個字段存儲

    還是以User為例,career存儲多個職業(yè)

    > 建表
    以MySQL為例,執(zhí)行下面的sql建立數(shù)據(jù)表
    CREATE TABLE `t_user` (                
            `id` int(11) NOT NULL,               
            `name` varchar(50) DEFAULT NULL,     
            `sex` char(4) DEFAULT NULL,          
            `age` int(11) DEFAULT NULL,          
            `career` varchar(100) DEFAULT NULL,  
            PRIMARY KEY (`id`)                   
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    > 代碼
    實體類 User.java
    @Entity(table = "t_user")
    @PK(value 
    = "id")
    public class User implements Serializable {

        
    /** desc */
        
    private static final long serialVersionUID = -4750351638245912867L;

        @Id
        
    private int id;

        
    private String name;

        
    private String sex;

        
    private Integer age;

        @Basic(processor
    =DefinedFieldProcessor.class)
        
    private String[] career;

        @NoColumn
        
    private int kvalue;

        
    public JawaUser() {
            
    super();
        }

        
    public JawaUser(String name, String sex, Integer age, String[] career) {
            
    super();
            
    this.name = name;
            
    this.sex = sex;
            
    this.age = age;
            
    this.career = career;
        }

        
    public int getId() {
            
    return id;
        }

        
    public void setId(int id) {
            
    this.id = id;
        }

        
    public String getName() {
            
    return name;
        }

        
    public void setName(String name) {
            
    this.name = name;
        }

        
    public String getSex() {
            
    return sex;
        }

        
    public void setSex(String sex) {
            
    this.sex = sex;
        }

        
    public Integer getAge() {
            
    return age;
        }

        
    public void setAge(Integer age) {
            
    this.age = age;
        }

        
    public String[] getCareer() {
            
    return career;
        }

        
    public void setCareer(String[] career) {
            
    this.career = career;
        }

        
    public int getKvalue() {
            
    return kvalue;
        }

        
    public void setKvalue(int kvalue) {
            
    this.kvalue = kvalue;
        }

        
    public String toString() {
            
    return "User [age=" + age + ", career=" + Arrays.toString(career)
                    
    + ", id=" + id + ", kvalue=" + kvalue + ", name=" + name
                    
    + ", sex=" + sex + "]";
        }
    }
    屬性字段處理類 DefinedFieldProcessor.java

    import java.lang.reflect.Field;
    import java.sql.ResultSet;
    import java.sql.SQLException;

    import org.javaclub.jorm.Session;
    import org.javaclub.jorm.common.CommonUtil;
    import org.javaclub.jorm.common.Reflections;
    import org.javaclub.jorm.jdbc.process.FieldProcessor;

    public
     class DefinedFieldProcessor implements FieldProcessor {

        
    public Object insert(Session session, Object entity, Field field) {
            String[] crs 
    = (String[]) Reflections.getFieldValue(entity, field);
            
    if(!CommonUtil.isEmpty(crs)) {
                StringBuilder sbf 
    = new StringBuilder();
                
    for (int i = 0; i < crs.length; i++) {
                    
    if(i > 0) {
                        sbf.append(
    ",");
                    }
                    sbf.append(crs[i]);
                }
                
    return sbf.toString();
            }
            
    return "";
        }

        
    public void load(Session session, Object entity, Field field, ResultSet rs,
                
    int idx) throws SQLException {
            String str 
    = rs.getString(idx);
            String[] crs 
    = str.split(",");
            Reflections.setFieldValue(entity, field, crs);
        }

    }

    > 測試

    import org.javaclub.jorm.Jorm;
    import org.javaclub.jorm.Session;
    import org.javaclub.jorm.common.Numbers;
    import org.javaclub.jorm.common.Strings;
    import org.junit.AfterClass;
    import org.junit.BeforeClass;
    import org.junit.Test;

    public
     class FieldProcessorTest {

        
    static Session session;

        @BeforeClass
        
    public static void setUpBeforeClass() {
            session 
    = Jorm.getSession();
        }

        @AfterClass
        
    public static void destroy() {
            Jorm.free();
        }

        @Test
        
    public void test_save() {

            session.clean(User.
    class);
            User u;
            
    for (int i = 0; i < 100; i++) {
                String sex 
    = (i % 2 == 0 ? "" : "");
                String[] cr 
    = {};
                
    if(i % 3 == 0) {
                    cr 
    = new String[] {Strings.fixed(2), Strings.random(5), Strings.fixed(6)};
                } 
    else if(i % 3 == 1) {
                    cr 
    = new String[] {Strings.fixed(2), Strings.random(5)};
                } 
    else {
                    cr 
    = new String[] {Strings.fixed(2)};
                }
                u 
    = new User(Strings.fixed(6), sex, Numbers.random(100), cr);
                session.save(u);
            }

            
    for (int i = 0; i < 10; i++) {
                u 
    = session.read(User.class, i + 1);
                System.out.println(u);
            }
        }
    }
    posted @ 2011-09-22 20:16 jadmin 閱讀(1218) | 評論 (0)編輯 收藏

    > 準(zhǔn)備
    以MySQL為例,執(zhí)行下面的sql建立數(shù)據(jù)表
    CREATE TABLE `t_user` (                
            `id` int(11) NOT NULL,               
            `name` varchar(50) DEFAULT NULL,     
            `sex` char(4) DEFAULT NULL,          
            `age` int(11) DEFAULT NULL,          
            `career` varchar(100) DEFAULT NULL,  
            PRIMARY KEY (`id`)                   
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    > 引入jar或maven依賴,需要jar包
    gerald-jorm-1.0.5.jar 最新版本下載:http://sourceforge.net/projects/javaclub/files
    commons-logging-1.1.1.jar
    log4j-1.2.14.jar
    mysql-connector-java-5.1.6.jar
    javassist-3.11.0.GA.jar 或 cglib-nodep-2.2.2.jar (根據(jù)實際情況選擇性加入)


    > 配置文件
    在你的java工程的classpath下建立config.properties和jdbc.cfg.xml文件
    config.properties內(nèi)容:
    # 下面路徑可以根據(jù)實際情況指定,為相對classpath的路徑地址
    jdbc.config.path=jdbc.cfg.xml

    jdbc.cfg.xml內(nèi)容:
    <?xml version='1.0' encoding="UTF-8"?>
    <jdbc-configuration>

      <constant name="show_sql" value="true" />
      <constant name="jdbc.batch_size" value="600" />
      <constant name="bytecode.provider" value="cglib" />
     
      <connections default="simple">
     
        <connection name="simple">
          <property name="connection.implementation">org.javaclub.jorm.jdbc.connection.impl.SimpleConnection</property>
          <property name="connection.dialect">MySQLDialect</property>
          <property name="connection.driver">com.mysql.jdbc.Driver</property>
          <property name="connection.jdbcurl">jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&amp;characterEncoding=UTF-8</property>
          <property name="connection.database">test</property>
          <property name="connection.username">root</property>
          <property name="connection.password">root</property>
        </connection>

        <connection name="c3p0">
          <property name="connection.implementation">org.javaclub.jorm.jdbc.connection.impl.PooledConnection</property>
          <property name="connection.dialect">MySQLDialect</property>
          <property name="connection.driver">com.mysql.jdbc.Driver</property>
          <property name="connection.jdbcurl">jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&amp;characterEncoding=UTF-8</property>
          <property name="connection.database">test</property>
          <property name="connection.username">root</property>
          <property name="connection.password">root</property>
          <property name="connection.pool.min">1</property>
          <property name="connection.pool.max">8</property>
          <property name="connection.test.sql">select 1</property>
        </connection>
        
      </connections>

    </jdbc-configuration>


    > 實體類User.java
    @PK(value = "id")
    @Entity(table="t_user")
    public class User {
        
        @Id
        private int id;

        private String name;

        private String sex;

        private Integer age;

        private String career;
        
        @NoColumn
        private int kvalue;
        
        public User() {
            super();
        }

        public User(String name, String sex, Integer age, String career) {
            super();
            this.name = name;
            this.sex = sex;
            this.age = age;
            this.career = career;
        }

        public User(Integer id, String name, String sex, Integer age, String career) {
            super();
            this.id = id;
            this.name = name;
            this.sex = sex;
            this.age = age;
            this.career = career;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getSex() {
            return sex;
        }

        public void setSex(String sex) {
            this.sex = sex;
        }

        public Integer getAge() {
            return age;
        }

        public void setAge(Integer age) {
            this.age = age;
        }

        public String getCareer() {
            return career;
        }

        public void setCareer(String career) {
            this.career = career;
        }

        public int getKvalue() {
            return kvalue;
        }

        public void setKvalue(int kvalue) {
            this.kvalue = kvalue;
        }

        public String toString() {
            StringBuffer sb = new StringBuffer();
            sb.append("[" + id + ", " + name + ", " + sex + ", " + age + ", " + career + "]");
            return sb.toString();
        }

    }

    這里數(shù)據(jù)庫字段和java實體類User的屬性在命名上是一致的,如果不一致,比如如果表創(chuàng)建sql為:
    CREATE TABLE `t_user` (                
            `user_id` int(11) NOT NULL,               
            `user_name` varchar(50) DEFAULT NULL,     
            `sex` char(4) DEFAULT NULL,          
            `col_age` int(11) DEFAULT NULL,          
            `career_job` varchar(100) DEFAULT NULL,  
            PRIMARY KEY (`id`)                   
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    那么對應(yīng)的實體User應(yīng)該寫成:
    @PK(value = "id")
    @Entity(table="t_user")
    public class User {
        
        @Id
        @Column("user_id")
        private int id;

        @Column("user_name")
        private String name;
            
        // 與數(shù)據(jù)庫字段命名一致,可以不指定@Column
        private String sex;

        @Column("col_age")
        private Integer age;

        @Column("career_job")
        private String career;
        
        @NoColumn
        private int kvalue;
        
        public User() {
            super();
        }

        public User(String name, String sex, Integer age, String career) {
            super();
            this.name = name;
            this.sex = sex;
            this.age = age;
            this.career = career;
        }

        public User(Integer id, String name, String sex, Integer age, String career) {
            super();
            this.id = id;
            this.name = name;
            this.sex = sex;
            this.age = age;
            this.career = career;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getSex() {
            return sex;
        }

        public void setSex(String sex) {
            this.sex = sex;
        }

        public Integer getAge() {
            return age;
        }

        public void setAge(Integer age) {
            this.age = age;
        }

        public String getCareer() {
            return career;
        }

        public void setCareer(String career) {
            this.career = career;
        }

        public int getKvalue() {
            return kvalue;
        }

        public void setKvalue(int kvalue) {
            this.kvalue = kvalue;
        }

        public String toString() {
            StringBuffer sb = new StringBuffer();
            sb.append("[" + id + ", " + name + ", " + sex + ", " + age + ", " + career + "]");
            return sb.toString();
        }

    }


    > 對User的增刪查改,UserCrudTest.java,記得引入junit-4.8.2.jar
    public class UserCrudTest {

        static Session session;
        
        @BeforeClass
        public static void before() {
            session = Jorm.getSession();
        }
        
        @AfterClass
        public static void after() {
            Jorm.free();
        }
        
        @Test
        public void save_user() {
            session.clean(User.class);
            User user = null;
            for (int i = 0; i < 600; i++) {
                String sex = (i % 2 == 0 ? "男" : "女");
                user = new User(Strings.fixed(5), sex, Numbers.random(98), Strings.random(8));
                session.save(user);
            }
        }
        
        @Test // 批量保存
        public void batch_save_user() {
            session.clean(User.class);
            JdbcBatcher batcher = session.createBatcher();
            User user = null;
            for (int i = 0; i < 600; i++) {
                String sex = (i % 2 == 0 ? "男" : "女");
                user = new User(Strings.fixed(5), sex, Numbers.random(98), Strings.random(8));
                batcher.save(user);
            }
            batcher.execute();
        }
        
        @Test
        public void loadUser() {
            User user = session.read(User.class, 1);
            // 這里user是一個代理對象,因為@Entity(table="t_user", lazy = true)
            System.out.println(user.getCareer());// 發(fā)出查詢sql
        }
        
        @Test
        public void deletUser() {
            User user = session.read(User.class, 1);
            if(null != user) {
                session.delete(user);
            }
            user = session.read(User.class, 1);
            System.out.println(user);
        }
        
        @Test
        public void test_update_proxy() {
            
            User u;
            u = session.read(User.class, 2);
            Assert.assertNotNull(u);
            Assert.assertTrue(u instanceof JormProxy);
            
            u.setName("Gerald.Chen");
            session.update(u);
            System.out.println(u.getName());
            u = session.read(User.class, 2);
            Assert.assertTrue("Gerald.Chen".equals(u.getName()));
        }
        
        @Test
        public void queryUser() {
            SqlParams<User> params = new SqlParams<User>();
            params.setObjectClass(User.class);
            params.setFirstResult(8);
            params.setMaxResults(20);
            List<User> users = session.list(params);
            System.out.println(users.size());
            System.out.println(users);
        }
        
    }

    posted @ 2011-09-21 18:42 jadmin 閱讀(1414) | 評論 (5)編輯 收藏

    > 特點
      1.支持多數(shù)據(jù)源管理和配置
      2.自動封裝Entity
      3.支持事務(wù)
      4.支持存儲過程的方便調(diào)用
      5.支持lazy加載
      6.支持分頁查詢
      7.支持多種數(shù)據(jù)庫H2,MySQL,Oracle,PostgrSQL,SQLServer

    > 要求
      1.JDK 1.5 or later
      2.如需要lazy加載,需要引入cglib或javaassit,具體可配置

    > 示例
      1.添加
      Session session = Jorm.getSession();
      User u = new User("Gerald.Chen", "男", 21, "job");;
      session.save(u);

      2.刪除
      session.clean(User.class);// 清空表
      session.delete(User.class, "id > 100");// 指定條件刪除

      session.delete(user);

      3.查詢
      User user = session.read(User.class, 1);// 根據(jù)主鍵加載

      // 加載第一個
      User user = session.loadFirst(User.class, "(SELECT * FROM t_user WHERE id > ?)", 88);

      // 分頁查詢
      SqlParams<User> params = new SqlParams<User>("SELECT * FROM t_user WHERE id > ?", new Object[] { 6 });
      params.setObjectClass(User.class);
      params.setFirstResult(3);
      params.setMaxResults(10);
      List<User> users = session.list(params);

      // 查詢單個屬性
      String sql = "SELECT name FROM t_user WHERE id = 28";
      String name = session.queryUniqueObject(sql);

      // 查詢屬性列表
      List<String> names = session.list(String.class, "SELECT name FROM t_user WHERE id > ?", 200);
      List<Integer> ages = session.list(int.class, "SELECT age FROM t_user WHERE age > 18");

      4.存儲過程
      final String pro = "{? = call hello_proc(?)}";
      String r = session.call(new ProcedureCaller() {
                
         public CallableStatement prepare() throws SQLException {
        CallableStatement cs = this.getSession().getConnection().prepareCall(pro);
        cs.setString(2, "World");
        cs.registerOutParameter(1, Types.CHAR);
        return cs;
         }
                
         public String callback(CallableStatement cs) throws SQLException {
        cs.execute();
        return cs.getString(1);
         }
      });

      5.事務(wù)
      session.clean(User.class);
      User u;
      session.beginTransaction();
      try {
        for(int i = 0; i < 1000; i++) {
            String sex = (i % 2 == 0 ? "男" : "女");
            u = new User(Strings.fixed(6), sex, Numbers.random(100), Strings.random(16));
            session.save(u);
            if(i == 886) {
                Integer.parseInt("kkk");
            }
        }
        session.commit();
      } catch (Exception e) {
        session.rollback();
      } finally {
        session.endTransaction();
      }

    這是一個完全基于JDBC的輕量java orm framework, 目標(biāo)定位于使用方便,簡單,后續(xù)會增加許多新的特性


     

    項目地址:http://javaclub.sourceforge.net/jorm.html

    下載地址:http://sourceforge.net/projects/javaclub/files

     

    posted @ 2011-09-20 18:52 jadmin 閱讀(261) | 評論 (0)編輯 收藏
    僅列出標(biāo)題
    共50頁: 1 2 3 4 5 6 7 8 9 下一頁 Last 
    主站蜘蛛池模板: 麻豆亚洲av熟女国产一区二| 亚洲精品无码永久中文字幕| 亚洲成片观看四虎永久| 久久久久无码专区亚洲av| 亚洲欧洲∨国产一区二区三区| 久久亚洲国产成人亚| 亚洲国产成人久久三区| 国产成人精品日本亚洲语音| 一级做a爰性色毛片免费| 久久国产免费一区二区三区| 日本亚洲免费无线码| 又大又粗又爽a级毛片免费看| 亚洲人成网亚洲欧洲无码久久| 精品亚洲麻豆1区2区3区| 亚洲中文字幕久久精品无码VA | 久久99亚洲网美利坚合众国| 亚洲欧美熟妇综合久久久久| jizz日本免费| 成年人网站免费视频| 国产免费观看视频| 亚洲av日韩av天堂影片精品| 亚洲熟妇自偷自拍另欧美| fc2成年免费共享视频网站| 精品一区二区三区免费毛片爱 | 一级毛片在线免费观看| 成人毛片18女人毛片免费视频未| 久久亚洲色一区二区三区| 亚洲精品视频专区| 日日躁狠狠躁狠狠爱免费视频| 91精品国产免费久久国语麻豆| 日韩成人免费视频播放| 亚洲av综合av一区| 精品亚洲国产成人av| 久久国产乱子伦精品免费不卡| 妞干网手机免费视频| 亚洲国产精品无码久久久秋霞2| 国产亚洲精aa在线看| 99在线免费观看| 精品国产免费观看| 亚洲国产一区二区a毛片| 免费的黄网站男人的天堂 |