1. 程式人生 > >Hibernate3.1.3使用自定義實體類實現對SQL查詢語句的對映

Hibernate3.1.3使用自定義實體類實現對SQL查詢語句的對映

Hibernate3.1.3使用自定義實體類實現對映

前言:

在使用Hibernate操作資料庫時, 特別是進行查詢時,往往要使用儲存過程或一些不方便使用實體類對映的SQL語句。這時就要用到hibernate的自定義SQL語句對映類。下面來介紹一下該過程的實現。

1.下載Hibernate3.1.3(比較老的版本了,不過能實現就可以,而且這個版本能實現,那麼更新的版本當然也能實現), 一般可以到sourceforge.net下載。如果你上不了這個網站也沒關係,我的百度網盤共享有了,直接下載並解壓兩個包。還有hibernate-jpa-2.0-api-1.0.0.Final.jar也需要下載。

連結:http://pan.baidu.com/s/1sjNnqeL 密碼:yq4q

2.在IDE(一般是Eclipse或Netbeans,一樣的了)裡建立兩個庫hibernate3.1.3和hibernate3.1.x-annotation。

下面我以netbeans為例說明:在netbeans主選單裡,工具-->庫-->新建庫(N)(按鈕),命名"Hibernate3.1.3",“確定”;這時“庫(L)”列表中就多出了一個"Hibernate3.1.3"的庫,單擊選擇這個庫,在右邊點按鈕“新增JAR/資料夾”,選擇上面第一步解壓出來的.../hibernate3.1/hibernate3.jar, 確認新增後。再次點右邊點按鈕“新增JAR/資料夾”,新增”...hibernate-3.1/lib/“下面的所有jar檔案。至此完成hibernate3.1.3庫的新增,如下圖。

 

 

3.斷續上面第2步,新“hibernate3.1.x-annotation”庫,過程和第2步基本一樣,不過只要新增兩個jar包:.../hibernate-annotations-3.1.0.Beta10/hibernate-annotations.jar 和 hibernate-jpa-2.0-api-1.0.0.Final.jar。如下圖:

 

4.庫建立完了之後新建一個測試專案,我建的專案名為“JA01”。新增已經建立好的庫: hibernate3.1.3和hibernate3.1.x-annotation, 另外為了連線資料庫,再匯入mysl jdbc驅動程式ja包,因為netbeans本身就帶有,直接匯入即可。然後按以下結構建立檔案結構。

其中,log4j.properties直接複製../hibernate-3.1/etc目錄下的檔案過來。HibernateUtil.java直接複製.../hibernate-3.1/doc/reference/tutorial/src/util目錄下的檔案。不過為了讀取hibernate.mysql.cfg.xml, 需要修改HibernateUtil.java的程式碼,如下:

package com.utils;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;


public class HibernateUtil {

    private static final SessionFactory sessionFactory;

    static {
        try {
            <span style="color:#cc0000;">//sessionFactory = new Configuration().configure("/com/config/hibernate.mysql2.cfg.xml").buildSessionFactory();
            sessionFactory = new AnnotationConfiguration().configure("/com/config/hibernate.mysql.cfg.xml").buildSessionFactory();
</span>        } catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

}


修改hibernate.mysql.cfg.xml內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3307/glweb?useUnicode=true&characterEncoding=gbk</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">123</property>
        
        <!--c3p0聯結器-->
        <!--
        <property name="hibernate.connection.provider_class">net.sf.hibernate.connection.C3P0ConnectionProvider</property>
        -->
        <!--最大連線數-->
        <property name="hibernate.c3p0.max_size">20</property> 
        <!--最小連線數-->
        <property name="hibernate.c3p0.min_size">1</property> 
        <!--連線資料連線多長時間就超時-->
        <property name="hibernate.c3p0.timeout">120</property> 
        <!-- 指定連線池裡最大快取多少個Statement物件 -->
        <property name="hibernate.c3p0.max_statements">100</property> 
        <!--連線空閒時長多久時(秒),檢查連線是否有效-->
        <property name="hibernate.c3p0.idle_test_period">120</property> 
        <!--連線超 過最大連線數時每次c3p0同時獲得多少個連線-->
        <property name="hibernate.c3p0.acquire_increment">2</property>
        <!--測試連線是否有效-->
        <property name="hibernate.c3p0.validate">true</property>


        <!-- 根據需要自動操作資料庫 -->
        <property name="hbm2ddl.auto">none</property>
        <!-- 顯示Hibernate持久化操作所生成的SQL -->
        <property name="show_sql">true</property>
        <!-- 將SQL指令碼進行格式化後再輸出--> 
        <!--<property name="hibernate.format_sql">true</property>-->
    
    
        <!--把註解放入session-factory中-->
        <mapping class="com.project.mapping.BlogAreaMapping"/>
    
    </session-factory>
</hibernate-configuration>

BlogAreaMapping.java內容如下:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.project.mapping;

import javax.persistence.Entity;
import javax.persistence.EntityResult;
import javax.persistence.Id;
import javax.persistence.SqlResultSetMapping;

/**
 *
 * @author lcs
 * @Email [email protected]
 */
@Entity
@SqlResultSetMapping(name = "BlogAreaMapping", entities = {@EntityResult(entityClass = BlogAreaMapping.class)})
public class BlogAreaMapping {
    
    @Id
    private long fid;
    private String name;
    private int sons;

    /**
     * @return the fid
     */
    public long getFid() {
        return fid;
    }

    /**
     * @param fid the fid to set
     */
    public void setFid(long fid) {
        this.fid = fid;
    }

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return the sons
     */
    public int getSons() {
        return sons;
    }

    /**
     * @param sons the sons to set
     */
    public void setSons(int sons) {
        this.sons = sons;
    }
    
}


主程式JA01.java內容:

package ja01;

import com.project.mapping.BlogAreaMapping;
import com.utils.HibernateUtil;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 *
 * @author Administrator
 */
public class JA01 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        Session session = HibernateUtil.getSessionFactory().openSession();

        Transaction tx = session.beginTransaction();
        List list = session.createSQLQuery("SELECT fid,name,sons FROM `gl_blog_area` LIMIT 0, 10").setResultSetMapping("BlogAreaMapping").list();
        tx.commit();
        session.close();
        
        if ( list.size() > 0 ) {
            for(int i = 0; i < list.size(); i++) {
                BlogAreaMapping blogAreaMapping = (BlogAreaMapping) list.get(i);
                System.out.println("fid:" + blogAreaMapping.getFid() + " -- name:" + blogAreaMapping.getName());
                
            }
        }

        // TODO code application logic here
        System.out.println("ja 你好。");
    }

}


在mysql裡(使用者名稱root, 密碼123)新建一個數據庫glweb,編碼設為bgk, 新建表gl_blog_area表的sql語句如下,測試資料可以自行錄入:

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for gl_blog_area
-- ----------------------------
DROP TABLE IF EXISTS `gl_blog_area`;
CREATE TABLE `gl_blog_area` (
  `fid` mediumint(7) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(200) NOT NULL DEFAULT '',
  `sons` smallint(4) NOT NULL DEFAULT '0'
  PRIMARY KEY (`fid`)
) ENGINE=MyISAM AUTO_INCREMENT=538 DEFAULT CHARSET=gbk;

以上工作都做完成後,就可以直接執行"JA01.java"進行測試了,測試結果如下:

run:
12:18:58,037  INFO Version:15 - Hibernate Annotations 3.1.0.Beta10b
12:18:58,053  INFO Environment:479 - Hibernate 3.1.3
12:18:58,053  INFO Environment:509 - hibernate.properties not found
12:18:58,053  INFO Environment:525 - using CGLIB reflection optimizer
12:18:58,053  INFO Environment:555 - using JDK 1.4 java.sql.Timestamp handling
12:18:58,115  INFO Configuration:1308 - configuring from resource: /com/config/hibernate.mysql.cfg.xml
12:18:58,115  INFO Configuration:1285 - Configuration resource: /com/config/hibernate.mysql.cfg.xml
12:18:58,318  INFO Configuration:1419 - Configured SessionFactory: null
12:18:58,365  INFO AnnotationBinder:336 - Binding entity from annotated class: com.project.mapping.BlogAreaMapping
12:18:58,396  INFO EntityBinder:324 - Bind entity com.project.mapping.BlogAreaMapping on table BlogAreaMapping
12:18:58,427  INFO ResultsetMappingSecondPass:51 - Binding resultset mapping: BlogAreaMapping
12:18:58,474  INFO C3P0ConnectionProvider:50 - C3P0 using driver: com.mysql.jdbc.Driver at URL: jdbc:mysql://localhost:3307/glweb?useUnicode=true&characterEncoding=gbk
12:18:58,474  INFO C3P0ConnectionProvider:51 - Connection properties: {user=root, password=****}
12:18:58,474  INFO C3P0ConnectionProvider:54 - autocommit mode: false
12:18:59,160  INFO SettingsFactory:77 - RDBMS: MySQL, version: 5.6.15-log
12:18:59,160  INFO SettingsFactory:78 - JDBC driver: MySQL-AB JDBC Driver, version: mysql-connector-java-5.1.23 ( Revision: ${bzr.revision-id} )
12:18:59,160  INFO Dialect:103 - Using dialect: org.hibernate.dialect.MySQLDialect
12:18:59,160  INFO TransactionFactoryFactory:31 - Using default transaction strategy (direct JDBC transactions)
12:18:59,176  INFO TransactionManagerLookupFactory:33 - No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended)
12:18:59,176  INFO SettingsFactory:125 - Automatic flush during beforeCompletion(): disabled
12:18:59,176  INFO SettingsFactory:129 - Automatic session close at end of transaction: disabled
12:18:59,176  INFO SettingsFactory:136 - JDBC batch size: 15
12:18:59,176  INFO SettingsFactory:139 - JDBC batch updates for versioned data: disabled
12:18:59,176  INFO SettingsFactory:144 - Scrollable result sets: enabled
12:18:59,176  INFO SettingsFactory:152 - JDBC3 getGeneratedKeys(): enabled
12:18:59,176  INFO SettingsFactory:160 - Connection release mode: auto
12:18:59,176  INFO SettingsFactory:184 - Maximum outer join fetch depth: 2
12:18:59,176  INFO SettingsFactory:187 - Default batch fetch size: 1
12:18:59,176  INFO SettingsFactory:191 - Generate SQL with comments: disabled
12:18:59,176  INFO SettingsFactory:195 - Order SQL updates by primary key: disabled
12:18:59,176  INFO SettingsFactory:338 - Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory
12:18:59,176  INFO ASTQueryTranslatorFactory:24 - Using ASTQueryTranslatorFactory
12:18:59,176  INFO SettingsFactory:203 - Query language substitutions: {}
12:18:59,176  INFO SettingsFactory:209 - Second-level cache: enabled
12:18:59,176  INFO SettingsFactory:213 - Query cache: disabled
12:18:59,176  INFO SettingsFactory:325 - Cache provider: org.hibernate.cache.EhCacheProvider
12:18:59,192  INFO SettingsFactory:228 - Optimize cache for minimal puts: disabled
12:18:59,192  INFO SettingsFactory:237 - Structured second-level cache entries: disabled
12:18:59,192  INFO SettingsFactory:257 - Echoing all SQL to stdout
12:18:59,192  INFO SettingsFactory:264 - Statistics: disabled
12:18:59,192  INFO SettingsFactory:268 - Deleted entity synthetic identifier rollback: disabled
12:18:59,192  INFO SettingsFactory:283 - Default entity-mode: pojo
12:18:59,207  INFO SessionFactoryImpl:154 - building session factory
12:18:59,223  WARN Configurator:126 - No configuration found. Configuring ehcache from ehcache-failsafe.xml found in the classpath: jar:file:/F:/Frameworks/JAVA/Hibernate/3.1.x/hibernate-3.1/lib/ehcache-1.1.jar!/ehcache-failsafe.xml
12:18:59,379  INFO SessionFactoryObjectFactory:82 - Not binding factory to JNDI, no JNDI name configured
Hibernate: SELECT fid,name,sons FROM `gl_blog_area` LIMIT 0, 10
fid:1 -- name:北京市
fid:2 -- name:上海市
fid:3 -- name:天津市
fid:4 -- name:重慶市
fid:5 -- name:河北省
fid:6 -- name:山西省
fid:7 -- name:內蒙古自治區
fid:8 -- name:遼寧省
fid:9 -- name:吉林省
fid:10 -- name:黑龍江省
ja 你好。
成功構建 (總時間: 1 秒)


這樣基本完工了。

注意事項:

1.hibernate.mysql.cfg.xml中, 把<property name="hbm2ddl.auto"/>設定為none, 這是因為我所做的對映在資料庫中這些表本來就不存在,所以不必要新建一個。在這個例子中,如果把值設定為update或者update,那麼資料庫裡就會新建一個新的"blogareamapping"的表。這樣做有點風險,那就是如果不小心這個資料庫中"xxxxxxxxmapping"表本來就存在,而程式又要新建或更新一個這樣的表,那很容易造成資料丟失。

2.執行結果裡有一大堆INFO資訊, 這個在開發時很有用,但放入到專案中,就不必要顯示那麼多了。為了不顯示這些不必要的資訊,可以修改log4j.properties檔案, 把該檔案中的“log4j.logger.org.hibernate=info”這行,改為“log4j.logger.org.hibernate=error”。這樣就不顯示info資訊了,只顯示error資訊

相關推薦

Hibernate3.1.3使用定義實體實現SQL查詢語句對映

Hibernate3.1.3使用自定義實體類實現對映 前言: 在使用Hibernate操作資料庫時, 特別是進行查詢時,往往要使用儲存過程或一些不方便使用實體類對映的SQL語句。這時就要用到hibernate的自定義SQL語句對映類。下面來介紹一下該過程的實現。 1.下載Hibernate3.1.3(比較

課堂動手動腦驗證以及定義異常實現異常處理——java異常

異常(exception):發生在程式執行期間,表明出現了一個非法執行的情況。許多JDK中的方法在檢測到非法情況時,都會丟擲一個異常物件。例如:陣列越界和被0除。 程式碼驗證: package test; import javax.swing.*; class AboutException { p

多執行緒實現方式1定義一個,繼承Thread,並重寫run方法。

/** * 多執行緒實現方式1: * 自定義一個類,繼承Thread類,並重寫run方法。 * 執行緒同時執行。 * @author jiaxutianhuo * */ public cl

C# 實現Sort介面 排序定義實體集合

預定義實體類 class SortClass { public SortClass(int id,String value) { this.Id = id;

EF學習筆記——生成定義實體

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

SpringMVC框架(1)之(1.3 定義引數繫結)

一、自定義引數繫結-屬性編輯器(不推薦) 問題:① 4.1 itemsList.jsp 中增加顯示 “訂購日期” 屬性;② JSP頁面中日期拿到的是字串,而提交到Controller中POJO類ItemsCustom 屬性物件的日期欄位要變成Date型別,即字串轉換成日期型別,無法自動轉

Mybatis需要返回的資料引數中在資料表中沒有對應的欄位,定義實體和resultmap作為返回值型別

自定義實體類:因為需要做相關記錄的統計,而表中沒有統計欄位 public class TrafficJeevesDistrictCount { //施工top5+1 按區域 private String districtInfo; private

C++ 定義日期實現日期的加減演算法

#include<iostream> using namespace std; class Date{ private: int m_year,m_month,m_day; int m_totalDaysYear; public: Date(int yea

SpringBootDataJpa定義查詢返回定義實體

在使用jpa的時候,jpa雖然封裝了大量的crud操作,但是有時也會根據業務需要自定義查詢語句以及返回的自定義實體類 接下來就將一步一步的排坑 電信計費系統: 實體類介紹 費用表實體類 @Entity @Table(name = "t_costs") public cla

Spring JPA 定義實體定義sql語句多表關聯複雜子查詢

   最近在寫一個功能,因為不是很熟悉jpa操作,接觸時間不久,所以又習慣性地用了sql語句來查詢,主要是嫌麻煩,想返回的資料用一條資料返回來就可以了,所以就用spring  jpa寫了個自定義的實體類來裝我專門返回來的資料欄位,然後sql也有點複雜,join了幾張表,

postgresql 9.3 定義聚合函式實現多行資料合併成一列

前言 常見的一種需求,如下圖(1): 目前需要按右邊的factor_code進行分組,將左邊的behavior_code這一列通過指定分隔符連線起來,比如通過<br /> 來連線,理想的效果應當是如下圖(2)這樣: 下面就來討論一下實現

解決ARX定義實體viewportDraw顯示問題

問題描述: 在自定義實體的viewportDraw裡繪製與檢視相關的顯示,為什麼執行3dorbit(三維動態觀察)時不顯示,退出3dorbit後顯示又正常? 經反覆測試,建立自定義實體後,只要呼叫了修改自定義實體屬性的函式,相應的實體在執行3dorbit命令過程中就不會顯示

spring mvc定義過濾器filter實現request預處理和response響應

      過濾器的作用攔截請求,提取公用的程式碼,在請求訪問action之前先處理一段程式碼,在action處理之後,在處理一段程式碼;基於這樣的作用,我們就可以在請求訪問action之前先處理一些整個專案共用的程式碼片段,比如,域名,,請求的url資訊,以及基於域名拓展的

spring mvc定義過濾器filter實現請求引數編解碼的程式碼

百度,google了半天即使再萬能的stackoverflow上也沒有得到解答,今天偶然間發現springmvc註解@RequestParam不是通過HttpServletRequest.java的getParameter(String name)方法得到的引數值,而

《C++第九周實驗報告3-1》----接第8周任務3定義分數中運算子過載,實現分數的輸入輸出

/* (程式頭部註釋開始) * 程式的版權和版本宣告部分 * Copyright (c) 2011, 煙臺大學計算機學院學生 * All rights reserved. * 檔名稱: CFraction.cpp *

實驗報告:(1)合理定義一個三角形Triangle,成員屬性包括3條邊,能否構成三角形的標誌;成員方法包括構造方法、修改3條邊、計算面積。 (2)寫一測試,測試自定義三角形Triangle是否正

(1)合理定義一個三角形類Triangle,成員屬性包括3條邊,能否構成三角形的標誌;成員方法包括構造方法、修改3條邊、計算面積。(2)寫一測試類,測試自定義三角形類Triangle是否正確。class Triangle_D{ private double f_edge;

Java程式設計之TreeSet排序兩種解決方法(1)元素自身具備比較功能,元素需要實現Comparable介面覆蓋compare(2)建立根據定義Person的name進行排序的Comparator

       當很多人問我讀研到底好不好的時候,我總是說上研很苦逼,讀完研之後都不知道自己能不能找到工作,所以不建議同學們讀研~即使要讀也讀一個985或者211的研究生,這是我肺腑之言。但還有一半我沒說完,讀研的時候你可能會找到你喜歡的活動,會遇到一些願意和你一起玩的玩伴,

ThinkPHP 3.2 定義 Model

esp ins array create 得到 namespace 數據 map ret   ThinkPHP 提供了一個 Model 類,供其他的 Model 進行繼承。Model 類中是 MVC 中的模型類,它是調用 持久層 的上層類。感覺這麽描述問題很多,但是有什麽

美國高通 Snapdragon Neural Processing Engine SDK (SNPE) 系列 (1):使用者定義層JNI實現

轉自:https://blog.csdn.net/guvcolie/article/details/77937786         Snapdragon Neural Processing Engine SDK是美國高通公司出品的神經網路處理引擎(SNP

實現定義Lock

Java 9併發程式設計指南 目錄 實現自定義Lock類 準備工作 實現過程 工作原理 擴充套件學習 更多關注 鎖是Java併發API提供的基本同步機制之一,每次只有一個執行緒可以執行程式碼塊,因此用來保護程式碼的關鍵部分。鎖機