分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 前端开发

Hibernate学习之简单应用

发布时间:2023-09-06 01:53责任编辑:赖小花关键词:Hibernate

  前言:博主在学到Spring的时候,要开始做项目了,突然觉得好像有点虚,之前学过的Hibernate框架的简单应用好像又忘记了。所以返回来,做个小笔记。


  简单来讲,Hibernate框架是利用对象-关系型数据映射(ORM)实现持久化(将数据存入可持久保存的存储设备中)。

  怎么用呢?这里有一个小demo,实现的是基于Annotation(注解)实现CRUD(增删改查)。可以简单分为三步。

  ① 创建实体类entity(这里的实体类就是UserInfo吧),实体类在此处的作用就跟JavaBean或POJO的作用一样,因为是用注解的方式底层直接设置映射,所以不需要映射文件啦。

package com.hibernate.entity;import javax.persistence.*;/** * ?* @author N.Y * 用户实体类 * *///使用Entity注解,表示当前类为实体Bean,需要进行持久化@Entity//使用Table注解实现数据表user_info与持久化类UserInfo之间的映射,catalog指定数据库名,name指定表名@Table(name="user_info", catalog="student")public class UserInfo { ???private int id; ?//id ???private String userName; ?//用户名 ???private String password; ?//密码 ???private String intro; ?//自我介绍 ???????//使用Id注解指定当前持久化类的ID标识属性 ???@Id ???//使用@GeneratedValue注解指定逐渐生成策略为IDENTITY ???@GeneratedValue(strategy=GenerationType.IDENTITY) ???//使用Column注解指定当前属性所对应的数据表中的字段,name指定字段名 ???//unique指定是否为唯一,nullable指定是否可为null,length指定字段长度 ???@Column(name="id",unique=true,nullable=false) ???public int getId() { ???????return id; ???} ???public void setId(int id) { ???????this.id = id; ???} ???????@Column(name="userName", length=16, nullable=false) ???public String getUserName() { ???????return userName; ???} ???public void setUserName(String userName) { ???????this.userName = userName; ???} ???????@Column(name="password", length=16, nullable=false) ???public String getPassword() { ???????return password; ???} ???public void setPassword(String password) { ???????this.password = password; ???} ???????@Column(name="intro", length=16) ???public String getIntro() { ???????return intro; ???} ???public void setIntro(String intro) { ???????this.intro = intro; ???} ???????public UserInfo() { ???????????} ???public UserInfo(String userName, String password) { ???????this.userName = userName; ???????this.password = password; ???} ???@Override ???public String toString() { ???????return "UserInfo [id="+id+",userName="+userName+",password="+password+", intro"+intro; ???}}

  其中,主键生成策略是通过GenetationType指定的,可以使用@GeneratedValue来指定主键生成策略。

主键生成策略枚举值

说明

GenerationType.IDENTITY

该策略用于MySQL,特点是递增,在MySQL建表的时候需将主键指定为auto_increment属性。

GenerationType.AUTO

自动选择一个最适合底层数据库主键生成策略(就是系统帮你选),这个是默认项。

GenerationType.SEQUENCE

根据底层数据库的序列来生成主键,条件是数据库支持序列,MySQL不支持,但Oracle支持。

GenerationType.TABLE

使用一个特定的数据库表格来保存主键,框架通过表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。

  ② 编写Hibernate的配置文件,该文件反映了持久化类(就上边儿的UserInfo)和数据库表的映射信息,像是数据库用户名啊、密码啊之类的,此处命名为hibernate.cfg.xml(注意,放在src文件夹下面就好),记得copy过去之后要因地制宜,修改密码跟数据库的连接信息,上面的注解信息也是要修改的。

<!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> ???????<!-- Hibernate连接的基本信息 -->
???????<property name="connection.username">root</property> ???????<property name="connection.password"></property> ???????<property name="connection.driver_class">com.mysql.jdbc.Driver</property> ???????<property name="connection.url">jdbc:mysql:///student</property> ???????????????<!-- Hibernate方言 --> ???????<property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property> ???????<!-- 是否打印SQL --> ???????<property name="show_sql">true</property> ???????<!-- 关联Hibernate的映射文件 --> ???????<mapping class="com.hibernate.entity.UserInfo"/> ???</session-factory></hibernate-configuration>

  至于这些属性的解释可以参考这篇文章:https://blog.csdn.net/tuke_tuke/article/details/49662601

 

  ③ 编写测试类

package com.hibernate.test;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.junit.After;import org.junit.Before;import org.junit.Test;import com.hibernate.entity.UserInfo;public class HibernateTest { ???private SessionFactory sessionFactory; ???private Session session; ???private Transaction transaction; ???@Before ???public void init(){ ???????//加载hibernate.cfg.xml ???????Configuration configuration = new Configuration().configure(); ???????//根据hibernate.cfg.xml配置,初始化SessionFactory ???????sessionFactory = configuration.buildSessionFactory(); ???????//创建session开始事务 ???????session = sessionFactory.openSession(); ???????//通过session开始事务 ???????transaction = session.beginTransaction(); ???} ???//添加数据 ???@Test ???public void testSaveUserInfo(){ ???????try{ ???????????//初始化UserInfo类 ???????UserInfo ui = new UserInfo("hibUser1","123456"); ???????UserInfo u = new UserInfo("hibUser2","123456"); ???????//保存 ???????session.save(ui); ???????session.save(u); ???????}catch(Exception e){ ???????????e.printStackTrace(); ???????} ???????????} ???@Test ???public void testGetUserInfo(){ ???????//从数据表user_info中加载编号id为1的用户对象 ???????UserInfo ui = (UserInfo)session.get(UserInfo.class, 4); ???????//在控制台输出用户对象信息 ???????System.out.println(ui.toString()); ???} ???@Test ???public void testLoadUserInfo(){ ???????//从数据表user_info中加载编号id为1的用户对象 ???????UserInfo ui = (UserInfo)session.load(UserInfo.class, 4); ???????System.out.println(ui.toString()); ???} ???@Test ???public void testDeleteUserInfo(){ ???????//从数据表user_info中加载编号id为4的用户对象 ???????UserInfo ui = (UserInfo)session.get(UserInfo.class, 8); ???????//删除对象 ???????session.delete(ui); ???} ???@Test ???public void testUpdateUserInfo(){ ???????//从数据表user_info中加载编号id为1的用户对象 ???????UserInfo ui = (UserInfo)session.get(UserInfo.class, 7); ???????//修改数据 ???????ui.setUserName("miaoyang"); ???????//更新对象 ???????session.update(ui); ???} ???@After ???public void destory(){ ???????//提交事务 ???????transaction.commit(); ???????//关闭session ???????session.close(); ???????//关闭sessionFactory ???????sessionFactory.close(); ???}}

  在这儿就不得不提Hibernate的基本执行流程啦。盯着这串代码哈。

public void init(){ ???????//加载hibernate.cfg.xml ???????Configuration configuration = new Configuration().configure(); ???????//根据hibernate.cfg.xml配置,初始化SessionFactory ???????sessionFactory = configuration.buildSessionFactory(); ???????//创建session开始事务 ???????session = sessionFactory.openSession(); ???????//通过session开始事务 ???????transaction = session.beginTransaction(); ???}
......
public void destory(){ ???????//提交事务 ???????transaction.commit(); ???????//关闭session ???????session.close(); ???????//关闭sessionFactory ???????sessionFactory.close(); ???}

  1、Configuration

  创建一个Configuration类的实例,以读取并解析配置文件(hibernate.cfg.xml),一个Configuration实例代表Hibernate所有的Java类到SQL数据库映射的集合。

  2、SessionFactory

  创建SessionFactory,以读取并解析映射信息,将Configuration对象中的所有配置信息复制到SessionFactory的缓存中。

  3、Session

  打开Session,让SessionFactory提供链接,并且调用Session接口提供的各种方法完成数据库操作。

  4、Transcation

  打开一个事务,提交事务之后就关闭Session。

  如果想要更加深入的了解的话,可以看下这篇文章的介绍哦:http://blog.51cto.com/wuwen2011/1537972。

  ④ 其实最最后面还少了一步的,就是数据库的创建。

CREATE DATABASE /*!32312 IF NOT EXISTS*/`student` /*!40100 DEFAULT CHARACTER SET utf8 */;USE `student`;/*Table structure for table `user_info` */DROP TABLE IF EXISTS `user_info`;CREATE TABLE `user_info` ( ?`id` int(4) NOT NULL AUTO_INCREMENT, ?`userName` varchar(16) NOT NULL, ?`password` varchar(16) NOT NULL, ?`intro` varchar(16) DEFAULT NULL, ?UNIQUE KEY `id` (`id`)) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

  以上就是Hibernate的简单应用啦,关于Hibernate的应用还有映射,所以大家加油啦,虽然SSH已经用了很久了,但是了解了Hibernate,MyBatis就会相对比较容易上手。

Hibernate学习之简单应用

原文地址:https://www.cnblogs.com/NYfor2018/p/9029933.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved