Hibernate的使用(一)

一,hibernate的介绍

hibernate是一款基于ORM的数据库开源框架,所谓的ORM即Object Realational Mapping(对象关系映射),简单的说就是可以让使用该框架的人通过面向对象的语言去操控关系型数据库。与传统的通过JDBC来完成数据库的操作相比,使用该框架可以大大降低开发者的工作量,使其从关系型数据库的各种操作中脱离出来(加载驱动,创建连接等)。JAVA中一个POJO的类是通过hibernate中的SQlSessionFactory维护,然后映射到数据库中相应的表。常用的ORM框架还有Mybatis等。

二,hibernate的使用

hibernate有两种使用方式,一种是通过配置相应的xml文件,然后进行各种初始化工作;另一种便是通过注解的方式。

2.1 项目的搭建

(1)通过Eclipse创建一个maven项目

(2)修改pom.xml文件引入hibernate所需要的一些jar包

本项目maven使用了3.5.4的版本,jdk使用了1.8,hibernate的版本是3.5.4-Final,pom文件内容如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mytest</groupId>

  <artifactId>Hibernatetest</artifactId>

  <packaging>war</packaging>

  <version>0.0.1-SNAPSHOT</version>

  <name>Hibernatetest Maven Webapp</name>

  <url>http://maven.apache.org</url>

  <dependencies>

    <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>3.8.1</version>

      <scope>test</scope>

    </dependency>

    <!-- 添加hibernate的依赖 开始-->

    <dependency>

        <groupId>dom4j</groupId>

        <artifactId>dom4j</artifactId>

        <version>1.6.1</version>

    </dependency>

    <dependency>

        <groupId>commons-logging</groupId>

        <artifactId>commons-logging</artifactId>

        <version>1.1.1</version>

    </dependency>

    <!-- https://mvnrepository.com/artifact/log4j/log4j -->

    <dependency>

      <groupId>log4j</groupId>

      <artifactId>log4j</artifactId>

      <version>1.2.17</version>

    </dependency>

    <dependency>

        <groupId>commons-collections</groupId>

        <artifactId>commons-collections</artifactId>

        <version>3.2.1</version>

    </dependency>

    <dependency>

        <groupId>cglib</groupId>

        <artifactId>cglib-nodep</artifactId>

        <version>3.1</version>

    </dependency>

    <!-- Hibernate library dependecy end -->

    <dependency>

        <groupId>javax.transaction</groupId>

        <artifactId>jta</artifactId>

        <version>1.1</version>

    </dependency> 

    <!-- 添加hibernate的依赖 结束-->

    <!-- mysql数据库的驱动包 -->

    <dependency>

            <groupId>mysql</groupId>

            <artifactId>mysql-connector-java</artifactId>

            <version>5.1.6</version>

      </dependency>

      <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-annotations -->

      <!-- 添加maven的注解功能 -->

    <dependency>

      <groupId>org.hibernate</groupId>

      <artifactId>hibernate-annotations</artifactId>

      <version>3.5.4-Final</version>

    </dependency>

  <!-- https://mvnrepository.com/artifact/org.javassist/javassist -->

<dependency>

    <groupId>org.javassist</groupId>

    <artifactId>javassist</artifactId>

    <version>3.24.0-GA</version>

</dependency>

<!--    https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->

    <dependency>

      <groupId>org.slf4j</groupId>

      <artifactId>slf4j-log4j12</artifactId>

      <version>1.7.25</version>

      <scope>test</scope>

    </dependency>

<!--    https://mvnrepository.com/artifact/org.slf4j/slf4j-nop -->

  <dependency>

    <groupId>org.slf4j</groupId>

    <artifactId>slf4j-nop</artifactId>

    <version>1.7.2</version>

  </dependency>

  <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api-->

  <dependency>

    <groupId>org.slf4j</groupId>

    <artifactId>slf4j-api</artifactId>

    <version>1.7.25</version>

</dependency>

  </dependencies>

  <build>

    <finalName>Hibernatetest</finalName>

    <plugins>

<!-- define the project compile level -->

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-compiler-plugin</artifactId>

<version>2.3.2</version>

<configuration>

<source>1.8</source>

<target>1.8</target>

</configuration>

</plugin>

</plugins>

  </build>

</project>

注意:在最后运行的时候要是报某某class文件找不到的错误,那就是说明引入的jar包少了,在网上搜一下报错信息找到缺少的jar包,然后引入相应的jar包依赖即可,我在刚开始用的时候也是前前后后添加了好几个依赖...以上pom文件在我的机器上是不存在问题的。

2.2 使用

创建项目相应的文件,最后整个项目的主要文件结构如下:


其中domain包下放JavaBean,test包下放相应的测试例子,mapping路径下放映射文件,hibernate.cfg.xml是hibernate的配置文件,里面配置有数据库连接属性等内容,hibernate就是通过该文件进行初始化的。

(1)在domain包下建一个Student类,内容如下:

package com.domain;

public class Student {

private int id;

private String name;

private int age;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

}

该类将与数据库中的表进行映射,类中的属性便为数据库中的字段。

(2)在数据库中进行建表操作

create table tb_student(

  id int(10) primary key auto_increment, 

  name varchar(20),

  age int(3)

);

(3)修改hibernate.cfg.xml文件,其实使用properties文件一样可以,但是我比较习惯使用xml文件。具体内容如下:

<?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>

        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

        <property name="hibernate.connection.password">root</property>

        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mytest</property>

        <property name="hibernate.connection.username">root</property>

        <!-- 方言设置,不同的数据库有不同的方言信息,以下为mysql的 -->

        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

        <!--2.2.显示Hibernate在运行的时候执行的sql语句-->

        <property name="hibernate.show_sql">true</property>

        <!--2.3.格式化sql-->

        <property name="hibernate.format_sql">true</property>

        <!--2.4.自动建表-->

        <!-- 使用了该配置要是相应的表还没有被创建,那么在运行时hibernate会自动新建一个相应的表 -->

        <property name="hibernate.hbm2ddl.auto">update</property>

        <mapping resource="mapping/StudentMapping.hbm.xml"></mapping>

    </session-factory>

</hibernate-configuration>

//注意上面的mapping resource节点指明了映射文件所在路径

(4)在mapping文件夹新建一个StudentMapping.hbm.xml文件,该文件配置了映射类的信息,具体内容如下:

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

    <class name="com.domain.Student" table="tb_student">

        <!-- id字段表示数据库主键生成策略

        native 使 Hibernate 可以使用 identity, sequence 或 hilo 算法根据底层数据库的情况来创建主键。

        -->

        <id name="id" column="id" type="int">

            <generator class="native"/>

        </id>

        <!-- type属性会将Java类型转换为sql数据类型,name指实体类中的属性名称,column指在数据库中的列名 -->

        <property name="name" column="name"  type="java.lang.String" length="20"/>

        <property name="age" column="age" type="int"></property>

    </class>

</hibernate-mapping>

(5)在com.test包下新建一个测试类,具体内容如下:

package com.test;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.Transaction;

import org.hibernate.cfg.Configuration;

import com.domain.Student;

public class HibernateTest {

public static void main(String[] args) {

Configuration config = new Configuration().configure("hibernate.cfg.xml");

//开启会话工厂

SessionFactory sessionFactory = config.buildSessionFactory();

//开启会话

Session session = sessionFactory.openSession();

//开启事务

Transaction tr = session.beginTransaction();

try {

Student stu = new Student();

stu.setName("隔壁老王");

stu.setAge(17);

//保存数据

session.save(stu);

//记得要提交事务,不然不会保存的呀

tr.commit();

}catch(Exception e) {

e.printStackTrace();

tr.rollback();

   }

 }

}


运行,若控制台打印如下信息则表示执行成功:

查找tb_student表,看看数据是否被保存:

此处由于我们使用了mysql的主键自增,所以在进行保存的时候不用在显式的指明id的值。

常见的错误:

(1)保证自己的mysql在本地是可以被访问的

(2)hibernate.cfg.xml中关于数据库的配置信息要替换成自己的

(3)如何插入中文报错,说明数据库的默认编码方式不对,需要设置为utf-8。

下一节将记录hibernate注解的使用。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容