1. 程式人生 > >分享知識-快樂自己:搭建第一個 Hibernate (Demo)

分享知識-快樂自己:搭建第一個 Hibernate (Demo)

分享圖片 depend 文件夾 super bbb tool ets 數據庫配置 unicode

使用 Hibernate 完成持久化操作 七大 步驟:

1、讀取並解析配置文件及映射文件:

  Configuration configuration=new Configuration().configure();

根據默認位置的 Hibernate 配置文件中的信息,構建 Configuration 對象。 Configuration 負責管理 Hibernate 的配置信息。

2、依據配置文件和映射文件中的信息,創建 SessionFactory 對象;

  SessionFactory sessionFactory=configuration.buildSessionFactory();

Configuration 對象會根據當前的數據庫配置信息, 構造 SessionFactory 對象。SessionFactory 對象一旦構造完畢,Configuration 對象的任何變更不會影響已經創建的 SessionFactory 對象。

如果 Hibernate 配置信息有改動,那麽需要基於改動後的 Configuration 對象重新構建一個 SessionFactory 對象。

3、打開 Session ;

  Session session=sessionFactory.getCurrentSession(); 或 sessionFactory.openSession();

SessionFactory 負責創建 Session 對象。Session 是持久化操作的基礎。Session 作為貫穿 Hibernate 的持久化管理的核心,提拱了眾多持久化方法,如 save()、delete()、update()、get()、load()等...

通過這些方法,即可透明地完成對象的 增刪改查(CRUD)

4、開始一個事務;

  Tansaction tx = session.beginTansaction();

5、數據庫操作;

  session.save();//保存操作

6、結束事務;

  tx.commit();//提交事務 或 回滾事務

7、如果是通過 SessionFactory 的 openSession() 方法獲取的 Session 對象,則需要關閉 session。

  session.close();

提示:如果在 Hibernate 配置文件中將參數 current_session_context_class 設置為 thread,並采用 SessionFactory 的 getCurrentSession()方法 獲得 Session 對象。

   則不需要執行 session.close() 方法,通過這種方式獲得的Session 對象,會在關聯的事務結束(提交或回滾)時自動關閉。

更新數據的方法:

1): update() 方法,用於將遊離的對象恢復為持久狀態,同時進行數據庫更新操作。當參數對象的 OID 為 null 時會報錯異常

2):saveOrUpdate()方法,同時包含了save()與update()方法的功能,如果入參是瞬時狀態的對象,就調用 save()方法;如果入參是遊離狀態的對象,則調用update()方法。

3):merge()方法,能夠把作為參數傳入的遊離狀態對象的屬性 復制到一個擁有相同 OID 的持久狀態對象中,通過對持久狀態的對象的臟檢查實現更新操作,並返回該持久狀態對象;

   如果無法從Session 緩存或數據庫中加載到相應的持久狀態對象,即傳入的是瞬時對象,則創建其副本執行插入操作,並返回這一新的持久狀態對象。無論何種情況,傳入的對象狀態都不受影響。

案例目錄結構:

技術分享圖片

1):環境搭建前期準備:

目前以及後期需要的 JAR:

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.3</version>
    </dependency>

    <!-- 添加Hibernate依賴 -->
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>3.6.10.Final</version>
    </dependency>

    <!-- 添加Log4J依賴 -->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.16</version>
    </dependency>

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-nop</artifactId>
      <version>1.6.4</version>
    </dependency>

    <!-- 添加javassist -->
    <dependency>
      <groupId>javassist</groupId>
      <artifactId>javassist</artifactId>
      <version>3.12.0.GA</version>
    </dependency>

    <dependency>
      <groupId>org.hibernate.javax.persistence</groupId>
      <artifactId>hibernate-jpa-2.0-api</artifactId>
      <version>1.0.1.Final</version>
    </dependency>

    <dependency>
      <groupId>javax.transaction</groupId>
      <artifactId>jta</artifactId>
      <version>1.1</version>
    </dependency>
    <!-- mysql數據庫的驅動包 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.6</version>
    </dependency>

  </dependencies>

  <build>
    <!--  加載我們的各種hbm.xml文件,如果hbm.xml文件在resources文件夾下面就不需要了-->
    <resources>
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.xml</include>
        </includes>
      </resource>
    </resources>
  </build>

配置核心配置文件:hibernate.cfg.xml (必須以 .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>
        <!--配置連接數據庫的四要素-->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://39.105.105.186:3306/MyBatisCode?useUnicode=true&amp;characterEncoding=UTF-8</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
        <!--是否顯示底層生成的sql語句-->
        <property name="hibernate.show_sql">true</property>
        <!--是否格式化sql語句-->
        <property name="hibernate.format_sql">true</property>
        <!--方言設置-->
        <!--MySql 驅動程序 eg. mysql-connector-java-5.0.4-bin.jar-->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <!--當前會話上下文-->
        <property name="current_session_context_class">thread</property>
        <!--hbm2ddl   就是把xx.hbm.xml文件中的配置生成數據庫中DDL(數據定義語言)
        create:  每次運行都會刪除 上次生成的表,還會創建新的!
        update: 沒有表會自動創建,有表就增加數據!
        validate: 如果hbm文件和數據庫中的字段對應 就會新增,
                  否則拋出異常!
       create-drop:  每次運行都會刪除 上次生成的表,前提是sessionFactory關閉
        -->
        <property name="hbm2ddl.auto">update</property>
        <!--加載需要的hbm.xml映射文件-->
        <mapping resource="mapping/user.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

編寫映射文件 user.hbm.xml (必須以 .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">
<!--
package: 需要映射的實體類所在包
class節點:
name:對應的是實體類的類名,如果沒有書寫package,則必須是完整限定類名

table:數據庫中的表名,如果表名和實體類名一致,可以省略
id節點:表中的主鍵
generator:主鍵生成策略 ,主鍵由誰去創建?程序猿?Hibernate?數據庫
name:  必須和實體類中的屬性名一致
column : 必須和數據庫中的列名一致,如果列名和屬性名一致,可以省略
-->
<!--dynamic-update="false":默認非動態更新-->
<hibernate-mapping package="com.mlq.bena">
    <class name="com.mlq.bena.User" table="`user`" dynamic-update="true">
        <id name="uId" column="uId">
            <!--<generator class="assigned"/>&lt;!&ndash;主鍵生成策略&ndash;&gt;-->
            <generator class="increment"></generator>
        </id>
        <property name="userName" column="userName"/>
        <property name="userPwd" column="userPwd"/>
        <property name="realName" column="realName"/>
    </class>
</hibernate-mapping>
<!--Oracle序列增長-->
<!--<generator class="squence">-->
<!--<param name="squence">SEQ_DEPTNO</param>-->
<!--</generator>-->
<!--數據庫中查詢最大值+1-->
<!--<generator class="increment"></generator>-->
<!--沒有制定使用那種方式:需要結合數據庫方言自增-->
<!--<generator class="native"></generator>-->
<!--uuid:生成32位字符串-->
<!--<generator class="uuid"></generator>-->

User 實體類:

package com.mlq.bena;
import java.io.Serializable;
public class User implements Serializable {
    private Integer uId;
    private String userName;
    private String userPwd;
    private String realName;
    @Override
    public String toString() {
        return "User{" +
                "uId=" + uId +
                ", userName=‘" + userName + ‘\‘‘ +
                ", userPwd=‘" + userPwd + ‘\‘‘ +
                ", realName=‘" + realName + ‘\‘‘ +
                ‘}‘;
    }
    public Integer getuId() {
        return uId;
    }
    public void setuId(Integer uId) {
        this.uId = uId;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getUserPwd() {
        return userPwd;
    }
    public void setUserPwd(String userPwd) {
        this.userPwd = userPwd;
    }
    public String getRealName() {
        return realName;
    }
    public void setRealName(String realName) {
        this.realName = realName;
    }

}

BaseDao 層:

package com.mlq.bena;
import com.mlq.uitl.SessionTool;
import org.hibernate.Session;
/**
 * 獲取連接的提升封裝
 * @author asus
 */
public class BaseDao {

    public Session getSession()
    {
        return SessionTool.getSession();
    }

}

mapper 層:

package com.mlq.mapper;
import com.mlq.bena.User;

import javax.jws.soap.SOAPBinding;
import java.io.Serializable;
/**
 * @author asus
 */
public interface UserMapper {

    /**
     * 添加方法
     * @param user
     */
    public void addUser(User user);

    /**
     * 根據Id查詢
     * @param id
     * @return
     */
    public User getUser(Serializable id);

    /**
     * 根據Id查詢
     * @param id
     * @return
     */
    public User loadUser(Serializable id);

    /**
     * 修改用戶信息:非動態更新
     * 指的是在 映射文件中修改:dynamic-update="false":默認非動態更新
     * @param user
     */
    public void updateUser(User user);

    /**
     * 修改用戶信息:動態更新
     * 指的是在 映射文件中修改:dynamic-update="false":默認非動態更新
     * @param user
     */
    public void mergeUser(User user);

    /**
     * 刪除用戶信息:需要首先調用查詢方法
     * @param id
     */
    public void delUser(Serializable id);
    /**
     * 刪除用戶信息:根據自己定義的對象信息刪除
     * @param user
     */
    public void delUser1(User user);

    /**
     * 當傳遞的 user 主鍵不生效的時便執行save方法
     * @param user
     */
    public void saveUpdate(User user);

    /**
     * 可以實現更新 也可以實現 save保存 同樣根據主鍵是否有效
     * 當主鍵不生效的時候變執行的是 save保存
     * @param user
     * @return
     */
    public User testMerge(User user);

}

mapperImpl:

package com.mlq.mapper;
import com.mlq.bena.BaseDao;
import com.mlq.bena.User;
import com.mlq.uitl.SessionTool;
import org.hibernate.Session;

import java.io.Serializable;
/**
 * @author asus
 */
public class UserMapperImpl extends BaseDao implements UserMapper {
    private Session session=null;
    @Override
    public void addUser(User user) {
        session= super.getSession();
        session.save(user);
    }
    @Override
    public User getUser(Serializable id) {
        session= super.getSession();
        return (User) session.get(User.class,id);
    }
    @Override
    public User loadUser(Serializable id) {
        session= super.getSession();
        return (User) session.load(User.class,id);
    }
    @Override
    public void updateUser(User user) {
        session= super.getSession();
        session.update(user);
    }
    @Override
    public void mergeUser(User user) {
        session= super.getSession();
        session.merge(user);
    }
    @Override
    public void delUser(Serializable id) {
        session= super.getSession();
        session.delete(this.loadUser(id));
    }
    @Override
    public void delUser1(User user) {
        session= super.getSession();
        session.delete(user);
    }
    @Override
    public void saveUpdate(User user) {
        session= super.getSession();
        session.saveOrUpdate(user);
    }
    @Override
    public User testMerge(User user) {
        session= super.getSession();
        User merge = (User)session.merge(user);
        return merge;
    }
}

service 層:

package com.mlq.seivice;

import com.mlq.bena.User;

import java.io.Serializable;

/**
 * @author asus
 */
public interface UserService {
    /**
     * 添加方法
     * @param user
     */
    public void addUser(User user);

    /**
     * 根據Id查詢
     * @param id
     * @return
     */
    public User getUser(Serializable id);

    /**
     * 根據Id查詢
     * @param id
     * @return
     */
    public User loadUser(Serializable id);

    /**
     * 數據更新
     * @param user
     */
    public void updUser(User user);


    /**
     * 非動態更新數據,會給所有字段賦值
     * 指的是在 映射文件中修改:dynamic-update="false":默認非動態更新
     * @param user
     */
    public void updateUser(User user);

    /**
     * 修改用戶信息:動態更新
     * 指的是在 映射文件中修改:dynamic-update="false":默認非動態更新
     * @param user
     */
    public void mergeUser(User user);

    /**
     * 刪除用戶信息:需要首先調用查詢方法
     * @param id
     */
    public int delUser(Serializable id);

    /**
     * 刪除用戶信息:根據自己定義的對象信息刪除
     * @param user
     */
    public int delUser1(User user);

    /**
     * 當傳遞的 user 主鍵不生效的時便執行save方法
     * @param user
     */
    public void saveUpdate(User user);

    /**
     * 可以實現實現 更新 也可以實現 save保存 同樣根據主鍵是否有效
     * @param user
     * @return
     */
    public User testMerge(User user);

}

service impl:

package com.mlq.seivice.impl;

import com.mlq.bena.User;
import com.mlq.mapper.UserMapper;
import com.mlq.mapper.UserMapperImpl;
import com.mlq.seivice.UserService;
import com.mlq.uitl.SessionTool;
import com.sun.xml.internal.ws.handler.HandlerException;
import org.hibernate.Transaction;

import java.io.Serializable;

/**
 * 實現數據查詢
 * @author asus
 */
public class UserServiceImpl implements UserService {

    Transaction transaction=null;
    private UserMapperImpl userMapper=null;

    @Override
    public void addUser(User user) {
        try{
            userMapper=new UserMapperImpl();
            transaction=userMapper.getSession().beginTransaction();
            userMapper.addUser(user);
            transaction.commit();
        }catch (HandlerException e)
        {
            e.printStackTrace();
            transaction.rollback();
        }
    }

    @Override
    public User getUser(Serializable id) {
        User user=null;
        try{
            userMapper=new UserMapperImpl();
            transaction=userMapper.getSession().beginTransaction();
            user = userMapper.getUser(id);
            transaction.commit();
        }catch (HandlerException e)
        {
            e.printStackTrace();
            transaction.rollback();
        }
        return user;
    }

    @Override
    public User loadUser(Serializable id) {
        User user=null;
        try{
            userMapper=new UserMapperImpl();
            transaction=userMapper.getSession().beginTransaction();
            user = userMapper.loadUser(id);
            System.out.println(user+"-----------");
            transaction.commit();
        }catch (Exception e)
        {
            System.out.println("相愛相殺一場!!!");
            e.printStackTrace();
            transaction.rollback();
        }
        return user;
    }

    @Override
    public void updUser(User user) {
        try{
            userMapper=new UserMapperImpl();
            transaction=userMapper.getSession().beginTransaction();
            User info = userMapper.loadUser(user.getuId());
            info.setUserName(user.getUserName());
            info.setUserPwd(user.getUserPwd());
            info.setRealName(user.getRealName());
            transaction.commit();
        }catch (Exception e)
        {
            System.out.println("相愛相殺一場!!!");
            e.printStackTrace();
            transaction.rollback();
        }
    }

    @Override
    public void updateUser(User user) {
        try{
            userMapper=new UserMapperImpl();
            transaction=userMapper.getSession().beginTransaction();
            userMapper.updateUser(user);
            transaction.commit();
        }catch (Exception e)
        {
            System.out.println("相愛相殺一場!!!");
            e.printStackTrace();
            transaction.rollback();
        }
    }

    @Override
    public void mergeUser(User user) {
        try{
            userMapper=new UserMapperImpl();
            transaction=userMapper.getSession().beginTransaction();
            userMapper.mergeUser(user);
            transaction.commit();
        }catch (Exception e)
        {
            System.out.println("相愛相殺一場!!!");
            e.printStackTrace();
            transaction.rollback();
        }
    }

    @Override
    public int delUser(Serializable id) {
        int count=0;
        try{
            userMapper=new UserMapperImpl();
            transaction=userMapper.getSession().beginTransaction();
            userMapper.delUser(id);
            transaction.commit();
            count= 1;
        }catch (Exception e)
        {
            System.out.println("相愛相殺一場!!!");
            count=0;
            e.printStackTrace();
            transaction.rollback();
        }
        return count;
    }

    @Override
    public int delUser1(User user) {
        int count=0;
        try{
            userMapper=new UserMapperImpl();
            transaction=userMapper.getSession().beginTransaction();
            userMapper.delUser1(user);
            transaction.commit();
            count= 1;
        }catch (Exception e)
        {
            System.out.println("相愛相殺一場!!!");
            count=0;
            e.printStackTrace();
            transaction.rollback();
        }
        return count;
    }

    @Override
    public void saveUpdate(User user) {
        try{
            userMapper=new UserMapperImpl();
            transaction=userMapper.getSession().beginTransaction();
            userMapper.saveUpdate(user);
            transaction.commit();
        }catch (Exception e)
        {
            System.out.println("相愛相殺一場!!!");
            e.printStackTrace();
            transaction.rollback();
        }
    }

    @Override
    public User testMerge(User user) {
        User user1=null;
        try{
            userMapper=new UserMapperImpl();
            transaction=userMapper.getSession().beginTransaction();
            user1 = userMapper.testMerge(user);
            transaction.commit();
        }catch (Exception e)
        {
            System.out.println("相愛相殺一場!!!");
            e.printStackTrace();
            transaction.rollback();
        }
        return user1;
    }
}

uitl 獲取連接工具類:

package com.mlq.uitl;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/**
 * 讀取配置信息
 */
public class SessionTool {
    private static SessionFactory sessionFactory=null;
    private static Configuration configuration=null;
    static
    {
        System.out.println("靜態代碼塊------");
        configuration=new Configuration().configure();
        sessionFactory=configuration.buildSessionFactory();
    }
    public static Session getSession()
    {
        return sessionFactory.getCurrentSession();
    }

}

測試類:

package com.mlq;
import com.mlq.bena.User;
import com.mlq.seivice.impl.UserServiceImpl;
import org.junit.Test;
/**
 * 提取工具類的測試
 */
public class HibernateDemo {

    /**
     * get()查詢
     */
    @Test
    public void getUser() {
        User user = new UserServiceImpl().getUser(42183);
        System.out.println(user);
    }
    /**
     * load()查詢
     */
    @Test
    public void loadUser() {
       new UserServiceImpl().loadUser(42);
    }

    /**
     * 更新操作
     */
    @Test
    public void updUser()
    {
        User user=new User();
        user.setuId(42183);
        user.setUserName("aaa");
        user.setUserPwd("bbb");
        user.setRealName("vvv");
        new UserServiceImpl().updUser(user);
    }
    //------------------動態與非動態註意查看 控制臺打印的 SQL-------------------------------//
    /**
     * 更新操作:非動態更新
     */
    @Test
    public void updatedUser()
    {
        User user=new User();
        user.setuId(42183);
        user.setUserName("aaa");
        user.setUserPwd("bcb");
        user.setRealName("vbv");
        new UserServiceImpl().updateUser(user);
    }
    /**
     * 更新操作2:動態更新
     */
    @Test
    public void mergeUser()
    {
        User user=new User();
        user.setuId(42184);
        user.setUserName("aaa");
        user.setUserPwd("bcb");
        user.setRealName("vbbbv");
        new UserServiceImpl().mergeUser(user);
    }
    /**
     * 刪除用戶信息:需要根據查詢來獲取用戶對象 然後刪除
     */
    @Test
    public void deleteUser()
    {
        int i = new UserServiceImpl().delUser(43420);
        System.out.println((i>0)?"刪除成功":"刪除失敗");
    }
    /**
     * 刪除用戶信息:根據自己定義的對象刪除
     */
    @Test
    public void deleteUser1()
    {
        User user=new User();
        user.setuId(43417);
        int i = new UserServiceImpl().delUser1(user);
        System.out.println((i>0)?"刪除成功":"刪除失敗");
    }
    //當傳遞的 user 主鍵不生效的時便執行save方法
    @Test
    public void saveUpdate()
    {
        User user=new User();
        user.setuId(42183);
        user.setUserName("修改了");
        new UserServiceImpl().saveUpdate(user);//執行了Update方法更新
    }
    //當傳遞的 user 主鍵不生效的時便執行save方法
    @Test
    public void saveUpdate1()
    {
        User user=new User();
        user.setUserName("修改了");
        new UserServiceImpl().saveUpdate(user);//執行了save方法更新
    }

    //當傳遞的 user 主鍵不生效的時便執行save方法,否則施行更新
    @Test
    public void textMerge()
    {
        User user=new User();
        user.setUserName("Merge正在執行保存!!!");
        User user1 = new UserServiceImpl().testMerge(user);//執行了save方法更新
        System.out.println(user1);
    }
    @Test
    public void textMerge1()
    {
        User user=new User();
        user.setuId(42183);
        user.setUserName("原來的模樣");
        User user1 = new UserServiceImpl().testMerge(user);//執行了更新方法更新
        System.out.println(user1);
    }
}

分享知識-快樂自己:搭建第一個 Hibernate (Demo)