Hibernate(1)-简介及基本操作

1.简介
1)项目中框架的体系结构

image.png

2)ORM框架:对象关系映射(Object Relational Mapping),是一种程序技术,用于实现对象编程语言里不同类型系统的数据之间的转换。
3)Hibernate:是一个开放源代码的对象关系映射的框架,它对JDBC进行了非常轻量级的对象封装。
(1)它将POJO与数据库建立映射关系,是一个全自动的持久化层ORM框架。
(2)Hibernate可以自动生产SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思想来操纵数据库。
(3)Hibernate可以用在任何使用JDBC的场合,既可以在Java的客户端程序中使用,也可以在Servlet/JSP的web应用中使用。
4)主流的ORM框架
(1)JPA:Java Persistence API,通过JDK5.0注解或XML描述对象-关系表的映射关系(只有接口规范);
(2)MyBatis:
(3)DBUtils:
5)Hibernate的优点
(1)对JDBC访问数据库的代码做了封装,大大简化了数据访问繁琐的重复性代码
(2)Hibernate是一个基于JDBC的主流持久层框架,是一个优秀的ORM实现,很大程度上简化了DAO层的编码工作
(3)使用了Java的反射机制
(4)性能非常号,轻量级框架,映射的灵活性很出色,支持很多关系型数据库,有一对一,多对多的各种复杂关系映射。
2.Hibernate的简单使用
1)下载位置:http://hibernate.org/orm/
2)创建数据库表:
3)配置核心配置文件hibernate.cfg.xml,配置数据库连接信息
4)映射文件hibernate mapping(*.hbm.xml),声明对象如何关联数据库表字段
5)调用hibernate的API
3.使用IDEA创建Hibernate项目
1)创建数据库

create database hibernate_demo01;
use hibernate_demo01;
create table t_user(
    id int auto_increment primary key,
    username varchar(50),
    password varchar(30)
);

2)使用IDEA创建Hibernate项目

(1)新建项目,勾选hibernate及web application选项
image.png
image.png
image.png

(2)导入mysql相关jar包

Ctrl+Alt+Shift+S:进入配置页面,导入mysql驱动
image.png

3)创建实体类;
package com.dhy.hibernate.domain;

public class User {
    private int uid;
    private String username;
    private String password;

    public int getUid() {
        return uid;
    }

    public void setUid(int uid) {
        this.uid = uid;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

4)配置hibernate.cfg.xml文件,及映射文件hibernate mapping(*.hbm.xml)关联数据库表字段
(1)配置hibernate.cfg.xml文件

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

        <!-- mysql的方言 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- 是否显示sql语句 -->
        <property name="show_sql">true</property>
        <!-- 是否格式化sql语句 -->
        <property name="format_sql">true</property>
        <!-- 是否自动提交事务,对于insert有效,对于delete无效,delete必须手动提交事务 -->
        <property name="connection.autocommit">true</property>
        <!-- 配置JavaBean与表的映射文件-->
        <mapping resource="com/dhy/hibernate/domain/User.hbm.xml"></mapping>
    </session-factory>
</hibernate-configuration>

(2)配置映射文件User.hbm.xml

<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!--  name:对应模型的全名称-->
    <class name="com.dhy.hibernate.domain.User" table="t_user">
        <!-- name:模型属性名;column:表字段名 -->
        <id name="uid" column="id">
            <!-- gengerator:id的生成策略,native是指id自增长 -->
            <generator class="native"></generator>
        </id>
        <!-- 模型属性名与表字段名相同时,不用配置column属性-->
        <property name="username"></property>
        <property name="password"></property>
    </class>
</hibernate-mapping>

5)测试

package com.dhy.hibernate.test;

import com.dhy.hibernate.domain.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

public class Test01 {
    @Test
    public void test01(){
        //保存用户数据
        //1.获取核心配置文件对象,默认是加载src的hibernate.cfg.xml文件
        Configuration cfg = new Configuration().configure();

        //2.创建会话工厂
        SessionFactory factory = cfg.buildSessionFactory();

        //3.创建会话,相当于连接Connect
        Session session = factory.openSession();

        //开启事务
        Transaction transaction = session.getTransaction();
        transaction.begin();

        //创建对象
        User user = new User();
        user.setUsername("dhy");
        user.setPassword("123456");

        session.save(user);

        //提交事务
        transaction.commit();
        //关闭会话
        session.close();
        //关闭工厂,释放资源
        factory.close();;
    }
}

控制台显示:
image.png

4.Hibernate相关解析

1)jar包
image.png

2)配置对象

(1)Hibernate的核心配置文件有多种样式:
image.png
hibernate.cfg.xml:通常使用下xml配置文件,可以配置内容更加丰富;
hibernate.properties:用于配置key/value形式的内容,key不能重复,有局限性,一般不用。
(2)Configuration对象:
        Configuration cfg = new Configuration().configure();

是用来加载配置文件的,new Configureation()构造方法加载的是hibernate.properties文件,comfigure()方法加载的是hibernate.cfg.xml文件。
image.png

配置文件一般放在src目录下,同时configure(String url)可以指定文件路径。
加载映射文件方式:
<1>在配置文件中配置【常用方式】:

<!-- 配置JavaBean与表的映射文件-->
       <mapping resource="com/dhy/hibernate/domain/User.hbm.xml"></mapping>

<2>在代码中添加映射文件:

//1.获取核心配置文件对象,默认是加载src的hibernate.cfg.xml文件
      Configuration cfg = new Configuration().configure();
      //另外一种添加映射文件的方式
      cfg.addResource("com/dhy/hibernate/domain/User.hbm.xml");

(3)SessionFactory工厂对象
<1>SessionFactory相当于java web 连接池,用于管理所有Session;
<2>获得SessionFactory方式:config.buildSessionFactory();
<3>还用于缓存配置信息;
(4)Session对象
<1>获取Session对象的方法:
①factory.openSession():创建一个全新的session对象;
②factory.getCurrentSession():同一线程中,session都是同一对象,使用该方法需要配置文件中开启,该方法不需要关闭session。

<!-- 开启与当前线程绑定session的功能-->
<property name="hibernate.current_session_context_class" >thread</property>

5.相关报错
1)报错SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".

原因:Hibernate使用的是slf4j日志格式,系统使用的是log4,存在兼容性问题,导入转换包;
image.png

注意版本需要一样,否则会出现下面错误:
image.png

2)报错Duplicate class/entity mapping
image.png

原因:映射文件重复配置
3)报错:WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
原因:字符串中没有配置SSL这个配置项
解决方式:
image.png

6.session中的常用 方法
1)增加:
save(Object o):

      //保存用户数据
      //1.获取核心配置文件对象,默认是加载src的hibernate.cfg.xml文件
      Configuration cfg = new Configuration().configure();
     /* //另外一种添加映射文件的方式
      cfg.addResource("com/dhy/hibernate/domain/User.hbm.xml");*/
      //2.创建会话工厂
      SessionFactory factory = cfg.buildSessionFactory();

      //3.创建会话,相当于连接Connect
      Session session = factory.openSession();

      //4.开启事务
      Transaction transaction = session.getTransaction();
      transaction.begin();

      //创建对象
      User user = new User();
      user.setUsername("dhy");
      user.setPassword("123456");
      //5.保存对象
      session.save(user);

      //6.提交事务,配置文件中配置了autoCommit时候可以不用这一步
      transaction.commit();
      //transaction.rollback();//回滚,try……catch()……中
      //7.释放资源
      session.close();
      factory.close();

2)删除:
delete(Object o):

         //1.获取配置文件对象
        Configuration configuration = new Configuration().configure();
        //2.获取SessionFacory对象
        SessionFactory factory = configuration.buildSessionFactory();
        //3.获取会话Session对象
        Session session = factory.openSession();
         //4.开启事务
        Transaction transaction =session.getTransaction();
        transaction.begin();
        //5.删除数据,先获取要删除的对象,然后删除
        User user = (User)session.get(User.class,2);
        session.delete(user);
        //5.删除数据,主动创建对象,然后删除
        /*User user = new User();
        user.setUid(3);
        session.delete(user);*/
        //6.提交事务,无论在配置文件中是否配置了autoCommit,此处都需要提交事务
        transaction.commit();
        //7.关闭资源
        session.close();
        factory.close();

3)修改:
update(Object o):更新对象
saveOrUpdate(Object o):保存或更新对象,当对象不存在(对象的id不存在)的时候就做保存操作,否则做更新操作

        //1.获取配置文件对象
        Configuration configuration = new Configuration().configure();
         //2.获取sessionFactory
        SessionFactory factory = configuration.buildSessionFactory();
        //3.获取连接对象
        Session session = factory.openSession();
        //4.开启事务
        Transaction transaction = session.getTransaction();
        transaction.begin();
      
        /*//5.获取需要修改的对象信息
        User user = (User)session.get(User.class,4);
        user.setUsername("qq");*/
        
        User user = new User();
        user.setUid(4);
        user.setUsername("QW");
        /*//6.1 更新对象
        session.update(user);*/

        //6.2
        session.saveOrUpdate(user);//首先判断User是否有id,有id就做update操作,否则做save操作
        // 提交事务
        transaction.commit();
        //7.关闭资源
        session.close();
        factory.close();

4)查找:
get():获取对象(通过id),获取一个数据库不存在的数据时候,返回空
load():获取对象(通过id),获取一个数据库不存在的数据时候,报错

        //1.获取配置文件对象
        Configuration configuration = new Configuration().configure();
        //2.获取SessionFacory对象
        SessionFactory factory = configuration.buildSessionFactory();
        //3.获取会话Session对象
        Session session = factory.openSession();

       /* //5.获取对象,get()获取对象,获取一个数据库不存在的数据时候,返回空
        User user = (User)session.get(User.class,2);
        User user2 = (User)session.get(User.class,6);
        System.out.println(user.toString());*/
        //5.获取对象,load()获取对象,获取一个数据库不存在的数据时候,报错
        User user3 = (User)session.load(User.class,2);
        User user4 = (User)session.load(User.class,6);
        System.out.println(user3.toString());

        //7.关闭资源
        session.close();
        factory.close();

7.get()与load()方法的区别
1)get()方法是直接加载数据库,在使用get()方法的时候就立即加载数据库;
2)load()方法是懒加载,只有用到时候才去查询数据库,方法返回的是对象的一个代理;也就是在使用load()方法的时候先创建一个代理对象(在缓存中查找,后面有介绍),当继续执行代码时候,用到了该对象的时候再进行数据库的加载。

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

推荐阅读更多精彩内容