Hibernate之旅

Hibernate之旅一:创建demo

前言

  最近在学习Hibernate,貌似起步晚了些。以前都只是在用,没有进行系统地学习。刚刚开通了博客,想写一些学习笔记。如有错误之处,望列位指正,不甚感激。

环境准备

  • jdk1.8、eclipse、mysql数据库。
  • 相关jar包。antlr.jar、cglib.jar、asm.jar、asm-attrs.jar、commons-collections.jar、commons-logging.jar、ehcache.jar、hibernate3.jar、jta.jar、dom4.jar、log4j.jar。(创建maven工程更为方便,我这儿恰好有相关jar包就直接导入了)。

数据库准备

  • 首先创建数据库hibernatedb:CREATE DATABASE hibernatedb DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
  • 创建用户user1,密码也是user1:CREATE USER ‘user1‘@‘localhost‘ IDENTIFIED BY ‘user1‘;--该处为localhost则代表只能本地访问;如果为%表示匹配所有主机(并不包括localhost)。
  • 授权给用户:GRANT ALL PRIVILEGES ON hibernatedb.* TO user1; --ALL PRIVILEGES表示所有权限,*代表整个数据库。
  • 刷新用户权限:FLUSH PRIVILEGES;
  • 创建表userinfo:

USE DATABASE hibernatedb;--使用hibernatedb数据库

CREATE TABLE userinfo(

userId INT PRIMARY KEY AUTO_INCREMENT,

userName VARCHAR(20) NOT NULL,

userPassword VARCHAR(20) NOT NULL

);

  • 最终数据库和表结构如下。

创建demo

  • hibernate基本配置文件:hibernate.cfg.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         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
 8         <property name="hibernate.connection.username">user1</property>
 9         <property name="hibernate.connection.password">user1</property>
10         <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernatedb</property>
11         <!-- 配置数据库方言 -->
12         <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
13         <property name="connection.pool_size">1</property>
14         <!-- 输出运行时生成的SQL语句 -->
15         <property name="show_sql">true</property>
16         <!-- 列出所有的映射文件 -->
17         <mapping resource="org/hibernate/entity/UserInfo.hbm.xml" />
18     </session-factory>
19 </hibernate-configuration>
  • 新建一个简单的JavaBean:UserInfo类。持久化类都要求有无参构造器,Hibernate必须使用Java反射机制来创建对象。
 1 package org.hibernate.entity;
 2 /**
 3  *
 4  * 功能:测试用用户类
 5  * @author liaody
 6  * @version 1.0
 7  * @date 2017年3月5日 上午12:26:20
 8  */
 9 public class UserInfo {
10
11     private int userId;
12     private String userName;
13     private String userPassword;
14
15     /**
16      * default constructor
17      */
18     public UserInfo (){
19
20     }
21
22     /**
23      * full constructor
24      * @param userId
25      * @param userName
26      * @param userPassword
27      */
28     public UserInfo(int userId,String userName,String userPassword){
29         this.userId = userId;
30         this.userName = userName;
31         this.userPassword = userPassword;
32     }
33
34     /**
35      * @return the userId
36      */
37     public int getUserId() {
38         return this.userId;
39     }
40
41     /**
42      * @return the userName
43      */
44     public String getUserName() {
45         return this.userName;
46     }
47
48     /**
49      * @return the userPassword
50      */
51     public String getUserPassword() {
52         return this.userPassword;
53     }
54
55     /**
56      * @param userId the userId to set
57      */
58     public void setUserId(int userId) {
59         this.userId = userId;
60     }
61
62     /**
63      * @param userName the userName to set
64      */
65     public void setUserName(String userName) {
66         this.userName = userName;
67     }
68
69     /**
70      * @param userPassword the userPassword to set
71      */
72     public void setUserPassword(String userPassword) {
73         this.userPassword = userPassword;
74     }
75
76
77
78
79 }
  • UserInfo类的映射文件UserInfo.hbm.xml,该文件放置在与UserInfo类同一个包(org.hibernate.entity)下。
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 4 <hibernate-mapping>
 5     <class name="org.hibernate.entity.UserInfo" table="USERINFO">
 6         <id name="userId" type="java.lang.Integer" column="userid">
 7             <generator class="increment" />
 8         </id>
 9         <property name="userName" type="java.lang.String">
10             <column name="userName" length="20"></column>
11         </property>
12         <property name="userPassword" type="java.lang.String">
13             <column name="userPassword" length="20"></column>
14         </property>
15     </class>
16 </hibernate-mapping>
  • 创建辅助工具类HibernateUtil,用于获取和管理Session。
 1 package org.hibernate.util;
 2
 3 import org.hibernate.*;
 4 import org.hibernate.cfg.*;
 5
 6 public class HibernateUtil {
 7     private static SessionFactory sessionFactory;
 8     private static Configuration configuration = new Configuration();
 9     // 创建线程局部变量threadLocal,用来保存Hibernate的Session
10     private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
11     // 使用静态代码块初始化Hibernate
12     static {
13         try {
14             Configuration cfg = new Configuration().configure(); // 读取配置文件hibernate.cfg.xml
15             sessionFactory = cfg.buildSessionFactory(); // 创建SessionFactory
16         } catch (Throwable ex) {
17             throw new ExceptionInInitializerError(ex);
18         }
19     }
20
21     // 获得SessionFactory实例
22     public static SessionFactory getSessionFactory() {
23         return sessionFactory;
24     }
25
26     // 获得ThreadLocal 对象管理的Session实例.
27     public static Session getSession() throws HibernateException {
28         Session session = (Session) threadLocal.get();
29         if (session == null || !session.isOpen()) {
30             if (sessionFactory == null) {
31
32                 rebuildSessionFactory();
33             }
34             // 通过SessionFactory对象创建Session对象
35             session = (sessionFactory != null) ? sessionFactory.openSession()
36                     : null;
37             // 将新打开的Session实例保存到线程局部变量threadLocal中
38             threadLocal.set(session);
39         }
40         return session;
41     }
42
43     // 关闭Session实例
44     public static void closeSession() throws HibernateException {
45         // 从线程局部变量threadLocal中获取之前存入的Session实例
46         Session session = (Session) threadLocal.get();
47         threadLocal.set(null);
48         if (session != null) {
49             session.close();
50         }
51     }
52
53     // 重建SessionFactory
54     public static void rebuildSessionFactory() {
55         try {
56             configuration.configure("/hibernate.cfg.xml"); // 读取配置文件hibernate.cfg.xml
57             sessionFactory = configuration.buildSessionFactory(); // 创建SessionFactory
58         } catch (Exception e) {
59             System.err.println("Error Creating SessionFactory ");
60             e.printStackTrace();
61         }
62     }
63
64     // 关闭缓存和连接池
65     public static void shutdown() {
66         getSessionFactory().close();
67     }
68 }
  • Dao接口
 1 package org.hibernate.dao;
 2
 3 import org.hibernate.entity.UserInfo;
 4
 5 public interface UserInfoDao {
 6
 7     void save(UserInfo user); // 添加用户
 8
 9     UserInfo findById(int id); // 根据用户标识查找指定用户
10
11     void delete(UserInfo user); // 删除用户
12
13     void update(UserInfo user); // 修改用户信息
14 }
  • Dao接口实现
 1 package org.hibernate.dao.impl;
 2
 3 import org.hibernate.Session;
 4 import org.hibernate.Transaction;
 5 import org.hibernate.dao.UserInfoDao;
 6 import org.hibernate.entity.UserInfo;
 7 import org.hibernate.util.HibernateUtil;
 8
 9 public class UserInfoDaoImpl implements UserInfoDao {
10     // 添加用户
11     public void save(UserInfo user) {
12         Session session = HibernateUtil.getSession(); // 生成Session实例
13         Transaction tx = session.beginTransaction(); // 创建Transaction实例
14         try {
15             session.save(user); // 使用Session的save方法将持久化对象保存到数据库
16             tx.commit(); // 提交事务
17         } catch (Exception e) {
18             e.printStackTrace();
19             tx.rollback(); // 回滚事务
20         } finally {
21             HibernateUtil.closeSession(); // 关闭Session实例
22         }
23     }
24
25     // 根据用户标识查找指定用户
26     public UserInfo findById(int userId) {
27         UserInfo user = null;
28         Session session = HibernateUtil.getSession(); // 生成Session实例
29         Transaction tx = session.beginTransaction(); // 创建Transaction实例
30         try {
31             user = (UserInfo) session.get(UserInfo.class, userId); // 使用Session的get方法获取指定id的用户到内存中
32             tx.commit(); // 提交事务
33         } catch (Exception e) {
34             e.printStackTrace();
35             tx.rollback(); // 回滚事务
36         } finally {
37             HibernateUtil.closeSession(); // 关闭Session实例
38         }
39         return user;
40     }
41
42     // 删除用户
43     public void delete(UserInfo user) {
44         Session session = HibernateUtil.getSession(); // 生成Session实例
45         Transaction tx = session.beginTransaction(); // 创建Transaction实例
46         try {
47             session.delete(user); // 使用Session的delete方法将持久化对象删除
48             tx.commit(); // 提交事务
49         } catch (Exception e) {
50             e.printStackTrace();
51             tx.rollback(); // 回滚事务
52         } finally {
53             HibernateUtil.closeSession(); // 关闭Session实例
54         }
55     }
56
57     // 修改用户信息
58     public void update(UserInfo user) {
59         Session session = HibernateUtil.getSession(); // 生成Session实例
60         Transaction tx = session.beginTransaction(); // 创建Transaction实例
61         try {
62             session.update(user); // 使用Session的update方法更新持久化对象
63             tx.commit(); // 提交事务
64         } catch (Exception e) {
65             e.printStackTrace();
66             tx.rollback(); // 回滚事务
67         } finally {
68             HibernateUtil.closeSession(); // 关闭Session实例
69         }
70     }
71
72 }
  • 测试
 1 package org.hibernate.test;
 2
 3 import org.hibernate.dao.UserInfoDao;
 4 import org.hibernate.dao.impl.UserInfoDaoImpl;
 5 import org.hibernate.entity.UserInfo;
 6 import org.junit.Before;
 7 import org.junit.Test;
 8
 9 public class UserInfoTest {
10
11     @Before
12     public void setUp() throws Exception {
13
14     }
15
16     @Test
17     public void testSave() {
18         UserInfoDao userdao = new UserInfoDaoImpl();
19         UserInfo  user = new UserInfo(); // 创建UserInfo对象
20         // 设置UserInfo对象中的各个属性值
21         user.setUserName("liaody");
22         user.setUserPassword("456");
23         userdao.save(user); // 使用UserInfoDao的save方法将UserInfo对象存入数据库
24
25     }
26 }
  • 测试结果

  • 目录结构

总结

这儿只是一个demo,为了能使用Hibernate进行增删改查,代码和结构之后会逐步完善。接下来将会对hibernate进行系统的学习。

时间: 2024-12-12 15:48:41

Hibernate之旅的相关文章

Java之旅hibernate(8)——基本关系映射

何为关系,何为映射,关系这个词想必大家都不陌生.比方你和老师之间是师生关系,你和父母之间是父子或者父女(母子或者母女关系). 关系是存在某种联系物体之间产生的.什么都是可能的.比方你和工具,你仅仅能使用工具,可是工具不能使用你.这种关系是单向的.可是换种说法.你拥有工具,工具也属于你,那么这种关系就是双向的了,此外一个人能够拥有多个工具,而且多个工具也能够是属于一个人的.还有就是多个人拥有多个工具,而且多个工具也属于人,依据这些特征,我们将关系分为下面几种: 单向关系: one2one,(一对一

Java之旅hibernate(3)——第一个hibernate的样例

在解说样例之前.我们首先来理解一下hibernate的工作原理.理解原理将会帮助我们更好地理解hibernate和运用hibernate. 1.      原理图 利用hibernate进行数据的持久化操作,必定离不开与数据库打交道.依据上张图我们来看看hibernate是怎样工作的. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gra

Hibernate学习之旅

Hibernate搭建步骤: 1.下载所需包:antlr-2.7.7.jar,dom4j-1.6.1.jar,hibernate-commons-annotations-4.0.2.Final.jar,hibernate-core-4.2.21.Final.jar,hibernate-jpa-2.0-api-1.0.1.Final.jar,javassist-3.18.1-GA.jar,jboss-logging-3.1.0.GA.jar,jboss-transaction-api_1.1_sp

【SSH之旅】一步步学习Hibernate框架(一):关于持久化

在不引用不论什么框架下,我们会通过平庸的代码不停的对数据库进行操作,产生了非常多冗余的可是又有规律的底层代码,这样频繁的操作数据库和大量的底层代码的反复书写极大的浪费了程序人员的书写.就在这样一种情况下,Hibernate框架应运而生了. 事实上Hibernate封装的就是Model模型中的model,封装的这部分又叫持久层.在这层中对对象进行加入.删除.更新.查询等操作就叫做持久化. 持久化的对象有三种状态:Transient Objects.Persist Objects.Detached

【SSH之旅】一步步学习Hibernate框架(二):一对一关联映射中的主键关联

一对一的映射在对象模型中是经常见到的,主要是将对象模型转换为关系模型就必须在映射文件中进行配置,重点是<one-to-one>标签的使用,有两种方式,第一是主键关联,第二是唯一外键关联,现在先来看第一种方式. 一对一的关联映射中的主键关联,就是说两个对象具有相同的主键值,以表明它们之间的一一对应的关系,数据库表不会有额外的字段来维护它们之间的关系,仅仅是通过表的主键来关联. 上图的Person类和IdCard类之间是一一对应关系,一个人就只能有一个身份证,一个身份证只能对应一个人,那么身份证的

Java之旅hibernate(6)——Junit不为人知的故事

  说道Junit,我们首先不得不说測试的重要性.一个健壮的软件肯定是经过不断地的測试后才干终于被应用的.在測试的过程中能够发现非常多不稳定性或者说是存在一定的bug等等.这些都能够在測试阶段发现.而不会被推到被用户真正的使用的时候.避免了不良好的用户体验. 当我们看java源程序的时候.总是会看到这种一个目录,名字为test,好奇的你是否点开过呢? 没错,这里就是我们书写的測试程序,使得在团队开发过程中.彼此的交互更加的可靠和稳定. 那么Junti详细是什么呢? 1.       Junit

深入hibernate的三种状态(转)

学过hibernate的人都可能都知道hibernate有三种状态,transient(瞬时状态),persistent(持久化状态)以及detached(离线状态),大家伙也许也知道这三者之间的区别,比如瞬时状态就是刚new出来一个对象,还没有被保存到数据库中,持久化状态就是已经被保存到数据库中,离线状态就是数据库中有,但是session中不存在该对象.但是大家又是否对hibernate的session的那几个特殊方法一清二楚呢?或者说大家是否能够一眼就快速看出一个测试用例在反复的调用sess

深入hibernate的三种状态

学过hibernate的人都可能都知道hibernate有三种状态,transient(瞬时状态),persistent(持久化状态)以及detached(离线状态),大家伙也许也知道这三者之间的区别,比如瞬时状态就是刚new出来一个对象,还没有被保存到数据库中,持久化状态就是已经被保存到数据库中,离线状态就是数据库中有,但是session中不存在该对象.但是大家又是否对hibernate的session的那几个特殊方法一清二楚呢?或者说大家是否能够一眼就快速看出一个测试用例在反复的调用sess

Hibernate Validator

摘要: 在项目的业务属性中,你是不是要经常验证属性的取值范围呢. 想要了解比较优美的解决方案吗? 看看Hibernate Validator 是怎么做的吧.一见到她,相信你就会说: Oh God, 这就是我需要的. 作者:icess(作者的blog:http://blog.matrix.org.cn/page/icess)关键字:Hibernate Validator               用Annotations 给类或者类的属性加上约束(constraint),在运行期检查属性值是很优