Hibernate入门笔记

相关基础概念请从其它教材简单了解,这里仅记录下第一个Hibernate程序的实现步骤。

环境说明:

java开发工具:eclipse MARS.2 Release(4.5.2)

hibernate版本:hibernate-release-4.3.6.Final

Web 容器:Tomcat v8.0

数据库:MySQL 5.6.19-enterprise-commercial-advanced

jdbc驱动:mysql-connector-java-commercial-5.1.30-bin.jar

1.下载hibernate。

2.下载jdbc驱动文件。

3.在eclipse中新建web project,命名为firsthibernate。

4.拷贝hibernate/lib/required文件夹下的所有jar文件、以及jdbc驱动文件(此文件另外下载)到项目的WEB-INF/lib文件夹下,拷贝hibernate/project/etc下的hibernate.cfg.xml文件到项目的src目录下。

5.新建实体类Cat,Hibernate中配置实体类有两种方法:XML文件配置和@注解配置,本例采用@注解配置,相关注解代表的含义在代码中都有注明如下:

package com.levice.firsthibernate.bean;

import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity                              //注解Entity表示该类能被Hibernate持久化
@Table(name = "tb_cat")              //指定该Entity对应的数据表名
public class Cat {

    @Id                              //指定该列为主键。主键类型最好不要使用int等原始类型
    @GeneratedValue(strategy = GenerationType.AUTO) //主键类型auto表示该主键为自增长型
    private Integer id;

    @Column(name = "name")           //指定该属性对应的数据库表的列为name,列名与属性名一样时这句注解可省略
    private String name;

    @Column(name = "description")
    private String description;

    @ManyToOne                       //指定实体类之间的关系,本例表示多对一关系
    @JoinColumn(name = "mother_id")
    private Cat mother;

    @Temporal(TemporalType.TIMESTAMP)//日期类型(DATE,TIME或TIMESTEMP)
    @Column(name = "birthday")
    private Date birthday;

    //getters and setters
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public Cat getMother() {
        return mother;
    }
    public void setMother(Cat mother) {
        this.mother = mother;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
}

6.修改配置文件hibernate.cfg.xml,内容及注释如下:

<!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 -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
        <property name="connection.username">root</property>
        <property name="connection.password">123456</property>

        <!-- 指定使用MySQL数据库格式的SQL语句 -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- 指定在控制台打印生成的SQL语句 -->
        <property name="show_sql">true</property>

        <!-- 指定Hibernate启动时自动创建表结构 -->
        <property name="hbm2ddl.auto">create</property>

        <!-- 加上这一句以防止未知错误 -->
        <property name="current_session_context_class">thread</property>

        <!-- 指定Cat类为Hibernate实体类 -->
        <mapping class="com.levice.firsthibernate.bean.Cat"/>
    </session-factory>
</hibernate-configuration>

7.初始化数据库,在MySQL中创建数据库hibernate,SQL代码如下:

create database hibernate;

8.配置HibernateUtil,就是修改HibernateUtil.java文件,这个文件在下载的hibernate文件中有,但我Copy过来的时候,一直没调试成功,于是采用了一个版本比较老的HibernateUtil。这个文件的作用是获取SessionFactory从而获取Session,不同版本的hiberate中获取SessionFactory的方法都不同,这里可以新建一个HibernateUtil.java文件,然后把下面的代码copy进去。

package com.levice.firsthibernate.util;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

@SuppressWarnings("deprecation")
public class HibernateUtil {

    private static final SessionFactory sessionFactory;
    static{
        try{
            sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
        }catch(Throwable ex){
            System.err.println("Initial SessionFactory creation failed.");
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory(){
        return sessionFactory;
    }
}

9.执行Hibernate程序,创建一个包含主函数main的类CatTest,代码及注释如下:

package com.levice.firsthibernate.test;

import java.awt.Font;
import java.util.Date;
import java.util.List;
import javax.swing.JOptionPane;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.levice.firsthibernate.bean.Cat;
import com.levice.firsthibernate.util.HibernateUtil;

public class CatTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        /*初始化几只Cat的信息*/
        Cat mother = new Cat();
        mother.setName("Mother White");
        mother.setDescription("This is mother cat");
        mother.setBirthday(new Date());

        Cat kitty = new Cat();
        kitty.setMother(mother);
        kitty.setName("Kitty");
        kitty.setDescription("This is Kitty");
        kitty.setBirthday(new Date());

        Cat tom = new Cat();
        tom.setMother(mother);
        tom.setName("Tom");
        tom.setDescription("This is Tom");
        tom.setBirthday(new Date());

        @SuppressWarnings("static-access")
        Session session = new HibernateUtil().getSessionFactory().openSession(); //获取session并open,开启一个Hibernate会话
        Transaction trans = session.beginTransaction(); //开启一个事务

        session.persist(mother); //将mother保存到数据库
        session.persist(kitty);
        session.persist(tom);

        @SuppressWarnings("all")
        List<Cat> catList = session.createQuery(" from Cat ").list(); //查询数据库中所有的猫
        StringBuffer result = new StringBuffer();
        result.append("all cats: \r\n\r\n");
        for (Cat cc : catList) {
            result.append("name:" + cc.getName() + "\n");
            result.append("mother:" + (cc.getMother() == null ? "null" : cc.getMother().getName()) + "\n");
            result.append("description:" + cc.getDescription() + "\r\n\r\n");
        }

        trans.commit(); //提交事务
        session.close(); //关闭Hibernate会话

        //用Swing显示查询结果
        JOptionPane.getRootFrame().setFont(new Font("Arial", Font.BOLD, 14));
        JOptionPane.showMessageDialog(null, result.toString());

    }

}

10.运行CatTest,可以看到如下输出:

控制台输出的SQL语句如下:

Hibernate: alter table tb_cat drop foreign key FK_dix3h50rxo8ahrcu5roir75n1
Hibernate: drop table if exists tb_cat
Hibernate: create table tb_cat (id integer not null auto_increment, birthday datetime, description varchar(255), name varchar(255), mother_id integer, primary key (id))
Hibernate: alter table tb_cat add constraint FK_dix3h50rxo8ahrcu5roir75n1 foreign key (mother_id) references tb_cat (id)
Hibernate: insert into tb_cat (birthday, description, mother_id, name) values (?, ?, ?, ?)
Hibernate: insert into tb_cat (birthday, description, mother_id, name) values (?, ?, ?, ?)
Hibernate: insert into tb_cat (birthday, description, mother_id, name) values (?, ?, ?, ?)
Hibernate: select cat0_.id as id1_0_, cat0_.birthday as birthday2_0_, cat0_.description as descript3_0_, cat0_.mother_id as mother_i5_0_, cat0_.name as name4_0_ from tb_cat cat0_
时间: 2024-08-01 10:32:03

Hibernate入门笔记的相关文章

iBatis 入门笔记

iBatis简介 iBatis是一个"半自动"的轻量级O/R Mapping框架. O/R Mapping是指对象与数据库之间的映射,而iBatis就是这样一个映射器,映射器的主要作用是在对象和数据库之间搬运数据,同时保证对象.数据库和映射器之间相互独立. 通过O/R Mapping你将不用再面对那一堆令人厌恶的JDBC代码,为一堆打开连接.关闭连接的代码而眼花头昏. 何为"半自动"?    这里的半自动是与Hibernate这样的O/R Mapping方案对比得出

MySQL入门笔记(一)

MySQL入门笔记(二) 一.数据类型 1. 整型 2. 浮点型 3. 字符型 4. 日期时间型 二.数据库操作 1. 创建库 CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET [=] charset_name; ??上述代码中DATABASE和SCHEMA完全相同,可任选一个(花括号内的参数为任选其一): ??添加IF NOT EXISTS的作用则是,若新建数据库的名称与已有数据库名称冲突,则产

《Hibernate学习笔记十一》:树状结构设计

<Hibernate学习笔记十一>:树状结构设计 这是马士兵老师讲解Hibernate的一个作业题,树状结构设计,这是一个比较典型的例子,因此有必要写篇博文记录下. 树状结构的设计,它是在同一个类中使用了多对一(ManyToOne)和一对多(OneToMany). 在完成这个题目我们应该按照如下的步骤进行: 1.先思考数据库的模型应该是什么样的?? 数据库中的模型应该如下:即存在id p_id 2.思考面向对象的模型,及如何来进行映射??? 根据数据库中表的特点,对象应该有id name;由于

Django入门笔记【一】

入门笔记翻译整理自:https://docs.djangoproject.com/en/1.8/ *该笔记将使用一个关于投票网络应用(poll application)的例子来阐述Django的用法. 1. 查看Django是否安装及版本 1 $ python -c "import django; print(django.get_version())" 2. 创建一个项目(project) 通过cd方式进入自创目录,然后运行: 1 $ django-admin startprojec

嵌入式OS入门笔记-以RTX为案例:十.Keil的RTX调试支持

嵌入式OS入门笔记-以RTX为案例:十.Keil的RTX调试支持 调试(debug)是软件开发的一个重要环节,对于嵌入式开发而言这个环节其实比较依赖一些硬件资源(硬件debugger)的支持.传统的嵌入式系统的调试比较依赖断点(breakpoint)和单步调试(single step through).而 ARM cortex-M 系列的芯片其实有很强的CoreSight片上调试支持,实际上就是一个小的调试硬件,作为ARM的标准,内嵌在ARM的芯片里.在ARM自家的调试器ULINK-pro等的帮

Ajax 入门笔记

AJAX =Asynchronous Javascript + XML,是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. XMLHttpRequest 是 AJAX 的基础.XMLHttpRequest 用于在后台与服务器交换数据.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 1:创建 XMLHttpRequest 对象 为

Hive入门笔记-----架构以及应用介绍

Hive这个框架在Hadoop的生态体系结构中占有及其重要的地位,在实际的业务当中用的也非常多,可以说Hadoop之所以这么流行在很大程度上是因为Hive的存在.那么Hive究竟是什么,为什么在Hadoop家族中占有这么重要的地位,本篇文章将围绕Hive的体系结构(架构).Hive的操作.Hive与Hbase的区别等对Hive进行全方面的阐述. 在此之前,先给大家介绍一个业务场景,让大家感受一下为什么Hive如此的受欢迎: 业务描述:统计业务表consumer.txt中北京的客户有多少位?下面是

史上最简单的Hibernate入门简单介绍

事实上Hibernate本身是个独立的框架,它不须要不论什么web server或application server的支持.然而,大多数的Hibernate入门介绍都加入了非常多非Hibernate的东西,比方: Tomcat, Eclipse, Log4J,Struts, XDoclet, 甚至JBoss.这easy让人产生Hibernate复杂难懂的误解,特别是打击了刚開始学习的人的积极性. 在这篇文章将不涉及Eclipse, log4j, Struts, Tomcat, XDoclet,

JAVA数据库编程(JDBC技术)-入门笔记

本菜鸟才介入Java,我现在不急着去看那些基本的语法或者一些Java里面的版本的特征或者是一些晋级的知识,因为有一点.Net的OOP编程思想,所以对于Java的这些语法以及什么的在用到的时候在去发现学习一下.我现在很迫不及待用JAVA想来实现以下对数据库的增删改查.想实现就来看Java是怎么操作数据库的,回想下.Net里你可能会配置web.Config,或者你去写一些DBhelper类然后调用里面的自己定义的一些增删改查的方法,更或者你去配一些数据控件等等往往发现操作基本都是一体化的简单.现在面