Hibernate批量處理資料

來源:互聯網
上載者:User

標籤:

01.批量插入資料

  步驟一.建立實體類,Dept和Emp

  

/** * 員工類 * @author Administrator * */public class Emp {    private Integer empId;    private String empName;    private Dept dept;    public Integer getEmpId() {        return empId;    }    public void setEmpId(Integer empId) {        this.empId = empId;    }    public String getEmpName() {        return empName;    }    public void setEmpName(String empName) {        this.empName = empName;    }    public Dept getDept() {        return dept;    }    public void setDept(Dept dept) {        this.dept = dept;    }    }
/* * 部門實體類 */public class Dept {    //不問標號    private Integer deptNo;    private String deptName;    //關聯一個員工集合    private Set<Emp> emps=new HashSet<Emp>();        public Set<Emp> getEmps() {        return emps;    }    public void setEmps(Set<Emp> emps) {        this.emps = emps;    }    public Integer getDeptNo() {        return deptNo;    }    public void setDeptNo(Integer deptNo) {        this.deptNo = deptNo;    }    public String getDeptName() {        return deptName;    }    public void setDeptName(String deptName) {        this.deptName = deptName;    }    }

  步驟二.建立Dept.hbm.xml和Emp.hbm.xml小設定檔

<!--Dept.hbm.xml--><?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="cn.a.entity">    <class name="Dept" table="Dept" lazy="false">    <id name="deptNo">        <generator class="sequence">        <param name="sequence">SEQ_Student</param>        </generator>    </id>    <property name="deptName"></property>    <set name="emps" cascade="save-update" lazy="extra">    <key column="deptNo"></key>        <!-- 多的一方的外建 -->    <one-to-many class="Emp" />    </set>    </class></hibernate-mapping>    
<!--Emp.hbm.xml--><?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="cn.a.entity">    <class name="Emp" table="Emp">    <id name="empId">        <generator class="sequence">        <param name="sequence">SEQ_Student</param>        </generator>    </id>    <property name="empName"></property>    <!-- 植入一個Dept對象           多對一 -->    <many-to-one name="dept" class="Dept" column="deptNo"></many-to-one>    </class></hibernate-mapping>

  步驟三.建立大設定檔hibernate.cfg.xml

<?xml version=‘1.0‘ encoding=‘utf-8‘?><!DOCTYPE hibernate-configuration PUBLIC        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration>    <session-factory>        <!-- Database connection settings 資料庫連接設定 -->        <!-- 驅動類 -->        <property name="connection.driver_class">oracle.jdbc.OracleDriver</property>        <!-- url地址 -->        <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>        <property name="connection.username">Hibernate</property>        <property name="connection.password">orcl</property>        <!-- SQL dialect (SQL 方言) -->        <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>        <!--在控制台列印多工緩衝的SQL語句 -->        <property name="show_sql">true</property>        <!-- 格式化顯示SQL -->        <!-- <property name="format_sql">true</property> -->        <!-- 自動產生表 -->        <property name="hbm2ddl.auto">update</property>        <!-- 關聯小配置 -->        <mapping resource="cn/a/entity/Dept.hbm.xml" />        <mapping resource="cn/a/entity/Emp.hbm.xml" />    </session-factory></hibernate-configuration>

  以上的步驟我們不做詳細的講解了,主要看測試的代碼

/* * 使用HQL語句批量處理資料 */public class HQLUpdateData {    /*     *大量新增資料      */    @Test    public void addTest()    {        Session session=HibernateUtil.getSession();        Transaction tx=session.beginTransaction();        Query query = session.createQuery("insert into Dept(deptName) select d.deptName||d.deptNo from Dept d where d.deptNo>0");        int count = query.executeUpdate();        System.out.println(count);        tx.commit();        HibernateUtil.CloseSession();    }

通過HQL來進行大量操作

Hibernate3中的HQL(Hibernate Query Language,Hibernate查詢語言)不僅可以檢索資料,還可以用於進行批次更新、刪除和插入資料。大量操作實際上直接在資料庫中完成,所處理的資料不會被儲存在Session的緩衝中,因此不會佔用記憶體空間。
Query.executeUpdate()方法和JDBC API中的PreparedStatement.executeUpdate()很相似,前者執行用於更新、刪除和插入的HQL語句,而後者執行用於更新、刪除和插入的SQL語句。

1.批次更新資料
以下程式碼示範通過HQL來批次更新Customer對象:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

String hqlUpdate =
"update Customer c set c.name = :newName where c.name = :oldName";
int updatedEntities = session.createQuery( hqlUpdate )
.setString( "newName", "Mike" )
.setString( "oldName", "Tom" )
.executeUpdate();

tx.commit();
session.close();
以上程式碼向資料庫發送的SQL語句為:
update CUSTOMERS set NAME="Mike" where NAME="Tom"

2.大量刪除資料
Session的delete()方法一次只能刪除一個對象,不適合進行大量刪除操作。以下程式碼示範通過HQL來大量刪除Customer對象:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

String hqlDelete = "delete Customer c where c.name = :oldName";
int deletedEntities = session.createQuery( hqlDelete )
.setString( "oldName", "Tom" )
.executeUpdate();
tx.commit();
session.close();
以上程式碼向資料庫提交的SQL語句為:
delete from CUSTOMERS where NAME="Tom"

3.批量插入資料
插入資料的HQL文法為:
insert into EntityName properties_list select_statement
以上EntityName表示持久化類的名字,properties_list表示持久化類的屬性列表,select_statement表示子查詢語句。
HQL只支援insert into ... select ... 形式的插入語句,而不支援"insert into ... values ... "形式的插入語句。
下面舉例說明如何通過HQL來批量插入資料。假定有DelinquentAccount和Customer類,它們都有id和name屬性,與這兩個類對應的表分別為DELINQUENT_ACCOUNTS和CUSTOMERS表。DelinquentAccount.hbm.xml和Customer.hbm.xml檔案分別為這兩個類的對應檔。以下代碼能夠把CUSTOMERS表中的資料複製到DELINQUENT_ACCOUNTS表中:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

String hqlInsert = "insert into DelinquentAccount (id, name) select c.id, c.name from Customer c where c.id>1";
int createdEntities = s.createQuery( hqlInsert )
.executeUpdate();
tx.commit();
session.close();

以上程式碼向資料庫提交的SQL語句為:
insert into DELINQUENT_ACCOUNTS(ID,NAME) select ID,NAME from CUSTOMERS where ID>1

9.4.4 直接通過JDBC API來進行大量操作

當通過JDBC API來執行SQL insert、update和delete語句時,SQL語句中涉及到的資料不會被載入到記憶體中,因此不會佔用記憶體空間。
以下程式直接通過JDBC API來執行用於批次更新的SQL語句:
Transaction tx = session.beginTransaction();
//獲得該Session使用的資料庫連接
java.sql.Connection con=session.connection();
//通過JDBC API執行用於批次更新的SQL語句
PreparedStatement stmt=con.prepareStatement("update CUSTOMERS set AGE=AGE+1 "
+"where AGE>0 ");
stmt.executeUpdate();

tx.commit();

以上程式通過Session的connection()方法獲得該Session使用的資料庫連接,然後通過它建立PreparedStatement對象並執行SQL語句。值得注意的是,應用程式仍然通過Hibernate的Transaction介面來聲明事務邊界。
值得注意的是,在Hibernate3中,儘管Session的connection()方法還存在,但是已經被廢棄,不提倡使用了,不過Hibernate3提供了替代方案:org.hibernate.jdbc.Work介面表示直接通過JDBC API來訪問資料庫的操作,Work介面的execute()方法用於執行直接通過JDBC API來訪問資料庫的操作:
public interface Work {
//直接通過JDBC API來訪問資料庫的操作
public void execute(Connection connection) throws SQLException;
}
Session的doWork(Work work)方法用於執行Work對象指定的操作,即調用Work對象的execute()方法。Session會把當前使用的資料庫連接傳給execute()方法。

以下程式示範了通過Work介面以及Session的doWork()方法來執行大量操作的過程:
Transaction tx=session.beginTransaction();
//定義一個匿名類,實現了Work介面
Work work=new Work(){
public void execute(Connection connection)throws SQLException{
//通過JDBC API執行用於批次更新的SQL語句
PreparedStatement stmt=connection
.prepareStatement("update CUSTOMERS set AGE=AGE+1 "
+"where AGE>0 ");
stmt.executeUpdate();
}
};

//執行work
session.doWork(work);
tx.commit();

Hibernate批量處理資料

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.