Hibernate学习笔记一:项目创建与基本配置文件
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6760773.html
一:ORM
ORM:对象-关系 映射。
即:把Java中有关联关系的对象,转换成关系型数据库里有主、外键关系的表中的记录,其转换的过程叫做映射,是通过配置文件实现的。
基于ORM的框架,就是实现了在编程时,脱离开繁杂的SQL语句,用面向对象的方式来操作数据,而框架则负责根据配置文件的配置而转换成具体的数据库语句并执行。
二:创建Hibernate项目
1:在Myeclipse中配置DataBase
2:创建一个项目
3:右键项目,添加Hibernate支持,选择刚才配置的DataBase连接
4:创建Java实体类,实体类至少包含构造函数、getter、setter
5:为实体类配置映射文件,一个类一个 classname.hbm.xml 文件,其中配置该对象的id属性以及其他字段属性
6:配置hibernate.cfg.xml文件,配置数据库连接的驱动、数据库路径、账户、密码等,引入每个实体类的hbm.xml 文件。
三:使用Hibernate
一般步骤为:
Session session=HibernateSessionFactory.getSession();//单例模式获得session
Transaction transaction=(Transaction) session.beginTransaction();//开启事务
session.save(article);//执行session操作,保存、更改、删除某对象
transaction.commit();//提交事务
session.close();//关闭session
四:Session
Myeclipse中创建Hibernate工程时,会自动生成一个HibernateSeesionFactory类,里面定义了Session字段以及getSession的静态方法。
其中,session被定义为ThreadLocal类型变量,也就是说,这个session是与线程绑定的。当一个请求发送到服务器,服务器启动一条线程来处理这个请求,在处理过程中,会经历filter、servlet、service、dao等各层方法的执行,而session对象则贯穿整个过程,直到线程关闭。并且,getSession方法是静态的单例模式的方法。因此,整个线程执行期间获取的是同一个session对象。这样做的意义在于:可以在非DAO层进行事务管理,可以在DAO层用session进行了save、update等操作后,在service或filter层进行事务的提交。
Session的非查询类操作,如:save、update、delete等都需要事务提交才能生效,持久化到数据库,get则不需。
五:hbm.xml映射文件
<?xmlversion="1.0"encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> //1:头不能错
<hibernate-mapping package="包名"> //2:根标签为 hibernate-mapping,package属性指明包名
<class name="类名"table="表名"> //3:class标签配置实体类,包括类名、表名
<id name="主键在java类中的字段名" column="对应表中属性列名" type="数据类型 "> //4:id 标签配置实体类的主键属性,包含类中字段名、表中列名、数据类型、主键生成策略
<generator class="主键生成策略"/>
</id>
<property name="属性名" type="数据类型"> //5:property标签配置实体类其他属性,包括属性名、数据类型、表中对应列
<column name="数据库表中属性列名" length="长度" not-null="是否非空"/>
</property>
<component name="实体类中字段名" class="哪个属性实体类"> //6:组件属性:组件属性对应一个自定义属性类的对象,但是这个属性类没有映射表,而是把属性值作为当前class的表中的某几个属性列
<property name="属性实体类中字段名" column="表中哪列">
</component>
...... //7:关系映射标签:配置那个字段与哪个实体类具有什么类型的关系,如one-to-many
</class>
</hibernate-mapping>
主键生成策略有:
1) assigned
主键由程序负责生成,编码时在 save() 之前指定。
2) hilo
通过hi/lo 算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。
3) seqhilo
与hilo 类似,通过hi/lo 算法实现的主键生成机制,需要数据库中的 Sequence,适用于支持 Sequence 的数据库,如Oracle。
4) increment
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。由数据库自增。
5) identity
采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL 中的主键生成机制。
6) sequence
采用数据库提供的 sequence 机制生成主键。如 Oralce 中的Sequence。
7) native
由 Hibernate 根据使用的数据库自行判断采用 identity、hilo、sequence 其中一种作为主键生成方式。
8) uuid.hex
由 Hibernate 基于128 位 UUID 算法 生成16 进制数值(编码后以长度32 的字符串表示)作为主键。
9) uuid.string
与uuid.hex 类似,只是生成的主键未进行编码(长度16),不能应用在 PostgreSQL 数据中。
10) foreign
使用另外一个相关联的对象的标识符作为主键。
(使用最多的是:assigned、increment、native)
六:hibernate.cfg.xml文件
<?xml version='1.0' encoding='gb2312'?>
<!--表明解析本XML文件的DTD文档位置-->
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!--Hibernate配置文件的开始-->
<hibernate-configuration>
<!--session-factory配置-->
<session-factory>
<!--配置数据库驱动-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver </property>
<!--设置数据库连接-->
<property name="hibernate.connection.url">jdbc:mysql://localhost/hibernate </hibernate>
<!--连接数据库用户名-->
<property name="hibernate.connection.username">root </property>
<!--连接数据库密码-->
<property name="hibernate.connection.password">123456 </property>
<!--数据库连接池大小-->
<property name="hibernate.connection.pool.size">20 </property>
<!--是否在后台显示Hibernate用到的SQL语句,开发时设置为true,便于差错,程序运行时可以在Eclipse的控制台显示Hibernate的执行Sql语句。项目部署后可以设置为false,提高运行效率-->
<property name="hibernate.show_sql">true </property>
<!--jdbc.fetch_size是指Hibernate每次从数据库中取出并放到JDBC的Statement中的记录条数。Fetch Size设的越大,读数据库的次数越少,速度越快,Fetch Size越小,读数据库的次数越多,速度越慢-->
<property name="jdbc.fetch_size">50 </property>
<!--jdbc.batch_size是指Hibernate批量插入,删除和更新时每次操作的记录数。Batch Size越大,批量操作的向数据库发送Sql的次数越少,速度就越快,同样耗用内存就越大-->
<property name="jdbc.batch_size">23 </property>
<!--jdbc.use_scrollable_resultset是否允许Hibernate用JDBC的可滚动的结果集。对分页的结果集。对分页时的设置非常有帮助-->
<property name="jdbc.use_scrollable_resultset">false </property>
<!--connection.characterEncoding连接数据库时数据的传输字符集编码方式-->
<property name="connection.characterEncoding">UTF-8</property>
<!--hibernate.dialect 只是Hibernate使用的数据库方言,就是要用Hibernate连接那种类型的数据库服务器。-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect </property>
<!--配置实体类的映射文件-->
<mapping resource="org/mxg/XX.hbm.xml">
</session-factory>
</hibernate-configuration>
Hibernate学习笔记一:项目创建与基本配置文件的更多相关文章
- maven学习笔记--maven项目创建
使用Maven命令和Eclipse的Maven插件,创建Maven项目 (1)maven命令生成项目 新建一个文件目录,dos进入该目录并执行下面命令: mvn archetype:c ...
- Hibernate学习笔记(一)
2016/4/18 19:58:58 Hibernate学习笔记(一) 1.Hibernate框架的概述: 就是一个持久层的ORM框架. ORM:对象关系映射.将Java中实体对象与关系型数据库中表建 ...
- Hibernate 学习笔记一
Hibernate 学习笔记一 今天学习了hibernate的一点入门知识,主要是配置domain对象和表的关系映射,hibernate的一些常用的配置,以及对应的一个向数据库插入数据的小例子.期间碰 ...
- Hibernate学习笔记(二)
2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...
- Hibernate学习笔记-Hibernate HQL查询
Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...
- thinkphp学习笔记3—项目编译和调试模式
原文:thinkphp学习笔记3-项目编译和调试模式 1.项目编译 在章节2.4项目编译中作者讲到使用thinkphp的项目在第一次运行的时候会吧核心需要加载的文件去掉空白和注释合并到一个文件中编译并 ...
- InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移
系列目录 InterSystems Ensemble学习笔记(一) Ensemble介绍及安装InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移 一 ...
- 【opencv学习笔记八】创建TrackBar轨迹条
createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...
- Hibernate学习笔记
一.Hibernate基础 1.Hibernate简介 Hibernate是一种对象关系映射(ORM)框架,是实现持久化存储的一种解决方案.Java包括Java类到数据库表的映射和数据查询及获取的方法 ...
- Hibernate学习笔记(1)Hibernate构造
一 准备工作 首先,我们将创建一个简单的基于控制台(console-based)Hibernate应用. 我们所做的第一件事就是创建我们的开发文件夹.并把所有需要用到的Java件放进去.解压缩从Hib ...
随机推荐
- centos7 开机启动管理
查看开机启动项 ls /etc/systemd/system/multi-user.target.wants/ 设置开机启动 systemctl enable mongodb.service
- 让Orchard支持多个Layout
默认Orchard只有一个Layout,有的时候,我们的站点往往需要多个母版页.那么,如果要让Orchard支持多个Layout,以下是一种解决方案. 一:创建LayoutFilter using S ...
- Locks Set by Different SQL Statements in InnoDB
A locking read, an UPDATE, or a DELETE generally set record locks on every index record that is scan ...
- @Autowired注解和静态方法 NoClassDefFoundError could not initialize class 静态类
NoClassDefFoundError could not initialize class 静态类 spring boot 静态类 java.lang.ExceptionInInitializer ...
- Unreal Engine 4 减少编辑器的帧率
默认的,打开UE4的编辑器,显卡会以全速渲染场景,在我的机器上.是120FPS. 整个机器就開始轰鸣了.资源占用太凶了.事实上全然不是必需这样,帧率在60左右就足够了. 那怎么改动呢,试了非常多办法. ...
- Understanding Linux CPU stats
Your Linux server is running slow, so you follow standard procedure and run top. You see the CPU met ...
- C#如何判断线程池中所有的线程是否已经完成(转)
其 实很简单用ThreadPool.RegisterWaitForSingleObject方法注册一个定时检查线程池的方法,在检查线程的方法内调用 ThreadPool.GetAvailableThr ...
- 技术向:一文读懂卷积神经网络CNN
转自:http://dataunion.org/11692.html 作者:张雨石 自今年七月份以来,一直在实验室负责卷积神经网络(Convolutional Neural Network,CNN), ...
- 【Spark】开发Spark选择Java还是Scala?
Spark-Java-Scala-哪种语言 spark java 支持_百度搜索 (1 封私信)Spark 中用 Scala 和 java 开发有什么区别? - 知乎 (1 封私信)Spark平台下, ...
- AAAI 2018 论文 | 蚂蚁金服公开最新基于笔画的中文词向量算法
AAAI 2018 论文 | 蚂蚁金服公开最新基于笔画的中文词向量算法 2018-01-18 16:13蚂蚁金服/雾霾/人工智能 导读:词向量算法是自然语言处理领域的基础算法,在序列标注.问答系统和机 ...