第一個(gè)Hibernate應(yīng)用

本章為實(shí)戰(zhàn)應(yīng)用撞牢,本來(lái)是想跟這書(shū)籍上的東西走的绣硝。但之前試了下蜻势,有些地方走不通,不知道是版本問(wèn)題還是自己水平不夠找不到問(wèn)題所在鹉胖。唉不管它了握玛。就按自己的來(lái)。不過(guò)核心知識(shí)流程基本沒(méi)多大變化甫菠,如此這般說(shuō)來(lái)···開(kāi)始吧

Hibernate 是java應(yīng)用和關(guān)系型數(shù)據(jù)庫(kù)的橋梁挠铲,它能進(jìn)行java 對(duì)象和關(guān)系數(shù)據(jù)之間的映射。Hibernate內(nèi)部封裝了通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)的操作寂诱,向上層應(yīng)用提供了面向?qū)ο蟮臄?shù)據(jù)訪問(wèn)API拂苹。在java應(yīng)用中使用Hibernate包含以下步驟。

  • (1) 創(chuàng)建Hibernate的配置文件 (這個(gè)文件有兩種方式 XMl和 java屬性文件 鍵=值形式)
  • (2) 創(chuàng)建持久化類(lèi)
  • (3) 創(chuàng)建對(duì)象-關(guān)系映射
  • (4) 通過(guò)hibernate APi 訪問(wèn)操作數(shù)據(jù)庫(kù)

下面將通過(guò)一個(gè)簡(jiǎn)單例子開(kāi)始我們本章的搗鼓啦痰洒。
不多說(shuō)先上圖:

Paste_Image.png

3.1 創(chuàng)建Hibernate配置文件

java環(huán)境啥的這里就不再說(shuō)明瓢棒。 我是使用的Eclipse

  1. 新建工程取名 helloapp 并新建好結(jié)構(gòu)
    簡(jiǎn)單應(yīng)用我就不是用web工程了,就用控制臺(tái)就可以了
Paste_Image.png

如圖丘喻,工程開(kāi)始就這樣脯宿。
解釋一下:

  • A 處 entity用于放實(shí)體類(lèi)的(也就是持續(xù)化類(lèi)的) service 用于存放具體和數(shù)據(jù)打交道的類(lèi)。類(lèi)比三層架構(gòu)的數(shù)據(jù)訪問(wèn)層
    hibernate.properties 和Hibernate.cfg.xml 文件則是Hibernate的主配置文件泉粉。

兩種方式都可以(也可同時(shí)使用连霉,一般在屬性文件hibernate.properties中存放數(shù)據(jù)庫(kù)連接相關(guān)的操作數(shù)據(jù),在hibernate.cfg.xml文件中存放映射配置)
properties形式的配置文件和XML格式的配置文件可以同時(shí)使用嗡靡。當(dāng)同時(shí)使用兩種類(lèi)型的配置文件時(shí)跺撼,XML配置文件中的設(shè)置會(huì)覆蓋properties配置文件的相同的屬性。
這里有兩篇可以參考下
http://www.cnblogs.com/HardWorkinggoup/p/3392033.html
http://www.cnblogs.com/klguang/p/4769085.html#autoid-0-0-1

  • B 處是lib文件里面存放需要導(dǎo)入的包
  • C 處導(dǎo)入的包(具體導(dǎo)入哪些讨彼,去網(wǎng)上搜索一下大把教程這里不細(xì)說(shuō))
  • D 包導(dǎo)入后需要引入一下

下面正式開(kāi)始:
1.首先在src 根目錄下新建 hibernate.properties 文件并寫(xiě)入一下代碼

hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.connection.url=jdbc:mysql://localhost:3306/yxh?useSSL=true
hibernate.connection.username=root
hibernate.connection.password=root
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.show_sql=true

2.然后在創(chuàng)建 hibernate.cfg.xml 文件寫(xiě)入如下內(nèi)容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
                                         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
                                         
<hibernate-configuration>
    <session-factory>    
        <!-- Database connection settings 數(shù)據(jù)庫(kù)連接配置 這里注釋了财边,將使用 hibernate.properties屬性文件-->
        <!-- <property name="connection.driver_class">com.mysql.jdbc.Driver</property>-->
        <!-- <property name="connection.url">jdbc:mysql://localhost:3306/yxh?useSSL=true</property>-->
        <!-- <property name="connection.username">root</property>-->
        <!-- <property name="connection.password">root</property>-->
          
        <!-- JDBC connection pool (use the built-in) -->
        <!-- <property name="connection.pool_size">1</property> -->
             
        <!-- SQL dialect SQL 方言-->
        <!--<property name="dialect">org.hibernate.dialect.MySQLDialect</property>-->
             
        <!-- Echo all executed SQL to stdout SQL語(yǔ)句打印-->
        <!--<property name="show_sql">true</property>-->
             
        <!-- Enable Hibernate's automatic session context management -->
        <!--<property name="current_session_context_class">thread</property>-->
             
        <!-- Drop and re-create the database schema on startup -->
        <!-- <property name="hbm2ddl.auto">create</property> -->
             
        <!-- Disable the second-level cache 禁用二級(jí)緩存-->       
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
          
        <!-- 映射文件  -->
        <mapping resource="hello/entity/User.hbm.xml"/>
    
    </session-factory>
</hibernate-configuration> 

為了全面一點(diǎn),本例子將兩種配置文件都使用上点骑,其中 hibernate.properties 負(fù)責(zé)配置基本的連接信息酣难。而xml文件則配置映射文件 ,在這xml中將連接配置注釋了,如果想只使用xml配置可選擇打開(kāi)黑滴。

  1. 創(chuàng)建持久化類(lèi) User
    該文件放在 hello.entity 包下憨募,內(nèi)容如下:
package hello.entity;

public class User {
    private Long id;
    private String name;
    private char sex;
    private int age;
    private String email;
    private String phone;
    private String address;
    
    public User(){}

    public Long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
    
}
  1. 創(chuàng)建數(shù)據(jù)表
    不多說(shuō),我使用的mysql袁辈。代碼如下
create table user(
    id      bigint(10) NOT NULL,
    name    varchar(16) NOT NULL,
    sex     char(1) NOT NULL,
    age     int NOT NULL DEFAULT 10,
    email   varchar(256),
    phone   varchar(64),
    address varchar(256),
    primary key(id)
);
  1. 創(chuàng)建對(duì)象-關(guān)系映射文件
    同樣在 hello.entity新建 **User.hbm.xml **
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="hello.entity.User" table="user">
        <id name="id" column="id">
            <generator class="increment"/>
        </id>   
        
        <property name="name" column="name" not-null="true"/>
        <property name="sex" column="sex" type="character" not-null="true"/>
        <property name="age" column="age" type="int" not-null="true"/>
        <property name="email" column="email" type="string"/>       
        <property name="phone" column="phone" type="string"/>
        <property name="address" column="address" type="string"/>
            
    </class>
</hibernate-mapping>
  1. Hibernate API 的使用
    在hello.service 目錄下新建 UserService類(lèi)
package hello.service;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;

import hello.entity.User;

public class UserService {
    public static SessionFactory sessionFactoty;
    static{
        try {           
            //創(chuàng)建Configuration實(shí)例 
            Configuration config = new Configuration();
            //加載對(duì)象-關(guān)系映射文件
            //第一種方式 不采用任何配置文件菜谣,直接將連接配置的參數(shù)通過(guò)Configuration配置
            /*
            config.addClass(hello.entity.User.class)
            .setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver")
            .setProperty("hibernate.connection.url", "jdbc:mysql://localhost:3306/yxh?useSSL=true")
            .setProperty("hibernate.connection.username", "root")
            .setProperty("hibernate.connection.password", "root")
            .setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect")
            .setProperty("hibernate.show_sql", "true");
            */
            
            //采用hibernate.properties 需要指定映射文件 如:hello.entity.User.class
            //config.addClass(hello.entity.User.class);
            
            
            //采用XML配置文件的形式 不需要指定映射文件,因?yàn)樵赬ML文件中就可以直接指定了
            //config.configure("hibernate.cfg.xml");//可以寫(xiě)上晚缩,但默認(rèn)就是加載src下的hibernate.cfg.xml文件
            config.configure();
        
            //創(chuàng)建SessionFactoty實(shí)例            
            sessionFactoty = config.buildSessionFactory();
        } catch (RuntimeException e) {
            e.printStackTrace();
            throw e;
        }
    }
    
    //持久化一個(gè)對(duì)象
    public void saveUser(User user){
        try {
            Session session = sessionFactoty.openSession();
            Transaction tx = session.beginTransaction();
            session.save(user);
            tx.commit();
            session.close();
        } catch (Exception e) {
            // TODO: handle exception
        }
    }
    
    //del
    public void delete(Long id){
        Session session = sessionFactoty.openSession();
        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            session.delete(session.get(User.class, id));
            tx.commit();
        } catch (Exception e) {
            tx.rollback();  
            throw new RuntimeException(e); 
        } finally {
            session.close();  
        }
    }   
    
    public void updateUser(User user){
        Session session = sessionFactoty.openSession();
        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            session.update(user);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();  
            throw new RuntimeException(e); 
        } finally {  
            session.close();  
        }   
    }
    
    public User getById(Long id){
        Session session = sessionFactoty.openSession();
        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            User user = (User) session.get(User.class,id);
            tx.commit();
            return user;
        } catch (Exception e) {
            tx.rollback();  
            throw new RuntimeException(e); 
        } finally {  
            session.close();  
        } 
    }
    
    public List<User> findAll(){
        Session session = sessionFactoty.openSession();
        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            Query query = session.createQuery("from User");
            List<User> list = query.list();
            tx.commit();
            return list;            
        } catch (Exception e) {  
            tx.rollback();  
            throw new RuntimeException(e);  
        } finally{  
            session.close();  
        }
    }
    
    /** 
     * 分頁(yè)尾膊,返回一頁(yè)的數(shù)據(jù)列表 
     * @param firstResult 從結(jié)果列表中的那個(gè)索引開(kāi)始取數(shù)據(jù) 
     * @param maxResults 最多取多少條數(shù)據(jù) 
     * @return  list+count返回的條數(shù) 
     */
    public List<User> findAll(int firstResult, int maxResults){
        Session session = sessionFactoty.openSession();
        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            
            Query query = session.createQuery("FROM User");
            query.setFirstResult(firstResult);
            query.setMaxResults(maxResults);
            List<User> list = query.list();
            return list;
        } catch (Exception e) {
            tx.rollback();  
            throw new RuntimeException(e);
        } finally{  
            session.close();  
        }
    }
}
  1. 使用
    在hello.controller包下新建UserTest類(lèi)
package hello.controller;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import hello.entity.User;
import hello.service.UserService;

public class UserTest {

    public static void main(String[] args) {
        UserService bus = new UserService();
        /*
        User user = new User();
        user.setName("肖飛");
        user.setSex('男');
        user.setAge(21);
        user.setEmail("xiaofei@qq.com");
        user.setPhone("15623120863");
        user.setAddress("山海虹橋");
        bus.saveUser(user);
        */
        
        /*
        bus.delete(new Long((long)2));
        */
        
        /*
        DateFormat df = new SimpleDateFormat("HH:mm:ss");
        System.out.println(df.format(new Date()));
        
        User user1 = bus.getById(new Long((long)1));
        user1.setName("涼涼");
        bus.updateUser(user1);
        */
        
        List<User> list = bus.findAll(0,2);
        for(User row:list){
            System.out.println("姓名:" + row.getName() + "\t 年齡:" + row.getAge());
        }
        
    }

}

編碼到這里暫時(shí)就結(jié)束了運(yùn)行下UserTest,貼張圖看看(??)

Paste_Image.png

打印的獲取所有的記錄列表荞彼。其他的添加冈敛、刪除啥的就不貼了
最后貼張完整的目錄結(jié)構(gòu)

Paste_Image.png

今天就到這兒了,后面在做一些重點(diǎn)知識(shí)的講解 ??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鸣皂,一起剝皮案震驚了整個(gè)濱河市抓谴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寞缝,老刑警劉巖癌压,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異荆陆,居然都是意外死亡滩届,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)被啼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)帜消,“玉大人,你說(shuō)我怎么就攤上這事趟据∪纾” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵汹碱,是天一觀的道長(zhǎng)粘衬。 經(jīng)常有香客問(wèn)我,道長(zhǎng)咳促,這世上最難降的妖魔是什么稚新? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮跪腹,結(jié)果婚禮上褂删,老公的妹妹穿的比我還像新娘。我一直安慰自己冲茸,他們只是感情好屯阀,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布缅帘。 她就那樣靜靜地躺著,像睡著了一般难衰。 火紅的嫁衣襯著肌膚如雪钦无。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天盖袭,我揣著相機(jī)與錄音失暂,去河邊找鬼。 笑死鳄虱,一個(gè)胖子當(dāng)著我的面吹牛弟塞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拙已,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼决记,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了悠栓?” 一聲冷哼從身側(cè)響起霉涨,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惭适,沒(méi)想到半個(gè)月后笙瑟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡癞志,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年往枷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凄杯。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡错洁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出戒突,到底是詐尸還是另有隱情屯碴,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布膊存,位于F島的核電站导而,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏隔崎。R本人自食惡果不足惜今艺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望爵卒。 院中可真熱鬧虚缎,春花似錦、人聲如沸钓株。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至铲掐,卻和暖如春拾弃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背摆霉。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奔坟,地道東北人携栋。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像咳秉,于是被迫代替她去往敵國(guó)和親婉支。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容