Hibernate(一)——入门
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(一)——入门的更多相关文章
- Hibernate从入门到精通(十一)多对多双向关联映射
上次我们在中Hibernate从入门到精通(十)多对多单向关联映射讲解了一下多对多单向关联映射,这次我们讲解一下七种映射中的最后一种多对多双向关联映射. 多对多双向关联映射 按照我们之前的惯例,先看一 ...
- Hibernate从入门到精通(十)多对多单向关联映射
上一篇文章Hibernate从入门到精通(九)一对多双向关联映射中我们讲解了一下关于一对多关联映射的相关内容,这次我们继续多对多单向关联映射. 多对多单向关联映射 在讲解多对多单向关联映射之前,首先看 ...
- Hibernate从入门到精通(九)一对多双向关联映射
上次的博文Hibernate从入门到精通(八)一对多单向关联映射中,我们讲解了一下一对多单向映射的相关内容,这次我们讲解一下一对多双向映射的相关内容. 一对多双向关联映射 一对多双向关联映射,即在一的 ...
- Hibernate从入门到精通(八)一对多单向关联映射
上次的博文Hibernate从入门到精通(七)多对一单向关联映射我们主要讲解了一下多对一单向关联映射,这次我们继续讲解一下一对多单向映射. 一对多单向关联映射 在讲解一对多单向关联之前,按照我们的惯例 ...
- Hibernate从入门到精通(七)多对一单向关联映射
上次的博文Hibernate从入门到精通(六)一对一双向关联映射中我们介绍了一下一对一双向关联映射,本次博文我们讲解一下多对一关联映射 多对一单向关联映射 多对一关联映射与一对一关联映射类似,只是在多 ...
- Hibernate从入门到精通(六)一对一双向关联映射
在上次的博文Hibernate从入门到精通(五)一对一单向关联映射中我们讲解了一下一对一单向关联映射,这次我们继续讲解一下与之对应的一对一双向关联映射. 一对一双向关联 与一对一单向关联映射所不同的的 ...
- Hibernate从入门到精通(五)一对一单向关联映射
上次的博文中Hibernate从入门到精通(四)基本映射我们已经讲解了一下基本映射和相关概念,接下来我们会讲稍微复杂点的映射——关系映射. 关系映射分类 关系映射即在基本映射的基础上处理多个相关对象和 ...
- Hibernate从入门到精通(四)基本映射
映射的概念 在上次的博文Hibernate从入门到精通(三)Hibernate配置文件我们已经讲解了一下Hibernate中的两种配置文件,其中提到了两种配置文件的主要区别就是XML可以配置映射.这里 ...
- Hibernate从入门到精通(三)Hibernate配置文件
在上次的博文Hibernate从入门到精通(二)Hibernate实例演示我们已经通过一个实例的演示对Hibernate的基本使用有了一个简单的认识,这里我们在此简单回顾一下Hibernate框架的使 ...
- Hibernate从入门到精通(二)Hibernate实例演示
上篇Hibernate从入门到精通(一)JDBC简介,我们主要对JDBC进行了简单介绍和使用说明,这次我们做一个Hibernate简单实例,通过这个实例对比Hibernate和JDBC,了解Hiber ...
随机推荐
- HTML5学习第四天
HTML5学习第四天 一.HTML列表 HTML列表,有无序表,有序表以及自定义表,列表于列表之间可以实现嵌套 列表相关操作 <ul> <li>(多选)谁世界第二可爱?< ...
- Windows驱动开发-派遣函数格式
NTSTATUS functionName(PDEVICE_OBJECT pDeviceObject, PIRP pIrp) { //业务代码区 //设置返回状态 pIrp->IoStatus. ...
- 论文阅读:Blink-Fast Connectivity Recovery Entirely in the Data Plane
1.背景 在网络中,链路故障的发生在所难免,为了降低故障带来的影响,就需要重新路由,将数据传输到合适的链路上.当因为链路故障发生处的不同,也有不同的解决方法. AS(Autonomous System ...
- Oracle修改密码
1. 登陆oracle sqlplus '/as sysdba' 2. 修改密码 ALTER USER 用户名IDENTIFIED BY 要修改的密码 ; 3.解锁 alter user 用户名 ac ...
- vDom和domDiff
虚拟dom和domDiff 1. 构建虚拟DOM var tree = el('div', {'id': 'container'}, [ el('h1', {style: 'color: blue'} ...
- imagenet下载及训练
imagenet 种子 迅雷打开验证集http://academictorrents.com/download/5d6d0df7ed81efd49ca99ea4737e0ae5e3a5f2e5.tor ...
- (九)微信小程序---for指令
对于数据是列表 wxml <view wx:for="{{dataList}}">{{index}}-{{item}}</view> 我们可以看到上面的代码 ...
- java时间差
以下代码没什么意义,只是记录 long mstart = System.nanoTime(); int mIndex = 0 ; for (int i = 0; i < 100000000; i ...
- C++路径的整理
写C++,路径的问题一直都让人很头疼,抽空整理一些方法:也许以后会用到: 1."./" 加不加都一样,就是指当前目录 2."../" 表示当前目录的上级目录,即 ...
- netty权威指南学习笔记五——分隔符和定长解码器的应用
TCP以流的方式进行数据传输,上层应用协议为了对消息进行区分,通常采用以下4中方式: 消息长度固定,累计读取到长度综合为定长LEN的报文后,就认为读取到了一个完整的消息,将计数器置位,重新开始读取下一 ...