Hibernate 學習(一)

一、Hibernate 簡介

1、Hibernate 簡介

  Hibernate是一個開放源代碼的對象關系映射(ORM)框架,它對JDBC進行了非常輕量級的對象封裝,它將POJO與數據庫表建立映射關系,是一個全自動的orm框架,hibernate可以自動生成SQL語句,自動執行,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。Hibernate 是傳統 Java 對象和數據庫服務器之間的橋梁,用來處理基于 O/R 映射機制和模式的那些對象。

2、Hibernate 優缺點

  優點與缺點都是相對的,那么講一個東西的優缺點我們都需要一個參數對比,而咱們要來進行對比的咱們操作數據的原生的JDBC:

1、JDBC的優缺點

本質:處理Java對象和關系型數據庫表之間的轉換。

優點:

  操作數據庫最底層,性能最高(需要你是有相應的經驗,并且是一個數據庫高手)。

缺點: ?

1、使用復雜(重復代碼太多)。

2、移植數據庫很麻煩,改動比較多;主鍵的生成方式不同(mysql使用自增,oracle使用序列);分頁的sql語句也是不同(mysql使用limit,oracle使用ROWNUM)。

3、性能優化得自己處理,沒有提供數據的緩存。

4、面向sql語句操作,不是面向對象的。

2、hibernate的優缺點

  本質:處理Java對象和關系型數據庫表之間的轉換,只是對JDBC再次做了一層封裝。

優點:

1、程序員操作很簡單,代碼簡單 session.save(user);

2、直接面向對象操作。

3、提供世界級數據緩存(現在幾乎所有的ORM框架的緩存都是學的Hibernate);一級緩存,二級緩存,查詢緩存。

4、數據庫移植性很強,很少的修改;把各種數據庫抽取了一個方言接口;不同數據庫實現一個方言接口,如果換了數據庫,必須修改方言實現,驅動jar文件,連接數據庫信息。

缺點:

1、不能干預sql語句的生成;session.get(User.class,id); 默認查詢t_user表的所有字段,自動生成select user0_.id,user0_.name,user0_.age from t_user user0_ where?? ?user0_.id=?

2、一個項目中,如果對sql語句的優化要求比較高,不適合用hibernate(不過可以使用 Hibernate 對原生sql 的支持來解決)。

3、如果一張表中有上億級別的數據量,也不適合用hibernate,其實也不適合用jdbc(可以使用數據庫讀寫分離,分庫分表方案解決)。

二、Hibernate 入門

1、步驟

1、拷貝jar包

2、建立 pojo

Product 類:

 1 package com.hibernate.pojo;
 2 
 3 /**
 4  * @author zt1994 2018/3/6 14:16
 5  */
 6 public class Product {
 7     private Integer id;
 8     private String name;
 9     private float price;
10 
11     public Integer getId() {
12         return id;
13     }
14 
15     public void setId(Integer id) {
16         this.id = id;
17     }
18 
19     public String getName() {
20         return name;
21     }
22 
23     public void setName(String name) {
24         this.name = name;
25     }
26 
27     public float getPrice() {
28         return price;
29     }
30 
31     public void setPrice(float price) {
32         this.price = price;
33     }
34 }

3、建立映射文件

Product.hbm.xml 映射文件:

 1 <!DOCTYPE hibernate-mapping PUBLIC
 2         "-//Hibernate/Hibernate Mapping DTD//EN"
 3         "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 4 
 5 <!--映射文件-->
 6 <hibernate-mapping package="com.hibernate.pojo">
 7     <!--class表示一個由hibernate管理的持久對象,對應數據庫中一個表-->
 8     <!--table數據庫的表名-->
 9     <class name="Product" table="product">
10         <id name="id" type="int" column="id">
11             <!--generator表示主鍵的生成方式,native自動選擇數據庫本地的策略-->
12             <generator class="native"/>
13         </id>
14         <!--非主鍵屬性-->
15         <property name="name" column="name" type="string"/>
16         <property name="price" column="price" type="float"/>
17     </class>
18 </hibernate-mapping>

4、建立hibernate核心配置文件

hibernate.cfg.xml 配置文件

 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 
 6 <!--hibernate核心配置文件-->
 7 <hibernate-configuration>
 8     <session-factory>
 9         <property name="dialect">
10             org.hibernate.dialect.MySQLDialect
11         </property>
12         <!--鏈接池配置-->
13         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
14         <property name="connection.url">jdbc:mysql://localhost:3306/how2java</property>
15         <property name="connection.username">root</property>
16         <property name="connection.password">admin</property>
17         <!--顯示sql語句-->
18         <property name="show_sql">true</property>
19 
20         <!-- 映射文件-->
21         <mapping resource="mapper/Product.hbm.xml"/>
22     </session-factory>
23 </hibernate-configuration>

5、編輯dao實現類

dao 接口:

 1 package com.hibernate.dao;
 2 
 3 import com.hibernate.pojo.Product;
 4 
 5 import java.util.List;
 6 
 7 public interface IProductDao {
 8 
 9     /**
10      * 添加產品
11      * @param product
12      * @return
13      */
14     void addProduct(Product product);
15 }

dao 實現:

 1 package com.hibernate.dao.impl;
 2 
 3 import com.hibernate.dao.IProductDao;
 4 import com.hibernate.pojo.Product;
 5 import org.hibernate.Query;
 6 import org.hibernate.Session;
 7 import org.hibernate.SessionFactory;
 8 import org.hibernate.Transaction;
 9 import org.hibernate.cfg.Configuration;
10 
11 import java.util.List;
12 
13 /**
14  * @author zt1994 2018/3/6 14:40
15  */
16 public class ProductDaoImpl implements IProductDao {
17 
18     @Override
19     public void addProduct(Product product) {
20         //1.讀取并解析配置文件
21         Configuration configuration = new Configuration();
22         //2.加載配置文件,如果不設置加載默認配置文件hibernate.cfg.xml
23         configuration.configure("hibernate.cfg.xml");
24         //3.生成會話工廠
25         SessionFactory sessionFactory = configuration.buildSessionFactory();
26         //4.獲取session
27         Session session = sessionFactory.openSession();
28         //5.開啟事務
29         Transaction transaction = session.getTransaction();
30         transaction.begin();
31         //6.操作CRUD
32         session.save(product);
33         transaction.commit();
34         //7.關閉資源
35         session.close();
36         sessionFactory.close();
37     }
38 }

6、測試

 1 package com.hibernate.test;
 2 
 3 import com.hibernate.dao.IProductDao;
 4 import com.hibernate.dao.impl.ProductDaoImpl;
 5 import com.hibernate.pojo.Product;
 6 import org.junit.Test;
 7 
 8 /**
 9  * @author zt1994 2018/3/6 14:47
10  */
11 public class TestProductDao {
12     private IProductDao productDao = new ProductDaoImpl();
13 
14     /**
15      * 測試添加商品
16      */
17     @Test
18     public void testAddProduct(){
19         Product product = new Product();
20         product.setName("test");
21         product.setPrice(2222);
22         productDao.addProduct(product);
23     }
24 }

?

轉載于:https://www.cnblogs.com/zt19994/p/8515134.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453339.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453339.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453339.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(嚴蔚敏版)數組的順序存儲表示和實現代碼

#include<stdarg.h>#include<malloc.h> /* malloc()等 */#include<stdio.h> /* EOF(^Z或F6),NULL */#include<stdlib.h> /* atoi() */#include<io.h> /* eof() */#include<math.h> /* floor(),ceil(),abs() */#include<process.h> /…

特殊權限

2.18特殊的權限set_uid [rootcentos-01 ~]# which passwd //查詢一下passwd位置// /usr/bin/passwd[rootcentos-01 ~]# ls -l /usr/bin/passwd //查詢一下passwd權限//-rwsr-xr-x. 1 root root 27832 6月 …

我的職場戰爭--一年來的開發組內戰實錄

一 戰爭準備階段 一年前&#xff0c;國內分社派我帶著幾名程序員來到日本&#xff0c;進入一個世界級大公司做項目&#xff0c;這里先期駐在了一個日本總社的社員X。沒有人想到戰爭已經臨近。 二 戰爭醞釀階段 日本人不會叫你閑著&#xff0c;頭一個月就開始了下馬威。…

linux8重啟服務代碼,linux(centos8):安裝分布式事務服務seata(seata 1.3.0/centos 8.2)

一&#xff0c;什么是seata?Seata:Simpe Extensible Autonomous Transcaction Architecture&#xff0c;是阿里中間件,開源的分布式事務解決方案。前身是阿里的Fescar官方站:http://seata.io/zh-cn/官方代碼地址:https://github.com/seata/seata官方文檔站:http://seata.io/zh…

數組與矩陣的區別

數組中的元素可以是字符等 矩陣中的只能是數 這是二者最直觀的區別。 因為矩陣是一個數學概念&#xff08;線性代數里的&#xff09;&#xff0c;數組是個計算機上的概念。 《精通MATLAB6.5版》&#xff08;張志涌編著&#xff0c;北京航空航天大學出版社&#xff09;中說&…

android自定義view(自定義數字鍵盤)

序言&#xff1a;在上周的項目中&#xff0c;需要做一個密碼鎖的功能&#xff0c;然后密碼下面還得有鍵盤&#xff0c;就類似支付寶支付的時候那樣&#xff1a; 當然了&#xff0c;我們項目的需求簡單點&#xff0c;純數字的就可以了&#xff0c;然后上周就百度了自定義鍵盤&am…

linux環境部署ltmj,Linux系統安裝與簡單配置 圖文.docx

合肥師范學院實驗報告姓名:課程名稱&#xff1a;Linux院(系&#xff1a;計算機學院 專業/年級:實於Lin^系繚公裝與苗瑕肚卅1.占克If Jf VVVork51at>un ?- If -JpMHIWortsktKia^2.?JGJiIjxiS4CLM.lt 1H. iuFI?H?*vW ?tVirtujl Machine Wisa rdGimm Oprraimv加薊aBMkonA …

矩陣的壓縮存儲

5.3 矩陣的壓縮存儲 矩陣是很多科學與工程計算問題中研究的數學對象&#xff0c;在此&#xff0c;我們討論如何存儲矩陣的元&#xff0c;從而使矩陣的各種運算能有效第進行。對于一個矩陣結構顯然用一個二維數組來表示是非常恰當的&#xff0c;但在有些情況下&#xff0c;比如常…

網絡工程師還要學linux嗎,網絡工程師要學什么

想成為一個優秀的網絡工程師&#xff0c;要學什么&#xff0c;怎么學呢?今天小編帶你了解一下網絡工程師到底要學什么。上篇我們講到了“網絡工程師發展方向”&#xff0c;列舉了許多技術方向&#xff0c;那么我們該如何根據自己的定位選擇學習哪些技術。重點是哪些&#xff0…

利用FormData對象實現AJAX文件上傳功能及后端實現

包括HTML基礎設置、CSS界面優化、JS利用FormData對象和AJAX進行上傳、后端接收文件并存儲到指定路徑以及刪除文件操作。FE HTML 基礎的設置&#xff1a; <form enctype"multipart/form-data"><input id"file" type"file" multiple"…

第 6 章 —— 裝飾模式

6.6 裝扮模式總結 裝飾模式把每個要裝飾的功能放在單獨的類中&#xff0c;并讓這個類包裝它所要裝飾的對象&#xff0c;因此&#xff0c;當需要執行特殊行為時&#xff0c;客戶端代碼就可以在運行時根據需要有選擇地、按順序地使用裝飾功能包裝對象了。 裝扮模式是為已有功能動…

廣義表及其存儲方式簡介

廣義表&#xff08;Lists&#xff0c;又稱列表&#xff09;是線性表的推廣。線性表定義為n>0個元素a1,a2,a3,…,an的有限序列。線性表的元素僅限于原子項&#xff0c;原子是作為結構上不可分割的成分&#xff0c;它可以是一個數或一個結構&#xff0c;若放松對表元素的這種限…

Vue.js:路由

ylbtech-Vue.js&#xff1a;路由1.返回頂部 1、Vue.js 路由 本章節我們將為大家介紹 Vue.js 路由。 Vue.js 路由允許我們通過不同的 URL 訪問不同的內容。 通過 Vue.js 可以實現多視圖的單頁Web應用&#xff08;single page web application&#xff0c;SPA&#xff09;。 Vue.…

圖片轉excel:“保留數字格式”在什么場景下該勾

保留數字格式是什么意思呢&#xff1f;顧名思義&#xff0c;就是將轉出來的數字保留為數字格式&#xff0c;而不是文本格式。我們知道&#xff0c;OCR程序將圖片上的文字識別為電腦可編輯的文字后&#xff0c;如果導入到excel不加處理&#xff0c;則單個數字過長的文字就會被ex…

html概述和基本結構

html概述 HTML是 HyperText Mark-up Language 的首字母簡寫&#xff0c;意思是超文本標記語言&#xff0c;超文本指的是超鏈接&#xff0c;標記指的是標簽&#xff0c;是一種用來制作網頁的語言&#xff0c;這種語言由一個個的標簽組成&#xff0c;用這種語言制作的文件保存的是…

linux添加三權,基于SELinux的三權分離技術的研究

目前&#xff0c;Linux操作系統已廣泛應用于各種設備和產品中&#xff0c;如服務器、PC機、機頂盒及路由器等。隨著Linux系統的不斷發展和廣泛應用&#xff0c;Linux系統的安全問題也引起越來越多的關注。在Linux操作系統中&#xff0c;存在一個超級用戶即root用戶。root也稱為…

二叉樹、樹和有序樹的區別

樹&#xff1a;子樹沒有左右之分 二叉樹、有序樹:左右有序 二叉樹與有序樹&#xff1a;在只有一棵樹的情況下&#xff0c;二叉樹有左右之分、有序樹無左右之分 另外&#xff1a;二叉樹是有序的&#xff0c;可以為空或一個根節點以及兩個分別稱為左子樹和右子樹的互不相交的二叉…

高效程序員

軟件開發人員的作戰手冊 - 讓程序員活的久一點 1. 程序員的職業準則是&#xff1a;誠實&#xff08;如實的報告你的狀態&#xff0c;風險和出現的問題&#xff09;&#xff0c;守信&#xff08;承諾完成的任務就要按時完成&#xff09;&#xff0c;尊重&#xff08;尊重給你的代…

PHP學習筆記1

1.什么是PHP&#xff1f; Hypertext Preprocessor(超文本預處理語言)。 是腳本語言。 是最流行的網站開發語言。 2.PHP能做什么&#xff1f; 可以生成動態頁面內容。 可以創建、打開、讀取、寫入、關閉服務器上的文件。 可以手機表單數據。 可以發送和接收cookies。&#xf…

Redis在windows下的配置

原文:Redis在windows下的配置 Redis在windows下的配置&#xff08;在windows-64下安裝redis&#xff0c;請參考微軟redis的github&#xff1a;https://github.com/MSOpenTech/redis/releases&#xff09;下面是windows32的配置 下載地址http://files.cnblogs.com/files/cuiweny…