你的位置:首页 > Java教程

[Java教程]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.

5.新建实体类Cat,Hibernate中配置实体类有两种方法:

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.

<!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_dix3h50rxo8ahrcu5roir75n1Hibernate: drop table if exists tb_catHibernate: 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_