Hibernate学习日记(一)

hibernate4的优势:

对跨数据库、事务封装、ORM映射、延迟加载等细节技术提供了完善的解决方案,同时也对一些在程序开发中容易忽略的问题进行了良好的封装和规划。

  1. 通过使用ORM(Object-Relational Mapping)映射,以Bean的形式操作数据库中的记录
  2. 强大的一级、二级缓存机制结合数据库连接池POOL,使CURD的操作效率得到很大提升
  3. 可以将系统中大量的SQL语句放入XML中进行统一管理,方便项目的总体设计及维护修改
  4. 项目融入Hibernate后,可以更加地面向OOP编程,以面向对象的方式思考程序的结构框架

可以点击链接下载hibernate最新版: hibernate官网

持久化、持久层、ORM

持久化就是把数据保存在可掉电的存储介质上。持久层的设计目标是为整个项目提供一个衔接高低层、统一、安全和并发的数据持久机制,完成对各种数据库进行持久化的编程工作,并为系统业务逻辑层提供服务。数据持久层提供了数据访问的方法,不需要程序员手动写程序去访问数据持久层,专注于业务逻辑的开发。并且能在不同的项目中重用映射框架,大大简化了数据增、删、改、查等功能的开发。而ORM的概念是数据持久层的一种子实现,它通过映射的机制,把数据库中的一条记录当成一个java的一个class(Bean)处理。在CURD的处理上真正实现了面向对象开发,大大缩短了后期软件的维护周期。

Hibernate实战小程序

假设数据库中有一个用户表,有如下几个字段:ID,name,sex,address,school,email
  我们需要这样一个实体类:

class MyBean implements Serializable{
  private String id;
  private String name;
  private String sex;
  private String address;
  private String school;
  private String email;

  public MyBean(){}

  //...省略getter、setter方法
}

需要注意的是:实体类必须要继承java.io.serializable方法,而且需要有个参数为空的构造方法。

实战小程序的起点:

本文使用的IDEA构建Java程序,然后使用Hibernate的方式操控Mysql数据库

首先新建一个表,下面是我所建表的结构,表名为userinfo
    +---------+--------------+------+-----+---------+----------------+
    | Field   | Type         | Null | Key | Default | Extra          |
    +---------+--------------+------+-----+---------+----------------+
    | id      | int(11)      | NO   | PRI | NULL    | auto_increment |
    | name    | varchar(40)  | NO   |     | NULL    |                |
    | sex     | char(4)      | NO   |     | NULL    |                |
    | address | varchar(100) | YES  |     | NULL    |                |
    | school  | varchar(100) | YES  |     | NULL    |                |
    | email   | varchar(50)  | YES  |     | NULL    |                |
    +---------+--------------+------+-----+---------+----------------+
创建与数据库表表项对应的Bean,也就是类
import java.io.Serializable;

/**
 * Created by Sherlock on 2/28/2017.
 */
public class UserBean implements Serializable{
    /*ID,name,sex,address,school,email*/
    private int user_id;
    private String user_name;
    private String sex;
    private String address;
    private String school;
    private String email;

    public UserBean(){

    }

    public void setUser_id(int id){
        this.user_id = id;
    }
    public void setUser_name(String name){
        this.user_name = name;
    }
    public void setSex(String sex){
        this.sex = sex;
    }
    public void setAddress(String address){
        this.address = address;
    }
    public void setSchool(String school){
        this.school = school;
    }
    public void setEmail(String email){
        this.email = email;
    }

    public int getUser_id(){
        return this.user_id;
    }
    public String getUser_name(){
        return this.user_name;
    }
    public String getSex(){
        return this.sex;
    }
    public String getAddress(){
        return this.address;
    }
    public String getSchool(){
        return this.school;
    }
    public String getEmail(){
        return this.email;
    }
}
配置数据库信息,注意数据库连接数据的正确性,也就是hibernate.cfg.xml文件
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
    <property
            name="hibernate.connection.username">root</property>
    <property
            name="hibernate.connection.password">sa</property>
    <property
            name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property
            name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_stu?useSSL=true</property>
    <property
            name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

    <mapping resource="hibernate.hbm.xml"/>
</session-factory>
</hibernate-configuration>
然后配置相应的hibernate.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="com.blaze.hibernate_stu.beans.UserBean" table="userinfo">
        <id name="user_id" type="java.lang.Integer">
            <column name="id"/>
        </id>
        <property name="user_name" type="java.lang.String">
            <column name="name"/>
        </property>
        <property name="sex" type="java.lang.String">
            <column name="sex"/>
        </property>
        <property name="address" type="java.lang.String">
            <column name="address"/>
        </property>
        <property name="school" type="java.lang.String">
            <column name="school"/>
        </property>
        <property name="email" type="java.lang.String">
            <column name="email"/>
        </property>
    </class>
    <!--ID,name,sex,address,school,email-->
</hibernate-mapping>
再然后通过一个类来生成Configuration对象,并且构建出SessionFactory对象最后得到Session。我们通过Transaction事务对象来完成进行事务操作,注意使用Session对象来进行save操作,使用Transaction对象来提交事务。
import com.blaze.hibernate_stu.beans.UserBean;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

/**
 * Created by Sherlock on 2/28/2017.
 */
public class GetSession {
    private Configuration configuration = null;
    private SessionFactory sessionFactory = null;
    private Session session = null;
    private Transaction transaction = null;

    private SessionFactory getSessionFactory(){
        configuration = new Configuration().configure();
        sessionFactory = configuration.buildSessionFactory();
        return sessionFactory;
    }

    public Session backSession(){
        return getSessionFactory().openSession();
    }

    public void saveUserInfo(UserBean user){
        backSession();
        try{
            session = backSession();
            //开启事务
            transaction = session.beginTransaction();
            //存储数据
            session.save(user);
            //提交事务
            transaction.commit();
        }catch(Exception e){
            transaction.rollback();
            e.printStackTrace();
        }finally{
            if(session != null){
                session.close();
            }
        }

    }
}

一定要注意的是,如果在添加过程中出现异常,我们必须通过Transaction对象对上面操作进行滚回,所以rollback的操作是很必要的。而且要在finally中添加关闭Session对象的程序段,以保证可用资源的正常回收,避免资源的浪费。

一个Main类来启动上面的程序
import com.blaze.hibernate_stu.beans.UserBean;
import com.blaze.hibernate_stu.factory_class.GetSession;

/**
 * Created by Sherlock on 2/28/2017.
 */
public class Main {
    public static void main(String[] args){
         UserBean user = new UserBean();
         user.setUser_name("Sherlock");
         user.setAddress("address");
         user.setEmail("sherlockblaze@gmail.com");
         user.setSex("男");
         user.setSchool("jilin University");

         new GetSession().saveUserInfo(user);
    }
}
总结:
因为程序很简单,我们主要注意SessionFactory是线程安全,而Session不是线程安全这两个问题。也就是说我们在程序中对Session对象的访问要特别注意,如果盲目用多个线程访问Session对象,那么会导致Session对象存储紊乱。然后就是对本文的说明,最后的小程序我没有使用逆向工程生成什么DAO等等一些原先应该有的类,理由是因为我不会用IDEA来逆向,也许我后面会百度补上一篇博客。结束。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容