hibernate簡單實現連接數據庫,並實現數據的操作


1:創建實體類

 1 package com.yinfu.entity;
 2 
 3 public class User {
 4 
 5     private int id;
 6     private String username;
 7     private String password;
 8     private String address;
 9     public int getId() {
10         return id;
11     }
12     public void setId(int id) {
13         this.id = id;
14     }
15     public String getUsername() {
16         return username;
17     }
18     public void setUsername(String username) {
19         this.username = username;
20     }
21     public String getPassword() {
22         return password;
23     }
24     public void setPassword(String password) {
25         this.password = password;
26     }
27     public String getAddress() {
28         return address;
29     }
30     public void setAddress(String address) {
31         this.address = address;
32     }
33     
34 }
User.Java

2:創建實體類與數據庫表對應的配置文件:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC 
 3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping>
 6 <!-- 
 7     配置類和表的對應
 8     class標簽
 9     name屬性:實體類全類名
10     table屬性:數據庫表名稱,用hibernate不需要自己創建表,他可以根據配置文件自動生成數據庫表
11  -->
12  <class name="com.yinfu.entity.User" table="t_user">
13      <!-- 
14          配置實體類ID與表中的ID進行對應
15          hibernate要求實體類屬性有一個唯一值
16          hibernate要求表有作為唯一值得字段
17       -->
18       <!--id標簽
19            name屬性:實體類中的id名稱
20            column屬性:表字段中的id名稱
21        -->
22        <id name="id" column="id">
23            <!-- 設置數據庫表的增長策略
24                native:生成表id值就是主鍵自增長
25             -->
26            <generator class="native"></generator>
27        </id>
28        <!-- 配置其他屬性和表的字段的對應
29                name屬性:實體類中的屬性名
30                column屬性:表中的字段名
31         -->
32        <property name="username" column="username"></property>
33        <property name="password" column="password"></property>
34        <property name="address" column="address"></property>
35  </class>
36 </hibernate-mapping>
User.hbm.xml

3:hibernate核心配置文件(1.數據庫信息,2.hibernate信息,3.實體類與數據庫映射的配置文件注入信息)

此配置文件文件名和位置是固定的:文件名:hibernate.cfg.xml 位置:要放在src文件夾下

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-configuration PUBLIC
 3     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 4     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
 5 <hibernate-configuration>
 6 <!-- 此配置文件的文件名和位置是固定的的
 7     文件名:hibernate.cfg.xml
 8     位置:要寫在src文件中
 9  -->
10     <session-factory>
11         <!-- 第一部分:配置數據庫信息 -->
12         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
13         <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
14         <property name="hibernate.connection.username">root</property>
15         <property name="hibernate.connection.password">song12345</property>
16         
17         <!-- 第二部分:配置hibernate信息(可有可無) -->
18         <!-- 輸出底層的SQL語句 -->
19         <property name="hibernate.show_sql">true</property>
20         <!-- 對底曾語句進行格式化 -->
21         <property name="hibernate.format_sql">true</property>
22         <!-- hibernate幫創建表,需要配置
23             update:如果有表就更新,沒有表就創建
24          -->
25         <property name="hibernate.hbm2ddl.auto">update</property>
26         <!-- 配置數據庫的方言 
27             識別不同數據庫中的特有的語句和關鍵字
28             比如:分頁查詢
29                     MySQL關鍵字是limit
30                     oracle中的使用的是top-n分析中的rownum
31         -->
32         <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
33         <!-- 指定線程管理方式,與本地線程進行綁定,實現單線程操作 -->
34         <property name="hibernate.current_session_context_class">thread</property>
35     
36         <!-- 第三部分:把映射文件放到核心配置文件中 -->
37         <mapping resource="com/yinfu/entity/User.hbm.xml"/>
38     
39     </session-factory>
40     
41 </hibernate-configuration>
hibernate.cfg.xml

4:用Junit進行簡單測試:

 1 package com.yinfu.test;
 2 
 3 import static org.junit.Assert.*;
 4 
 5 import org.hibernate.Session;
 6 import org.hibernate.SessionFactory;
 7 import org.hibernate.Transaction;
 8 import org.hibernate.cfg.Configuration;
 9 import org.junit.Test;
10 
11 import com.yinfu.entity.User;
12 import com.yinfu.utils.HibernateUtils;
13 
14 public class HibernateTest {
15 
16     @Test
17     public void test() {
18         //1.加載hibernate核心配置文件
19         //只會到src下去尋找hibernate的核心配置文件
20         Configuration cfg = new Configuration();
21         cfg.configure();
22         //2.創建sessionFactory對象
23         //讀取hibernate核心配置文件內容,根據configuration對象創建sessionFactory對象
24         //在這過程中,根據映射關系,在相應數據庫中把表創建
25         SessionFactory sessionFactory = cfg.buildSessionFactory();
26         //3.根據sessionFactory得到session對象
27         //類似於jdbc中的connection鏈接
28         Session session = sessionFactory.openSession();
29         //4.開啟事務
30         Transaction tx = session.beginTransaction();
31         //5.邏輯代碼實現crud操作
32         //session中有:增加:save方法   修改:update  刪除:delete方法    根據ID查詢:get方法
33         User user = new User();
34         user.setUsername("李四");
35         user.setPassword("12345");
36         user.setAddress("韓國");
37         session.save(user);
38         //6.提交事務
39         tx.commit();
40         //7.釋放資源
41         session.close();
42         sessionFactory.close();
43         
44     }
45 }
test

4.1,將創建SessionFactory對象的代碼提出來,放到static靜態代碼塊中,當此類加載的時候只創建一個對象,並重復使用此對象,能夠進行優化

首先創建Utils工具類:

 1 package com.yinfu.utils;
 2 
 3 import org.hibernate.Session;
 4 import org.hibernate.SessionFactory;
 5 import org.hibernate.cfg.Configuration;
 6 
 7 //工具類
 8 public class HibernateUtils {
 9 
10     private final static Configuration cfg;
11     private final static SessionFactory sessionFactory;
12     
13     //用靜態代碼塊來實現對象只在類加載的時候創建一次(靜態代碼塊只執行一次)
14     static{
15         //創建configuration對象,
16         cfg = new Configuration();
17         cfg.configure();
18         //根據Configuration對象創建sessionFactory對象
19         sessionFactory = cfg.buildSessionFactory();
20     }
21     
22     //返回與本地線程綁定的session
23     public static Session getSession(){
24         return sessionFactory.getCurrentSession();
25     }
26     
27     //創建一個方法用於返回sessionFactory對象
28     public static SessionFactory getSessionFactory(){
29         return sessionFactory;
30     }
31     
32     
33 }
HibernateUtils

然后創建測試類:

 1 package com.yinfu.test;
 2 
 3 import static org.junit.Assert.*;
 4 
 5 import org.hibernate.Session;
 6 import org.hibernate.SessionFactory;
 7 import org.hibernate.Transaction;
 8 import org.hibernate.cfg.Configuration;
 9 import org.junit.Test;
10 
11 import com.yinfu.entity.User;
12 import com.yinfu.utils.HibernateUtils;
13 
14 public class HibernateTest {
15     @Test
16     public void testStatic() {
17         //利用工具類得到與本地線程綁定的session
18         Session session = HibernateUtils.getSession();
19         //4.開啟事務
20         Transaction tx = session.beginTransaction();
21         //5.邏輯代碼
22         //增加方法:
23         //此user為瞬時態數據(user中沒有id,與session無關)
24         User user = new User();
25         user.setUsername("趙六");
26         user.setPassword("12345");
27         user.setAddress("瑪雅文明");
28         session.save(user);
29         
30         //根據ID查詢:
31         //第一個參數:實體類的類對象。第二個參數:id值
32         //此user為持久態數據(有id,與session有關)
33 //        User user = session.get(User.class, 1);
34 //        System.out.println(user);
35         
36         //修改方法:
37 //        User user = session.get(User.class, 1);
38 //        user.setUsername("張三");
39 //        session.update(user);
40         
41         //刪除方法:
42         //第一種:
43 //        User user = session.get(User.class, 1);
44 //        session.delete(user);
45         //第二種:
46 //        User user = new User();
47 //        user.setId(2);
48 //        session.delete(user);
49         
50         //6.提交事務
51         tx.commit();
52         //7.釋放資源
53         session.close();
54         
55     }
56 
57 }
test

由於在工具類中將session與當前線程進行了綁定,執行結果正確了,但是會有一個異常,這個異常是由於當session與本地線程進行綁定之后,session會隨着線程的結束而自動關閉,不在需要手動進行session關閉,當還有session.close()方法的時候回報此異常。

 

 數據的三種狀態:

1:瞬時態數據(沒有ID,與session無關):

User user = new User();
user.setUsername("趙六");
user.setPassword("12345");
user.setAddress("瑪雅文明");

2:脫管狀態:(有id,與session無關)

User user = new User();

user.setId(1);

3:持久態數據:(有id,與session有關)

User user = session.get(User.class, 1);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM