ORM-02-Hibernate 对象关系映射(ORM)框架

拓展阅读

The jdbc pool for java.(java 手写 jdbc 数据库连接池实现)

The simple mybatis.(手写简易版 mybatis)

Hibernate

Hibernate ORM 允许开发者更轻松地编写那些数据在应用程序进程结束后仍然存在的应用程序。

作为一个对象关系映射(ORM)框架,Hibernate 关注的是与关系数据库(通过 JDBC)相关的数据持久化。

hibernate

Hello world

  • Event.java
/*** Created by houbinbin on 16/5/18.*/
public class Event {private Long id;private String title;private Date date;//
}
  • HibernateUtil.java
public class HibernateUtil {private static SessionFactory sessionFactory;private HibernateUtil() {}public static SessionFactory getSessionFactory() {if(sessionFactory == null) {sessionFactory = new Configuration().configure().buildSessionFactory();}return sessionFactory;}
}
  • EventService.java
public class HibernateUtil {private static SessionFactory sessionFactory;private HibernateUtil() {}public static SessionFactory getSessionFactory() {if(sessionFactory == null) {sessionFactory = new Configuration().configure().buildSessionFactory();}return sessionFactory;}
}
  • EventTest.java is today’s lead.
public class EventTest extends TestCase {private EventService eventService;@Beforepublic void setUp() {eventService = new EventService();}@Testpublic void testCreate() {eventService.createAndStoreEvent("create Event", new Date());}@Testpublic void testQuery() {List<Event> events = eventService.listEvents();for (Event event : events) {System.out.println(event);}}@Afterpublic void tearDown() {HibernateUtil.getSessionFactory().close();}
}

run testCreate()

INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
Hibernate: insert into EVENT (EVENT_DATE, title) values (?, ?)

run testQuery()

Hibernate: select event0_.EVENT_ID as EVENT_ID1_0_, event0_.EVENT_DATE as EVENT_DA2_0_, event0_.title as title3_0_ from EVENT event0_
五月 20, 2016 12:05:45 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH10001008: Cleaning up connection pool [jdbc:mysql://localhost/hibernate]
Event{id=1, title='My Event', date=2016-05-19 21:48:56.0}
Event{id=2, title='Test Event', date=2016-05-19 22:58:43.0}
Event{id=3, title='create Event', date=2016-05-19 23:32:49.0}
Event{id=4, title='create Event', date=2016-05-20 00:04:40.0}Process finished with exit code 0

Annotation

Now, let’s use annotation way to achieve code above.

  • Student.java
/*** Created by houbinbin on 16/5/20.*/
@Entity
public class Student {private Long id;private String name;private int score;//getter and setter...//default constructor and with members' constructor//toString()}
  • StudentService.java
public class StudentService extends BaseService<Student> {public String getEntityName() {return "Student";}
}
  • BaseService.java
/*** Created by houbinbin on 16/5/20.*/
public abstract class BaseService<T> {/*** get current entity's name;* @return*/public abstract String getEntityName();/*** save the entity.* @param entity* @return*/public Serializable save(T entity) {Session session = HibernateUtil.getSessionFactory().getCurrentSession();session.beginTransaction();Serializable result = session.save(entity);session.getTransaction().commit();return result;}/*** list all data of entity;* @return*/public List<T> list() {Session session = HibernateUtil.getSessionFactory().getCurrentSession();session.beginTransaction();List<T> result = session.createQuery("FROM " + getEntityName()).list();session.getTransaction().commit();return result;}/*** show the list* - you need write the correct toString() of entity;*/public void show() {List<T> result = list();for(T entity : result) {System.out.println(entity);}}
}
  • StudentTest.java
public class StudentTest extends TestCase {private StudentService studentService;@Beforepublic void setUp() {studentService = new StudentService();}@Testpublic void testCreate() {Student student = new Student("xiaoming", 70);studentService.save(student);}@Testpublic void testShow() {studentService.show();}@Afterpublic void tearDown() {HibernateUtil.getSessionFactory().close();}
}

Mapping

  • @Table

The identifier uniquely identifies each row in that table. By default the name of the table is assumed to be the
same as the name of the entity. To explicitly give the name of the table or to specify other information about the table,
we would use the javax.persistence.Table annotation.

@Entity
@Table(name="t_simple")
public class Simple {private int id;@Id@GeneratedValuepublic int getId() {return id;}public void setId(int id) {this.id = id;}
}

the created table named t_simple.

  • @Basic

Strictly speaking, a basic type is denoted with the javax.persistence.Basic annotation.
Generally speaking the @Basic annotation can be ignored. Both of the following examples are ultimately the same.

so, the code above is the same as…

@Entity
@Table(name="t_simple")
public class Simple {private int id;@Id@GeneratedValue@Basicpublic int getId() {return id;}public void setId(int id) {this.id = id;}
}
  • @Column

For basic type attributes, the implicit naming rule is that the column name is the same as the attribute name.
If that implicit naming rule does not meet your requirements, you can explicitly tell Hibernate (and other providers) the column name to use.

@Entity
public class Simple {private int id;@Id@GeneratedValue@Column(name="t_id")public int getId() {return id;}public void setId(int id) {this.id = id;}
}

the created table column will be “t_id”.

  • @Enumerated

ORDINAL - stored according to the enum value’s ordinal position within the enum class, as indicated by java.lang.Enum#ordinal

STRING - stored according to the enum value’s name, as indicated by java.lang.Enum#name

@Entity
public class Simple {private int id;private Gender gender;@Id@GeneratedValuepublic int getId() {return id;}public void setId(int id) {this.id = id;}@Enumerated(STRING)public Gender getGender() {return gender;}public void setGender(Gender gender) {this.gender = gender;}public static enum Gender {MALE, FEMALE}
}

result is MALE;

change into

@Enumerated
public Gender getGender() {return gender;
}

result is 0;

Spring

When hibernate meets spring, things will be interesting…What I want to say, is hibernate’s model define.

  • hbm.xml
<bean id="mySessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"><property name="mappingResources"><list><value>user.hbm.xml</value></list></property>
</bean>
  • class
<property name="annotatedClasses"><list><value>com.ryo.model.User</value></list>
</property>
  • auto scan
<property name="packagesToScan"><list><value>com.ryo.model.*</value></list>
</property>

packagesToScan specify packages to search for autodetection of your entity classes in the classpath.

So, the * in com.ryo.model.*is stand for package name. If your model classes are like this…

/com/ryo/model/- User.java

You need write com.ryo.*

Or, you can write like this…

<list><value>com.ryo.model</value>
</list>

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/644966.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于蝗虫优化的KNN分类特征选择算法的matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 KNN分类器基本原理 4.2 特征选择的重要性 4.3 蝗虫优化算法&#xff08;GOA&#xff09; 5.完整程序 1.程序功能描述 基于蝗虫优化的KNN分类特征选择算法。使用蝗虫优化算法&#xff…

C++入门语法———命名空间,缺省参数,重载函数

文章目录 一.命名空间1.存在意义2.语法使用1.定义命名空间2.使用命名空间的三种方式 二.缺省参数1.全缺省参数2.半缺省参数 三.重载函数1.定义2.重载原理———名字修饰 一.命名空间 1.存在意义 C命名空间的主要意义是为了避免命名冲突&#xff0c;尤其是在大型项目中可能存在…

“高级SPA项目构建与路由实现“

目录 引言1. SPA项目构建1.1 安装vue-cli,webpack1.2 创建 Vue.js项目1.3 “一问一答”模式1.4 启动项目 2. SPA项目完成路由3. 基于SPA项目完成嵌套路由总结 引言 在现代Web开发中&#xff0c;单页应用&#xff08;SPA&#xff09;已经成为一种流行的开发模式。SPA通过在前端…

优优嗨聚:美团代运营服务,为商家赋能,打造流量转化的秘密武器

随着互联网的飞速发展&#xff0c;人们越来越依赖线上平台进行消费。作为国内领先的电商平台之一&#xff0c;美团吸引了众多商家入驻。然而&#xff0c;如何在竞争激烈的美团平台上脱颖而出&#xff0c;成为了商家们面临的一大挑战。此时&#xff0c;美团代运营服务应运而生&a…

HTML5和CSS3的新特性

HTML5的新特性主要是针对于以前的不足&#xff0c;增加了一些新的标签、新的表单和新的表单属性等 1&#xff0c;HTML5新增的语义化标签 <header> 头部标签 <nav> 导航标签 <article> …

《WebKit 技术内幕》学习之九(4): JavaScript引擎

4 实践——高效的JavaScript代码 4.1 编程方式 关于如何使用JavaScript语言来编写高效的代码&#xff0c;有很多铺天盖地的经验分享&#xff0c;以及很多特别好的建议&#xff0c;读者可以搜索相关的词条&#xff0c;就能获得一些你可能需要的结果。同时&#xff0c;本节希望…

记录centos安装nginx过程和问题

今天在centos上安装了nginx&#xff0c;遇到了些问题&#xff0c;记录一下。 使用yum直接安装的话安装的版本是1.20.1&#xff0c;使用源码包安装可以装到1.25.0&#xff08;最新稳定版&#xff09;。很有意思的一点是两种安装方法下安装的路径是不同的&#xff0c;且源码安装…

Java 面向对象案例 03(黑马)

代码&#xff1a; public class phoneTest {public static void main(String[] args) {phone [] arr new phone[3];phone p1 new phone("华为",6999,"白色");phone p2 new phone("vivo",4999,"蓝色");phone p3 new phone("苹…

手把手教你用深度学习做物体检测(一): 快速感受物体检测的酷炫

我们先来看看什么是物体检测&#xff0c;见下图&#xff1a; 如上图所示&#xff0c; 物体检测就是需要检测出图像中有哪些目标物体&#xff0c;并且框出其在图像中的位置。 本篇文章&#xff0c;我将会介绍如何利用训练好的物体检测模型来快速实现上图的效果&#xff0c;这里…

Pyside6中QTableWidget使用

目录 一&#xff1a;介绍&#xff1a; 二&#xff1a;演示 一&#xff1a;介绍&#xff1a; 在 PySide6 中&#xff0c;QTableWidget 是一个用于展示和编辑表格数据的控件。它提供了在窗口中创建和显示表格的功能&#xff0c;并允许用户通过单元格来编辑数据。 要使用 QTabl…

Windows 下 TFTP 服务搭建及 U-Boot 中使用 tftp 命令实现文件下载

目录 Tftpd32/64文件下载更多内容 TFTP&#xff08;Trivial File Transfer Protocol&#xff0c;简单文件传输协议&#xff09;是 TCP/IP 协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议&#xff0c;提供不复杂、开销不大的文件传输服务&#xff0c;端口号为 6…

免费SSL申请和自动更新

当前是在mac下操作 安装certbot # mac下brew安装即可 brew install certbotcentos 安装 centos安装文档 申请泛解析证书 sudo certbot certonly --manual --preferred-challengesdns -d *.yourdomain.com## 输出 Saving debug log to /var/log/letsencrypt/letsencrypt.lo…

[Android] Android文件系统中存储的内容有哪些?

文章目录 前言root 文件系统/system 分区稳定性:安全性: /system/bin用来提供服务的二进制可执行文件:调试工具:UNIX 命令&#xff1a;调用 Dalvik 的脚本(upall script):/system/bin中封装的app_process脚本 厂商定制的二进制可执行文件: /system/xbin/system/lib[64]/system/…

6.php开发-个人博客项目Tp框架路由访问安全写法历史漏洞

目录 知识点 php框架——TP URL访问 Index.php-放在控制器目录下 ​编辑 Test.php--要继承一下 带参数的—————— 加入数据库代码 --不过滤 --自己写过滤 --手册&#xff08;官方&#xff09;的过滤 用TP框架找漏洞&#xff1a; 如何判断网站是thinkphp&#x…

nvm安装与使用教程

目录 nvm是什么 nvm安装 配置环境变量 更换淘宝镜像 安装node.js版本 nvm list available 显示可下载版本的部分列表 nvm install 版本号 ​编辑 nvm ls 查看已经安装的版本 ​编辑 nvm use 版本号(切换想使用的版本号) nvm是什么 nvm是node.js version management的…

mfc110.dll丢失是什么意思?全面解析mfc110.dll丢失的解决方法

在使用计算机的过程中&#xff0c;用户可能会遭遇一个常见的困扰&#xff0c;即系统提示无法找到mfc110.dll文件。这个动态链接库文件&#xff08;DLL&#xff09;是Microsoft Foundation Classes&#xff08;MFC&#xff09;库的重要组成部分&#xff0c;对于许多基于Windows的…

代码随想录刷题笔记 DAY12 | 二叉树的理论基础 | 二叉树的三种递归遍历 | 二叉树的非递归遍历 | 二叉树的广度优先搜索

Day 12 01. 二叉树的理论基础 1.1 二叉树的种类 满二叉树&#xff1a;除了叶子节点以外&#xff0c;每个节点都有两个子节点&#xff0c;整个树是被完全填满的完全二叉树&#xff1a;除了底层以外&#xff0c;其他部分是满的&#xff0c;底部可以不是满的但是必须是从左到右连…

数据结构之受限线性表

受限线性表 对于一般线性表&#xff0c;虽然必须通过遍历逐一查找再对目标位置进行增、删和查操作&#xff0c;但至少一般线性表对于可操作元素并没有限制。说到这里&#xff0c;大家应该明白了&#xff0c;所谓的受限线性表&#xff0c;就是可操作元素受到了限制。 受限线性表…

【Web前端开发基础】CSS3之Web字体、字体图标、平面转换、渐变

CSS3之Web字体、字体图标、平面转换、渐变 目录 CSS3之Web字体、字体图标、平面转换、渐变一、Web字体1.1 Web字体概述1.2 字体文件1.3 font-face 规则 二、字体图标2.1 字体图标2.2 字体图标的优点2.3 图标库2.4 下载字体包2.5 字体图标的使用步骤2.6 字体图标使用注意点2.7 上…