Hibernate之CRUD操作实践

Hibernate作为一个高度封装的持久层框架,曾经是非常牛逼的,现在虽然应用不是特别广,比如我前公司主要是做OA的,应用的框架就是Spring+SpringMVC+Hibernate。

Hibernate与MyBatis相比,虽然应用面不是特别广,但是并不代表就没有用武之地。

今天讲讲Hibernate的CRUD,本文主要告诉读者Hibernate是什么,为什么要使用HibernateHibernate的优缺点,Hibernate的基础实例应用。

一、Hibernate是什么

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的JaveEE架构中取代CMP,完成数据持久化的重任(这里引用百度的描述)

二、为什么要使用Hibernate

为什么要使用Hibernate,先不回答为什么要使用它,因为一项技术入世,一定有其应用的场景。

那么Hibernate的优点有哪些呢?

(1)标准的orm框架,程序员不需要编写SQL语句

(2)具有良好的数据库无关性,即数据库发生变化的话,代码无需再次编写;

任何事情有利也有弊

那么Hibernate的缺点有哪些呢?

(1)学习门槛高,需要对数据关系模型有良好的基础,而且在设置OR映射的时候,需要考虑好性能和对象模型的权衡;

(2)程序员不能自主的去进行SQL性能优化;

那么Hibernate的应用场景有哪些呢?

例如需求明确、业务固定的项目,比如OA项目、ERP、CRM等项目

三、Hibernate的基础实例

记得很久之前在初学Hibernate时,虽然网上有不少例子,但是我觉得都不是我想要的,因为很残缺不是特别系统,但是如果太系统化的话,必然会连载,但是我觉得对于初学者而言,有些时候看连载确实有点昏昏欲睡,没意思。这次实例是以maven工程作为示例,maven是当前最流行的项目管理工具之一。

接下来示例演示与说明:

1.导入maven依赖

<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/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>cn.example</groupId>
 <artifactId>hibernate-crud</artifactId>
 <version>0.0.1-SNAPSHOT</version>

  <dependencies>
    <!--hibernate -->
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>4.3.11.Final</version>
    </dependency>
    <!--MySQL数据库 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.44</version>
    </dependency>
    <!--junit单元测试 -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <!-- 指定jdk版本 -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.7.0</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

2.编写hibernate的主要配置文件

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>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/blog_test</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">1234</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.hbm2ddl.auto">update</property>
    <property name="current_session_context_class">thread</property>
    <mapping resource="mapping/User.hbm.xml"></mapping>
  </session-factory>
</hibernate-configuration>

数据库四要素:加载驱动、建立连接、用户名、密码。这些我就不多说了。

hibernate.dialect:数据库方言 hibernate的良好的可移植性就在这里体现,面对不同的数据库只需改方言即可适用

hibernate.show_sql:是否打印SQL语句 开发环境建议 生产环境不建议

hibernate.hbm2ddl.auto: 一般建议使用update 而不是使用create

current_session_context_class:这里主要针对session对象,后面我会有针对性地讲解

3.编写实体

User.java

package cn.blog.entity;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable{

  private static final long serialVersionUID = 1L;

  /**
   * 用户主键
   */
  private Integer userId;
  /**
   * 用户编码(登录账户) 手机号 邮箱号
   */
  private String loginCode;
  /**
   * 用户名
   */
  private String userName;
  /**
   * 密码
   */
  private String password;
  /**
   * 性别
   */
  private Integer sex;
  /**
   * 身份证
   */
  private String identityCard;
  /**
   * 创建时间
   */
  private String createTime;
  /**
   * 创建人
   */
  private String createBy;
  /**
   * 更新时间
   */
  private String updateTime;
  /**
   * 更新人
   */
  private String updateBy;
  /**
   * 状态:0注册新用户 1邮件认证用户 2管理员 3黑名单
   */
  private Integer status;

  public Integer getUserId() {
    return userId;
  }

  public void setUserId(Integer userId) {
    this.userId = userId;
  }

  public String getLoginCode() {
    return loginCode;
  }

  public void setLoginCode(String loginCode) {
    this.loginCode = loginCode;
  }

  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;
  }

  public Integer getSex() {
    return sex;
  }

  public void setSex(Integer sex) {
    this.sex = sex;
  }

  public String getIdentityCard() {
    return identityCard;
  }

  public void setIdentityCard(String identityCard) {
    this.identityCard = identityCard;
  }

  public String getCreateTime() {
    return createTime;
  }

  public void setCreateTime(String createTime) {
    this.createTime = createTime;
  }

  public String getCreateBy() {
    return createBy;
  }

  public void setCreateBy(String createBy) {
    this.createBy = createBy;
  }

  public String getUpdateTime() {
    return updateTime;
  }

  public void setUpdateTime(String updateTime) {
    this.updateTime = updateTime;
  }

  public String getUpdateBy() {
    return updateBy;
  }

  public void setUpdateBy(String updateBy) {
    this.updateBy = updateBy;
  }

  public Integer getStatus() {
    return status;
  }

  public void setStatus(Integer status) {
    this.status = status;
  }

  @Override
  public String toString() {
    return "User{" +
    "userId=" + userId +
    ", loginCode=" + loginCode +
    ", userName=" + userName +
    ", password=" + password +
    ", sex=" + sex +
    ", identityCard=" + identityCard +
    ", createTime=" + createTime +
    ", createBy=" + createBy +
    ", updateTime=" + updateTime +
    ", updateBy=" + updateBy +
    ", status=" + status +
    "}";
  }
}

4.编写实体对应的映射文件

User.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="cn.blog.entity.User" table="user">
    <id name="userId" type="java.lang.Integer">
      <column name="user_id"/>
      <generator class="identity" />
    </id>
    <!-- 映射CrUser类中的code属性 -->
    <property name="loginCode" type="string">
      <column name="login_code" length="10" not-null="true" unique="true" />
    </property>
    <property name="userName" type="string">
      <column name="user_name" length="20" not-null="true" unique="true" />
    </property>
     <property name="password" type="string">
      <column name="password" length="20" not-null="true" unique="true" />
    </property>

    <property name="sex" type="java.lang.Integer">
      <column name="sex" length="20" not-null="true" unique="true" />
    </property>

    <property name="identityCard" type="string">
      <column name="identity_card" length="20" not-null="true" unique="true" />
    </property>

    <property name="createTime" type="string">
      <column name="create_time" length="20" not-null="true" unique="true" />
    </property>

    <property name="createBy" type="string">
      <column name="create_by" length="20" not-null="true" unique="true" />
    </property>

    <property name="updateTime" type="string">
      <column name="update_time" length="20" not-null="true" unique="true" />
    </property>

    <property name="updateBy" type="string">
      <column name="update_by" length="20" not-null="true" unique="true" />
    </property>

    <property name="status" type="java.lang.Integer">
      <column name="status" length="20" not-null="true" unique="true" />
    </property>

  </class>
</hibernate-mapping>

column中的name属性作用:主要是使对象实体与表映射

type:实体属性

length:长度

not-null:是否为空 默认为false 不为空

unique 独特的唯一的

5.封装工具类

HibernateUtils.java

package cn.blog.utils;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil extends Object{
  private static SessionFactory sessionFactory;
  static
  {
    try{
      Configuration configuration=new Configuration().configure();
      sessionFactory = configuration.buildSessionFactory();
     }catch (Throwable ex){
        throw new ExceptionInInitializerError(ex);
    }
  }
   private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
  public static SessionFactory getSessionFactory() {
    return sessionFactory;
  }
  public static Session getSession() throws HibernateException
  {
    Session session = (Session) threadLocal.get();
    if (session == null){
      session = sessionFactory.openSession();
      threadLocal.set(session);
    }
      return session;
  }
  public static void closeSession() throws HibernateException {
    Session session = (Session) threadLocal.get();
    if (session != null)
      session.close();
    threadLocal.set(null);
  }

  public static void shutdown(){
    getSessionFactory().close();
  }

}

6.编写测试类

下面就是具体的crud操作 有部分注释了,只需去除注释即可测验效果。

package cn.blog.test;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

import cn.blog.entity.User;
import cn.blog.utils.HibernateUtil;

public class BlogTest {

  public static void main(String[] args) {
    //删除数据
    Session session = HibernateUtil.getSession();
    Transaction tx = session.beginTransaction();
    User user = new User();
    user.setUserId(2);
    user.setLoginCode("yc@163.com");
    user.setUserName("聪哥哥");
    user.setPassword("test123");
    user.setIdentityCard("1234");
    user.setCreateBy("系统");
    user.setCreateTime("2018-10-21 10:00");
    user.setUpdateBy("系统");
    user.setUpdateTime("2018-10-21 10:00");
    user.setSex(1);
    user.setStatus(1);
    session.delete(user);
    tx.commit();

  /**
     根据主键查询单条数据
    Session session = HibernateUtil.getSession();
    Transaction tx = session.beginTransaction();
    try {
        User user = (User) session.get(User.class, 1);
        System.out.println(user.getUserName());

        tx.commit();
    } catch (Exception e) {
      e.printStackTrace();
      tx.rollback();
    }finally {
      HibernateUtil.closeSession();
    }

    */

  /*
    更新数据
    Session session = HibernateUtil.getSession();
    Transaction tx = session.beginTransaction();
    try {
      User user = new User();
      user.setUserId(2);
      user.setLoginCode("yc@163.com");
      user.setUserName("聪哥哥");
      user.setPassword("test123");
      user.setIdentityCard("1234");
      user.setCreateBy("系统");
      user.setCreateTime("2018-10-21 10:00");
      user.setUpdateBy("系统");
      user.setUpdateTime("2018-10-21 10:00");
      user.setSex(1);
      user.setStatus(1);

      session.saveOrUpdate(user);
      System.out.println("update succes");
      tx.commit();

    } catch (Exception e) {
      e.printStackTrace();
      tx.rollback();
       System.out.println("update fail");
    }finally {
      HibernateUtil.closeSession();
    }

    */

/*
    模糊查询数据
    Session session = HibernateUtil.getSession();
    Transaction tx = session.beginTransaction();

    String userName="Y";
    Criteria c= session.createCriteria(User.class);
    c.add(Restrictions.like("userName", "%"+userName+"%"));

    List<User> user = c.list();
     for (User user2 : user) {
      System.out.println(user2.getUserName());
    }
    tx.commit();
  */

    /*

     新增数据
    Session session = HibernateUtil.getSession();
    Transaction tx = session.beginTransaction();
    try {

      User user = new User();
      user.setLoginCode("yc@163.com");
      user.setUserName("Y先生");
      user.setPassword("test123");
      user.setIdentityCard("1234");
      user.setCreateBy("系统");
      user.setCreateTime("2018-10-21 10:00");
      user.setUpdateBy("系统");
      user.setUpdateTime("2018-10-21 10:00");
      user.setSex(1);
      user.setStatus(1);
      session.save(user);
      System.out.println("insert data success");
      tx.commit();
    } catch (Exception e) {
      e.printStackTrace();
      tx.rollback();
      System.out.println("insert data fail");
    }finally {

      HibernateUtil.closeSession();
    }*/
  }
}

小结:

本文代码放置处为:https://github.com/youcong1996/study_simple_demo.git

分支为hibernate-crud分支

如果在复用我的这篇文章在实际遇到较多的问题而无法解决,可直接clone我的git仓库本地运行

如图所示:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Hibernate一级缓存和二级缓存详解

    一.一级缓存二级缓存的概念解释 (1)一级缓存就是Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中,如果短时间内这个session(一定要同一个session)又做了同一个操作,那么hibernate直接从一级缓存中拿,而不会再去连数据库,取数据: (2)二级缓存就是SessionFactory级别的缓存,顾名思义,就是查询的时候会把查询结果缓存到二级缓存中,如果同一个sessionFactory创建的某个session执行了相同的操作,hiber

  • Hibernate用ThreadLocal模式(线程局部变量模式)管理Session

    Hibernate ThreadLocal 它会为每个线程维护一个私有的变量空间.实际上, 其实现原理是在JVM 中维护一个Map,这个Map的key 就是当前的线程对象,而value则是 线程通过Hibernate ThreadLocal.set方法保存的对象实例.当线程调用Hibernate ThreadLocal.get方法时, Hibernate ThreadLocal会根据当前线程对象的引用,取出Map中对应的对象返回. 这样,Hibernate ThreadLocal通过以各个线程对

  • Hibernate实现many-to-many的映射关系

    Hibernate多对多 关联映射(many-to-many) 在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型: Hibernate会为我们创建中间关联表,转换成两个一对多. (1)一个最简单的例子就是学生选课的数据表了 (2)Student.java public class Course { private Integer id; private String name; private Set<StuCourse> stuCourses; //

  • Hibernate核心类和接口的详细介绍

    一.hiobernate核心类和接口预览图 二.hibernate.properties 这个文件是以前老版本使用的 类似于hibernate.cfg.xml文件:作用和hibernate.cfg.xml一致. 三.hibernate.cfg.xml  (1)详细介绍 ①该文件主要用于指定各个参数,是hibernate核心文件 ②默认放在src目录下,也可以放在别的目录下. ③指定连接数据库的驱动.用户名.密码.url.连接池.. ④指定对象关系映射文件的位置. ⑤也可使用hibernate.p

  • Hibernate中使用HQLQuery查询全部数据和部分数据的方法实例

    对于我们学习的HQL,我大概理解为就是一种查询的语言,它没有增加.删除.修改的作用,而对我们用来查询的操作,感觉用起来就是很简便,代码很少,很好理解一些. 下面是查询操作的简单实例 package com.lc.view; import java.util.Iterator; import java.util.List; import org.hibernate.Session; import org.hibernate.Transaction; import com.lc.domain.Stu

  • hibernate测试时遇到的几个异常及解决方法汇总

    今天使用hibernate3.6.5自己配置jar lib,在测试时遇到了几个异常如下: 1.java.lang.NoSuchFieldError: INSTANCE 解决:删除hibernate-annotations.jar. 2.java.lang.ClassCastException: org.hibernate.annotations.common.reflection.java.JavaReflectionManager cannot be cast to org.hibernate

  • Hibernate的各种保存方式的区别详解

    hibernate的保存  hibernate对于对象的保存提供了太多的方法,他们之间有很多不同,这里细说一下,以便区别: 一.预备知识:  在所有之前,说明一下,对于hibernate,它的对象有三种状态,transient.persistent.detached  下边是常见的翻译办法: transient:瞬态或者自由态 persistent:持久化状态 detached:脱管状态或者游离态 脱管状态的实例可以通过调用save().persist()或者saveOrUpdate()方法进行

  • SpringBoot 使用hibernate validator校验

    本文将全面的介绍如何使用 validator 进行数据校验 本文源码: https://gitee.com/yintianwen7/taven-springboot-learning/tree/master/springboot-validate 准备工作 我们只需要引入 spring-boot-starter-web 包即可使用 1.常用注解 常用注解 2.简单的实体校验 public class CardDTO { @NotBlank private String cardId; @Size

  • Hibernate中Session.get()方法和load()方法的详细比较

    一.get方法和load方法的简易理解 (1)get()方法直接返回实体类,如果查不到数据则返回null.load()会返回一个实体代理对象(当前这个对象可以自动转化为实体对象),但当代理对象被调用时,如果没有数据不存在,就会抛出个org.hibernate.ObjectNotFoundException异常 (2)load先到缓存(session缓存/二级缓存)中去查,如果没有则返回一个代理对象(不马上到DB中去找),等后面使用这个代理对象操作的时候,才到DB中查询,这就是我们常说的 load

  • Hibernate连接三种数据库的配置文件

    Hibernate连接数据库的配置文件为hibernate.cfg.xml,下面列出了连接三种数据库(SQL Server.Oracle.MySQL)时,hibernate.cfg.xml的必要配置. 连接MySql的配置 <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN

随机推荐