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` ) NOT NULL AUTO_INCREMENT, `userName` ) NOT NULL, `password` ) NOT NULL, `intro` ) DEFAULT NULL, UNIQUE KEY `id` (`id`) ) ENGINE DEFAULT CHARSET=utf8;
另外哦,这些是需要的包:
云盘地址:https://pan.baidu.com/s/1pjLgilqioH9Y9_EeNCCZlQ 密码:oc6y
以上就是Hibernate的简单应用啦,关于Hibernate的应用还有映射,所以大家加油啦,虽然SSH已经用了很久了,但是了解了Hibernate,MyBatis就会相对比较容易上手。
Hibernate学习之简单应用的更多相关文章
- Hibernate学习之——搭建log4j日志环境
昨天讲了Hibernate开发环境的搭建以及实现一个Hibernate的基础示例,但是你会发现运行输出只有sql语句,很多输出信息都看不见.这是因为用到的是slf4j-nop-1.6.1.jar的实现 ...
- Hibernate 学习笔记一
Hibernate 学习笔记一 今天学习了hibernate的一点入门知识,主要是配置domain对象和表的关系映射,hibernate的一些常用的配置,以及对应的一个向数据库插入数据的小例子.期间碰 ...
- Hibernate学习笔记-Hibernate HQL查询
Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...
- 我的hibernate学习记录(二)
通过上一篇文章我的hibernate学习记录(一)基本上的入门了hibernate,但是,里面还有还多东西是通过迷迷糊糊的记忆,或者说copy直接弄进去的,所以这篇文章就需要对上篇的一些文件.对象进行 ...
- Hibernate入门2.简单的项目开发实例
Hibernate入门2.简单的项目开发实例 这一节通过一个简单的项目学习Hibernate项目的配置 代码下载 : 链接: http://pan.baidu.com/s/1zlgjl 密码: p34 ...
- 关于Hibernate的一个简单小程序
本人根据视频学习了一下三大框架中比较简单的一个Hibernate,并简单完成了一个运用Hibernate的小程序 Hibernate是一个简化web程序Dao层的一个框架,应用他,可以完全脱离sql语 ...
- Hibernate学习---缓存机制
前言:这些天学习效率比较慢,可能是手头的事情比较多,所以学习进度比较慢. 在之前的Hibernate学习中,我们无论是CURD,对单表查询还是检索优化,我们好像都离不开session,session我 ...
- Hibernate学习笔记(二)
2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...
- Hibernate学习笔记(一)
2016/4/18 19:58:58 Hibernate学习笔记(一) 1.Hibernate框架的概述: 就是一个持久层的ORM框架. ORM:对象关系映射.将Java中实体对象与关系型数据库中表建 ...
随机推荐
- [转载]Doxygen C++ 注释风格
转载自:http://luchenqun.com/?p=761 做一个C++方面的符合Doxygen的注释文档,备用. 1.头文件根原文件注释.这个我也不知道需要注释什么.能想到的是:谁写的,里面有些 ...
- CF-831C
C. Jury Marks time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- python使用xlrd操作Excel文件
一.xlrd读取Excel文件 用xlrd进行读取比较方便,流程和平常手动操作Excel一样,打开工作簿(Workbook),选择工作表(sheets),然后操作单元格(cell). 例子:要打开当前 ...
- 4 pyspark学习---RDD
开始新的东西,其实很多操作在第二篇的时候就有所介绍啦.在这里继续学习一遍加深一下印象. 1关于RDD (1) RDD-----Resilient Distributed Dataset,弹性分布式数据 ...
- Angular6之ng build | ng build --aot | ng build --prod 差异
由于写了大半年的项目终于要告一段落并且即将进行第二阶段优化开发,emmm 基础版本已经二十多个模块了,必不可少的优化是很重要的,尽管项目上使用多层嵌套懒加载,但是在首屏加载的时候,任然很慢啊,因为一直 ...
- E20190212-mt
创建: 2019/02/12 reserve n. 储备; 保留; 保护区; 替补队员; vt. 储备; 保留; 预约; vi. 预订; slot n. 位置; 狭槽,水沟; [人名] ...
- Mac Apache
参考文章1 当前系统版本:Mac OS 10.11.6 一.使用 homebrew 安装 apache 停止系统自带的 apache 服务 $ sudo apachectl stop 卸载系统自带的 ...
- 小程序隐藏或自定义 scroll-view滚动条
css 隐藏滚动条 ::-webkit-scrollbar { width:; height:; color: transparent; } 自定义滚动条样式 ::-webkit-scrollbar ...
- bzoj 4541: [Hnoi2016]矿区【平面图转对偶图+生成树】
首先平面图转对偶图,大概思路是每条边存正反,每个点存出边按极角排序,然后找每条边在它到达点的出边中极角排序的下一个,这样一定是这条边所属最小多边形的临边,然后根据next边找出所有多边形,用三角剖分计 ...
- bzoj 1901: Zju2112 Dynamic Rankings【整体二分+树状数组||主席树+树状数组】
整体二分: 对于每一个修改操作,标记为1,并且加一个标记为-1的这个位置原来值,并且对于a数列每个点都当成修改操作 然后整体二分,扫当前操作区间lr,把在值域区间标记为1和-1的操作都在树状数组对应位 ...