1. 程式人生 > >Java:hibernate入門(一)

Java:hibernate入門(一)

pro limit util ive odin out 負責 控制器 list

Java三層結構

1 web:struts框架

2 service:Spring框架

3 dao:hibernate框架

相當於MVC的思想

1 M:模型èhibernate框架

2 V:視圖èstruts框架

3 C:控制器èSpring框架

1:Hibernate是對JDBC進一步封裝

不需要復雜的jdbc代碼,不需要寫sql語句也能實現

  1. 沒有使用hibernate如下:
Jdbc:  
public static final  String URL="jdbc:mysql://localhost:3306/數據庫";//
鏈接的mysql public static final String NAME = "root"; public static final String PASSWORD = "root"; public static final String DREIVER = "com.mysql.jdbc.Driver"; //加載驅動 Class.forName(DREIVER); //創建連接 Connection con=DriverManager.getConnection(URL, NAME, PASSWORD); //對sql進行編譯操作 String sql = "select * from users "; //
查詢多條數據 PreparedStatement psmt=con.prepareStatement(sql); //執行sql ResultSet rs= psmt. executeQuery(); //遍歷結果集 ….. //釋放資源

2 使用hibernate:讓實體類和表一一對應不需要代碼即可實現,使用配置文件完成

hibernate封裝的對象session

//創建實體類的對象

User user =new User();

user.setName("明珠");

session.sava(user);

2:Hibernate的核心

A :Configuration接口:負責配置並啟動Hibernate

B :SessionFactory接口:負責初始化Hibernate

C :Session接口:負責持久化對象的CRUD操作

D :Transaction接口:負責事務

F :Query接口和Criteria接口:負責執行各種數據庫查詢

註意:Configuration實例是一個啟動期間的對象,一旦SessionFactory創建完成它就被丟棄

二:Hibernate 準備

  1. 導入jar包

技術分享

2.創建實體類(Javabean)

創建一個User的實體類

/**
 * 2 創建實體類,然後配置實體類和數據庫表一一對應關系(映射關系) 
 * @author Xiao_Zhu
 *
 */
public class User {
    // hibernate要求實體類有一個屬性唯一的
    // private String uuid;
    private int id;
    private String name;
    private String password;
    private String address;

    /*
     * public String getUuid() { return uuid; }
     * 
     * public void setUuid(String uuid) { this.uuid = uuid; }
     */

    public int getId() {
        return id;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getName() {
        return name;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

}

3 :配置實體類和數據庫表一一對應關系(映射關系)

(1):使用配置文件實現映射關系

a. 創建xml格式的配置文件

映射配置文件名稱和位置沒有固定要

建議:配置文件最好放在實體類相應的包的路徑下. 配置文件的名稱:實體名稱.hbm.xml (這是我的習慣)

創建一個User.hbm.xml的配置文件

技術分享

<?xml version="1.0"?>
<!-- 只有引入約束,下面才能使用hibernate-mapping的標簽 -->
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <!-- 1配置類和表對應 
    class標簽
    name屬性:實體類全路徑 ==>如: com.zhu.domain.User
    table屬性:數據庫表名稱 -->
    <class name="com.zhu.domain.User" table="td_users">
        <!-- 2配置實體類ID和表裏面的id對應 
              hibernate:要求實體類有個屬性唯一值 
              hibernate:要求表有字段作為
               -->
        <!-- id標簽 
        name:實體類裏面 id屬性名  
        column:生成的表字段名稱 
        -->
        <id name="uuid" column="uuid">
            <!-- 3 設置數據庫表id增長策略
             native: 生成表id值就是主鍵自動增長
              -->
           <generator class="uuid"></generator>
        </id>
     
     <!--   4:配置其他屬性和表字段對應
             name屬性:實體類屬性(變量)名稱
             column :數據庫表字段的名稱     
      -->
      <property name="name" column="name"></property>
       <property name="password" column="password"></property>
        <property name="address" column="address"></property>
          
    </class>
</hibernate-mapping>

4:創建hibernate的核心配置文件

a:核心配置文件格式xml,而且核心配置文件名稱和位置固定的

位置:必須在src下面

名稱:必須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>
    <!-- 第一部分:配置數據庫信息 jdbc:mysql://localhost:3306/-->
    <property name="hibernate.connection.driver_class">
        com.mysql.jdbc.Driver
    </property>
    <property name="hibernate.connection.url">
        jdbc:mysql://localhost:3306/jdbc01
    </property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">root</property>

    <!-- 第二部分:配置hibernate信息 -->
    <!--輸出底層sql語句   --> 
    <property name="hibernate.show_sql">true</property>
    <!-- 輸出底層SQL語句格式  -->
    <property name="hibernate.format_sql">true</property>  
    <!-- hibernate幫創建表,需要配置之後
        update:如果已經有表,那麽就更新,如果沒有,創建 -->
    <property name="hibernate.hbm2ddl.auto">update</property> 
    <!-- 配置數據庫方言
        在mysql裏面實現分頁關鍵字limit,只能使用mysql裏面
        在Oracle數據庫,實現紛紛也rownum
        讓hibernate框架識別不同數據庫語句 -->
    <property name="hibernate.dialect">
        org.hibernate.dialect.MySQL5Dialect
    </property>
    
    <!-- 把session綁定到hibernate -->
   <property name="current_session_context_class">thread</property>
   
    <!-- 第三部分:把映射文件放到核心配置文件中 -->
    <!--  因為對應的表hibernatexml.hbm.xml配置文件放在包裏,不是src下面的目錄下;所以路徑要這樣寫 -->
    <!-- 如果User.hbm.xml放在src下的目錄下面,那麽路徑 就可以 直接這樣寫==>User.hbm.xml -->
    <property name="connection.url">jdbc:mysql://127.0.0.1:3306/jdbc01</property>
    <property name="connection.driver_class">
        com.mysql.jdbc.Driver
    </property>
    <property name="connection.username">root</property>
    <property name="connection.password">root</property>
    <mapping resource="com/zhu/domain/User.hbm.xml" /> 
</session-factory>
</hibernate-configuration>

5 創建數據的表

技術分享

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

public class HibernateUtils {
    static    Configuration cfg=null;
     static SessionFactory sessionFactory=null;
     static {
         cfg=new Configuration();
         cfg.configure();
         
ServiceRegistry registry = new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()).build();
      sessionFactory = cfg.buildSessionFactory(registry);
     }
     //提供方法放回本地線程綁定session的方法
     public static Session getSessionObejct(){
         return sessionFactory.getCurrentSession();
     }
     
     public static SessionFactory getSessionFactory(){ 
         return sessionFactory;
     }
     
     public static void main(String[] args) {
         //要運行這裏程序,運行之後才會在相應的某個數據庫中生產一張表
           //運行之後去mysql中看一下是否成功生產了td_users表
    }
}
 

三:實現CRUD操作

第一步: 加載hibernate核心配置文件

第二步:創建SessionFactory對象

第三部使用SessionFactory創建session對象

第四部:開啟事務

第五步:寫具體邏輯crud操作

第六步:提交事務

第七步:關閉資源

(1):瞬時態, 持久態, 托管態

(a):瞬時態:對象裏面沒有id值,對象與session沒有關聯

(b):持久態:對象裏面有ID值,對應於session關聯

(c):托管態:對象有ID值,對象與session沒有關聯

如:托管態

User user=new User();

user.setId(1);

1 創建一個TestCRUD的類

技術分享

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

import com.zhu.domain.User;
import com.zhu.unit.HibernateUtils;

public class TestCRUD {

    public static void main(String[] args) {
        // 新增數據
        // insertData();

        // 查詢一條數據 通過ID
        // queryDataById();

        // 修改一條數據
        // updateData();

        /// 查詢多條數據
        QueryListData();

        // 刪除數據
        // deleteData();

    }

    // 查詢一條數據 通過ID
    public static void queryDataById() {
        // 1;調用工具類得到sessionFactory

        SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
        // 2;獲取到session
        Session session = sessionFactory.openSession();
        // 3:開啟事務
        Transaction tx = session.beginTransaction();

        // 4根據ID查詢
        // 調用session裏面的get方法
        // 第一個參數:是實體類的class
        // 第二參數:是數據庫 的id值
//(b):持久態:對象裏面有ID值,對應於session關聯 User user = (User) session.get(User.class, 1); System.out.println("地址 ==>" + user.getAddress()); // 5 提交事務 tx.commit(); // 6:關閉資源 session.close(); sessionFactory.close(); } // 修改一條數據 public static void updateData() { // 1;調用工具類得到sessionFactory SessionFactory sessionFactory = HibernateUtils.getSessionFactory(); // 2;獲取到session Session session = sessionFactory.openSession(); // 3:開啟事務 Transaction tx = session.beginTransaction(); // 4根據修改 // 調用session裏面的get方法 // 第一個參數:是實體類的class // 第二參數:是數據庫 的id值 User user = (User) session.get(User.class, 1); user.setAddress("中國"); // 調用session的方法update修改 session.update(user); // 註意:sava的方法也能進行修改 // 5 提交事務 tx.commit(); // 6:關閉資源 session.close(); sessionFactory.close(); } // 刪除數據 public static void deleteData() { // 1;調用工具類得到sessionFactory SessionFactory sessionFactory = HibernateUtils.getSessionFactory(); // 2;獲取到session Session session = sessionFactory.openSession(); // 3:開啟事務 Transaction tx = session.beginTransaction(); // 4 刪除 // 第一種刪除:根據ID查詢對象再刪除 User user = (User) session.get(User.class, 1); session.delete(user); /* * //第二種刪除: User user2=new User(); user.setId(3); session.delete(user2); */ // 5 提交事務 tx.commit(); // 6:關閉資源 session.close(); sessionFactory.close(); } // 新增數據 public static void insertData() { // 1;調用工具類得到sessionFactory SessionFactory sessionFactory = HibernateUtils.getSessionFactory(); // 2;獲取到session Session session = sessionFactory.openSession(); // 3:開啟事務 Transaction tx = session.beginTransaction(); // 第五步:寫具體邏輯crud操作 // 添加功能
//(a):瞬時態:對象裏面沒有id值,對象與session沒有關聯
User user = new User(); user.setPassword("123123"); user.setAddress("美國s"); user.setName("mm"); // 調用session的方法實現添加 session.save(user); // 5 提交事務 tx.commit(); // 6:關閉資源 session.close(); sessionFactory.close(); } // 查詢多條數據 public static void QueryListData() { // 1;調用工具類得到sessionFactory SessionFactory sessionFactory = HibernateUtils.getSessionFactory(); // 2;獲取到session Session session = sessionFactory.openSession(); // 3:開啟事務 Transaction tx = session.beginTransaction(); String qhl = "from User"; Query query = session.createQuery(qhl); // 2 調用query對象裏面的方法得到結果 List<User> list = query.list(); for (User user : list) { System.out.println(user.getAddress()); } // 5 提交事務 tx.commit(); // 6:關閉資源 session.close(); sessionFactory.close(); } }

網盤地址 http://pan.baidu.com/s/1qYHPm8W

Java:hibernate入門(一)