1. 前言

        Hibernate是一个开放源代码的ORM持久化框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

        所谓ORM,即Object-Relational Mapping,它的作用就是在关系型数据库和对象之间做了一个映射。从对象(Object)映射到关系(Relation),再从关系映射到对象。这样,我们在操作数据库的时候,不需要再去和复杂SQL打交道,只要像操作对象一样操作它就可以了

        持久化,即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。

2. 入门

(1)jar包引入:

       

        除了sqljdbc.jar可根据自己的数据库驱动换成其他jar包,其他包都是必须的。下载地址:http://hibernate.org/orm/。因为本例中我们需要使用注解,所以请下载3.0版本以上的包。

(2)数据表准备

  1 CREATE TABLE tbUser (
2 userID VARCHAR(50),
3 loginName VARCHAR(200),
4 userName VARCHAR(200),
5 passWord VARCHAR(200)
6 )

(3)创建表tbUser对应的对象

        所谓的ORM就是要将关系型数据库的数据表映射为JAVA对象,所以理所应当的我们需要为tbUser表建立一个JAVA对象与其相对应。

  1 package com.luych.hibernate.study.entity;
2
3 import javax.persistence.Entity;
4 import javax.persistence.Id;
5 import javax.persistence.Table;
6
7 @Entity
8 @Table(name="tbUser")
9 public class UserEntity {
10
11 @Id
12 private String userID;
13 private String loginName;
14 private String userName;
15 private String passWord;
16
17 public String getUserID() {
18 return userID;
19 }
20 public void setUserID(String userID) {
21 this.userID = userID;
22 }
23 public String getLoginName() {
24 return loginName;
25 }
26 public void setLoginName(String loginName) {
27 this.loginName = loginName;
28 }
29 public String getUserName() {
30 return userName;
31 }
32 public void setUserName(String userName) {
33 this.userName = userName;
34 }
35 public String getPassWord() {
36 return passWord;
37 }
38 public void setPassWord(String passWord) {
39 this.passWord = passWord;
40 }
41 @Override
42 public String toString() {
43 return loginName+", "+userName+", "+passWord+", "+userID;
44 }
45
46
47 }

        @Entity: 此注解来通知Hibernate,该对象为ORM对象。

        @Table(name="tbUser"):此注解来通知Hibernate,该对象对应的数据表为tbUser,将来针对此对象的新增、修改、删除、查询等操作都会映射到tbUSer数据表中。

        @id:此注解表示userID为主键,是对象的唯一标识,一般数据库设计时候也会将userID字段设置为主键。Hibernage的对象缓存会根据@id标识的主键来进行处理。

        @Column:此注解在本例中没有出现。当数据库中字段名和JAVA对象属性名称不一致的时候,可以用此注解来描述其对应关系。如下例(数据库字段为LOGIN_NAME,对象属性为loginName):

  1 @Column(name="LOGIN_NAME")
2 private String loginName;

        @Transient:此注解在本例中也没有出现。如果JAVA对象中的某个属性,并没有数据表的字段与其相对应,那么就用此注解标注该属性。Hibernate针对此对象进行增删改查的时候回忽略此属性。例如:我们要为UserEntity对象增加一个登陆次数(由其他数据表统计而来),那么处理如下:

  1 @Transient
2 private int loginCnt;

        另外,我们改造了toString方法,后面的测试代码中将要用到。

(4)配置Hibernate文件

         建立Hibernate的配置文件,路径和文件名任意。本例为:hibernate-config.xml。内容如下:

  1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE hibernate-configuration PUBLIC
3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
4 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
5 <hibernate-configuration>
6 <session-factory>
7 <!-- 设置数据库驱动 -->
8 <property name="hibernate.connection.driver_class">
9 com.microsoft.sqlserver.jdbc.SQLServerDriver
10 </property>
11 <!-- 设置数据库URL -->
12 <property name="hibernate.connection.url">
13 jdbc:sqlserver://192.168.9.23:14433;databaseName=tempdb
14 </property>
15 <!-- 数据库用户名 -->
16 <property name="hibernate.connection.username">sa</property>
17 <!-- 数据库密码 -->
18 <property name="hibernate.connection.password">123@abcd</property>
19 <!-- beans -->
20 <mapping class="com.luych.hibernate.study.entity.UserEntity"/>
21 </session-factory>
22 </hibernate-configuration>

        该配置文件中,我们为Hibernate设置了数据库连接信息(驱动、URL、用户名以及密码,这些信息请根据自己实际情况来做相应变更),并通知Hibernate我们刚刚创建的UserEntity对象(mapping class="com.luych.hibernate.study.entity.UserEntity")。

(5)测试运行

  1 package com.luych.hibernate.study.main;
2
3 import java.util.List;
4 import java.util.UUID;
5
6 import org.hibernate.Query;
7 import org.hibernate.Session;
8 import org.hibernate.SessionFactory;
9 import org.hibernate.cfg.Configuration;
10 import org.junit.After;
11 import org.junit.Before;
12 import org.junit.Test;
13
14 import com.luych.hibernate.study.entity.UserEntity;
15
16 @SuppressWarnings("unchecked")
17 public class TestMain {
18
19 private Session session;
20
21 @Before
22 public void getSession(){
23 //请根据自己在第三部中创建的xml文件路径及名称调整configure参数值
24 Configuration config = new Configuration().configure("hibernate-config.xml");
25 SessionFactory sessionFactory = config.buildSessionFactory();
26 session = sessionFactory.openSession();
27 }
28
29 @After
30 public void freeSession(){
31 session.close();
32 }
33
34 public void sel() {
35 Query query = session.createQuery("FROM UserEntity WHERE 1=1");
36 List<UserEntity> userList = query.list();
37 for (UserEntity userEntity : userList) {
38 System.out.println(userEntity.toString());
39 }
40 }
41
42 public void add() {
43 session.beginTransaction();
44 UserEntity user = new UserEntity();
45 user.setLoginName("luych");
46 user.setUserName("卢艳超");
47 user.setPassWord("12333");
48 user.setUserID(UUID.randomUUID().toString());
49 session.save(user);
50 session.getTransaction().commit();
51 }
52
53 public void edt(){
54 session.beginTransaction();
55 Query query = session.createQuery("FROM UserEntity WHERE 1=1");
56 List<UserEntity> userList = query.list();
57 for (UserEntity userEntity : userList) {
58 userEntity.setPassWord("45666");
59 session.update(userEntity);
60 }
61 session.getTransaction().commit();
62 }
63
64 public void del(){
65 session.beginTransaction();
66 Query query = session.createQuery("FROM UserEntity WHERE 1=1");
67 List<UserEntity> userList = query.list();
68 for (UserEntity userEntity : userList) {
69 session.delete(userEntity);
70 }
71 session.getTransaction().commit();
72 }
73
74 @Test
75 public void test(){
76 System.out.println("当前已有数据:");
77 sel();
78 del();
79 System.out.println("执行删除后:");
80 sel();
81 add();
82 add();
83 System.out.println("执行新增后");
84 sel();
85 edt();
86 System.out.println("执行修改后");
87 sel();
88 }
89 }
90

         以上代码里,getSession方法用来根据hibernate-config.xml配置文件来获取。freeSession方法用来关闭不再使用的Session。sel方法用来查询当前数据库中的所有数据并打印到控制台;add方法即要新增一条数据;edt方法将所有的passWord都改为45666;del方法将删除所有的数据。大家看一下test方法,然后我们右键,Run As JUnit Test,控制台输出结果为:

  1 当前已有数据:
2 luych, 卢艳超, 45666, 50420e9c-e751-41c3-a33d-0b6d09924da8
3 luych, 卢艳超, 45666, 58bd812c-4e43-4248-b0c9-9c3576c6d47c
4 执行删除后:
5 执行新增后
6 luych, 卢艳超, 12333, 9660637e-5447-42c0-bcfb-2b24786bc0e8
7 luych, 卢艳超, 12333, c0631818-cc91-4691-93fc-159c2cabe37d
8 执行修改后
9 luych, 卢艳超, 45666, 9660637e-5447-42c0-bcfb-2b24786bc0e8
10 luych, 卢艳超, 45666, c0631818-cc91-4691-93fc-159c2cabe37d

        可以看到我们的增删改查操作都成功的完成了。

 

        以上就是Hibernate的入门基本操作,后续还会有其他探究。本文仅当是抛砖引玉吧,愿大家共勉。

Hibernate(一)——入门的更多相关文章

  1. Hibernate从入门到精通(十一)多对多双向关联映射

    上次我们在中Hibernate从入门到精通(十)多对多单向关联映射讲解了一下多对多单向关联映射,这次我们讲解一下七种映射中的最后一种多对多双向关联映射. 多对多双向关联映射 按照我们之前的惯例,先看一 ...

  2. Hibernate从入门到精通(十)多对多单向关联映射

    上一篇文章Hibernate从入门到精通(九)一对多双向关联映射中我们讲解了一下关于一对多关联映射的相关内容,这次我们继续多对多单向关联映射. 多对多单向关联映射 在讲解多对多单向关联映射之前,首先看 ...

  3. Hibernate从入门到精通(九)一对多双向关联映射

    上次的博文Hibernate从入门到精通(八)一对多单向关联映射中,我们讲解了一下一对多单向映射的相关内容,这次我们讲解一下一对多双向映射的相关内容. 一对多双向关联映射 一对多双向关联映射,即在一的 ...

  4. Hibernate从入门到精通(八)一对多单向关联映射

    上次的博文Hibernate从入门到精通(七)多对一单向关联映射我们主要讲解了一下多对一单向关联映射,这次我们继续讲解一下一对多单向映射. 一对多单向关联映射 在讲解一对多单向关联之前,按照我们的惯例 ...

  5. Hibernate从入门到精通(七)多对一单向关联映射

    上次的博文Hibernate从入门到精通(六)一对一双向关联映射中我们介绍了一下一对一双向关联映射,本次博文我们讲解一下多对一关联映射 多对一单向关联映射 多对一关联映射与一对一关联映射类似,只是在多 ...

  6. Hibernate从入门到精通(六)一对一双向关联映射

    在上次的博文Hibernate从入门到精通(五)一对一单向关联映射中我们讲解了一下一对一单向关联映射,这次我们继续讲解一下与之对应的一对一双向关联映射. 一对一双向关联 与一对一单向关联映射所不同的的 ...

  7. Hibernate从入门到精通(五)一对一单向关联映射

    上次的博文中Hibernate从入门到精通(四)基本映射我们已经讲解了一下基本映射和相关概念,接下来我们会讲稍微复杂点的映射——关系映射. 关系映射分类 关系映射即在基本映射的基础上处理多个相关对象和 ...

  8. Hibernate从入门到精通(四)基本映射

    映射的概念 在上次的博文Hibernate从入门到精通(三)Hibernate配置文件我们已经讲解了一下Hibernate中的两种配置文件,其中提到了两种配置文件的主要区别就是XML可以配置映射.这里 ...

  9. Hibernate从入门到精通(三)Hibernate配置文件

    在上次的博文Hibernate从入门到精通(二)Hibernate实例演示我们已经通过一个实例的演示对Hibernate的基本使用有了一个简单的认识,这里我们在此简单回顾一下Hibernate框架的使 ...

  10. Hibernate从入门到精通(二)Hibernate实例演示

    上篇Hibernate从入门到精通(一)JDBC简介,我们主要对JDBC进行了简单介绍和使用说明,这次我们做一个Hibernate简单实例,通过这个实例对比Hibernate和JDBC,了解Hiber ...

随机推荐

  1. SpringAOP源码跟踪及学习

    Spring 版本 4.3.2 在拿到 Bean 实例以后,会经历一系列的初始化工作,如:工厂回调.init 方法.后处理器在 Bean 初始化前后的处理等,在一般情况下(非 factory-meth ...

  2. Day7 - J - Raising Modulo Numbers POJ - 1995

    People are different. Some secretly read magazines full of interesting girls' pictures, others creat ...

  3. 001.Oracle数据库 , 查询日期在两者之间

    /*Oracle数据库查询日期在两者之间*/ SELECT OCCUR_DATE FROM LM_FAULT WHERE ( ( OCCUR_DATE >= to_date( '2017-05- ...

  4. [题解] LuoguP5666 树的重心

    这个题......确实是CSPNOIP题qwq 感觉猜到一个性质就差不多了,首先,对于一棵树,随便拎一个节点\(rt\)当根节点,那么他的重心一定在\(rt\)的重儿子里,进一步的,可以发现重心一定在 ...

  5. 创建一个TCP代理

    代理技术 代理一般被我们用于"穿墙",具体来说可以看这里,或者查wiki.理解代理背后的原理之后,便很容易知道,代理的作用不仅仅只是"穿墙".例如我们可以把经过 ...

  6. 吴裕雄--天生自然java开发常用类库学习笔记:ListIterator接口

    import java.util.ArrayList ; import java.util.List ; import java.util.ListIterator ; public class Li ...

  7. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-repeat

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  8. 2.9 学习总结 之 【Android】体温统计APP

    一.说在前面 昨天 学习了JQ的相关知识 今天 编写体温统计APP 我的工程源码:https://github.com/xiaotian12-call/Take-body-temperature 二. ...

  9. JVM--a == (a = b)基于栈的解释器执行过程

    前言 在翻阅ConcurrentLinkedQueue的代码的时候,发现这样一段代码在JDK源码中总是出现. t != (t = tail) 原先总是以为这不就是 t != t ?很是纳闷,遂Demo ...

  10. 如何禁用AD OU 下面的邮箱用户的Exchange ActiveSync 和 适用于设备的OWA

    Get-Mailbox -OrganizationalUnit QQ禁用名单 | Set-CASMailbox  -ActiveSyncEnabled $false -OWAforDevicesEna ...