hibernate的初次使用
转载地址:http://blog.csdn.net/aboy123/article/details/10222675
一、Hibernate概述
(一)什么是Hibernate?
hibernate核心内容是ORM(关系对象模型)。可以将对象自动的生成数据库中的信息,使得开发更加的面向对象。这样作为程序员就可以使用面向对象的思想来操作数据库,而不用关心繁琐的JDBC。所以,Hibernate处于三层架构中的D层(持久层)。
(二)使用Hibernate的优点
1、Hibernate可以使用在Java的任何项目中,不一定非要使用在Java web项目中。因为Hibernate不需要类似于tomact这些容器的支持,可以直接通过一个main方法进行测试。
2、通过下面的实例,可以发现使用Hibernate可以大大减少代码量。
3、由于使用了Hibernate,代码中不涉及具体的JDBC语句,所以就方便了代码的可移植性。
二、Hibernate开发的环境搭建
- <!DOCTYPE hibernate-configuration PUBLIC
- "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
- <hibernate-configuration>
- <session-factory >
- <!-- mysql数据库驱动 -->
- <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
- <!-- mysql数据库名称 -->
- <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property>
- <!-- 数据库的登陆用户名 -->
- <property name="hibernate.connection.username">root</property>
- <!-- 数据库的登陆密码 -->
- <property name="hibernate.connection.password">root</property>
- <!-- 方言:为每一种数据库提供适配器,方便转换 -->
- <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
- </session-factory>
- </hibernate-configuration>
<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory ><!-- mysql数据库驱动 --><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><!-- mysql数据库名称 --><property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property><!-- 数据库的登陆用户名 --><property name="hibernate.connection.username">root</property><!-- 数据库的登陆密码 --><property name="hibernate.connection.password">root</property><!-- 方言:为每一种数据库提供适配器,方便转换 --><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property></session-factory>
</hibernate-configuration>
三、HIbernate第一个实例
- import java.util.Date;
- public class User {
- private String id;
- private String username;
- private String password;
- private Date createTime;
- private Date expireTime;
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
- public String getUsername() {
- return username;
- }
- public void setUsername(String userName) {
- this.username = userName;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public Date getCreateTime() {
- return createTime;
- }
- public void setCreateTime(Date createTime) {
- this.createTime = createTime;
- }
- public Date getExpireTime() {
- return expireTime;
- }
- public void setExpireTime(Date expireTime) {
- this.expireTime = expireTime;
- }
- }
import java.util.Date;public class User {private String id;private String username;private String password;private Date createTime;private Date expireTime;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String userName) {this.username = userName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}public Date getExpireTime() {return expireTime;}public void setExpireTime(Date expireTime) {this.expireTime = expireTime;}
}
- <?xml version="1.0"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="com.example.hibernate.User">
- <id name="id">
- <generator class="uuid"/>
- </id>
- <property name="username"/>
- <property name="password"/>
- <property name="createTime"/>
- <property name="expireTime"/>
- </class>
- </hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="com.example.hibernate.User"><id name="id"><generator class="uuid"/></id><property name="username"/><property name="password"/><property name="createTime"/><property name="expireTime"/></class>
</hibernate-mapping>
其中的property标签是将要生成是数据库表中的字段,在这里不用关心各个字段是什么类型的。因为Hibernate会根据上面的实体类中属性的类型来决定将来表中字段的类型
- <hibernate-configuration>
- <session-factory >
- <!-- mysql数据库驱动 -->
- <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
- <!-- mysql数据库名称 -->
- <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property>
- <!-- 数据库的登陆用户名 -->
- <property name="hibernate.connection.username">root</property>
- <!-- 数据库的登陆密码 -->
- <property name="hibernate.connection.password">root</property>
- <!-- 方言:为每一种数据库提供适配器,方便转换 -->
- <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
- <span style="color: rgb(255, 0, 0);"><mapping resource="com/example/hibernate/User.hbm.xml"/></span>
- </session-factory>
- </hibernate-configuration>
<hibernate-configuration><session-factory ><!-- mysql数据库驱动 --><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><!-- mysql数据库名称 --><property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property><!-- 数据库的登陆用户名 --><property name="hibernate.connection.username">root</property><!-- 数据库的登陆密码 --><property name="hibernate.connection.password">root</property><!-- 方言:为每一种数据库提供适配器,方便转换 --><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><mapping resource="com/example/hibernate/User.hbm.xml"/></session-factory>
</hibernate-configuration>
注意:必须是“/”而不能是“.”。
- import org.hibernate.cfg.Configuration;
- import org.hibernate.tool.hbm2ddl.SchemaExport;
- /**
- * 将hbm生成ddl
- * @author BCH
- *
- */
- public class ExoprtDB {
- public static void main(String[] args) {
- //默认读取hibernate.cfg.xml文件
- Configuration cfr = new Configuration().configure();
- SchemaExport export = new SchemaExport(cfr);
- export.create(true, true);
- }
- }
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
/*** 将hbm生成ddl* @author BCH**/
public class ExoprtDB {public static void main(String[] args) {//默认读取hibernate.cfg.xml文件Configuration cfr = new Configuration().configure();SchemaExport export = new SchemaExport(cfr);export.create(true, true);}
}
到这里就可以生成User表了,但是如果直接运行ExoprtDB.java文件是不能生成User表的。因为在mysql数据中还没有建立数据库Hibernate-first。所以在mysql控制台中通过create database hibernate-first; use hibernate-first;之后再执行ExoprtDB.java文件就可以生成表了。
- import java.util.Date;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.cfg.Configuration;
- public class Client {
- public static void main(String[] args) {
- //读取配置文件
- Configuration cfg = new Configuration().configure();
- SessionFactory factory = cfg.buildSessionFactory();
- Session session = null;
- try{
- session = factory.openSession();
- //开启事务
- session.beginTransaction();
- User user = new User();
- user.setUsername("用户名");
- user.setPassword("123");
- user.setCreateTime(new Date());
- user.setExpireTime(new Date());
- session.save(user);
- //提交事务
- session.getTransaction().commit();
- }catch(Exception e){
- e.printStackTrace();
- //回滚事务
- session.getTransaction().rollback();
- }finally{
- if(session != null){
- if(session.isOpen()){
- //关闭session
- session.close();
- }
- }
- }
- }
- }
import java.util.Date;import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;public class Client {public static void main(String[] args) {//读取配置文件Configuration cfg = new Configuration().configure();SessionFactory factory = cfg.buildSessionFactory();Session session = null;try{session = factory.openSession();//开启事务session.beginTransaction();User user = new User();user.setUsername("用户名");user.setPassword("123");user.setCreateTime(new Date());user.setExpireTime(new Date());session.save(user);//提交事务session.getTransaction().commit();}catch(Exception e){e.printStackTrace();//回滚事务session.getTransaction().rollback();}finally{if(session != null){if(session.isOpen()){//关闭sessionsession.close();}}}}
}
(四)总结
一、什么是映射
在上一篇文章中 新手上路之Hibernate:第一个Hibernate例子,通过一个例子了解了什么是hibernate。而其中最重要的就是通过User.hbm.xml来配置映射。这里所说的映射就是对象关系映射:将对象数据保存到数据库中,同时可以将数据库数据读入对象中,开发人员只对对象进行操作就可以完成对数据库数据的操作。
二、什么是基本映射
知道了什么是映射,那么我们先来看一下最基本的映射关系——基本映射,即根据表结构创建相应实体类
例如:还是以MySQL数据库为例,进行说明。有如下一张表:
建立相应的实体类:User
- public class User {
- private String id;
- private String username;
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
- public String getUsername() {
- return username;
- }
- public void setUsername(String userName) {
- this.username = userName;
- }
- }
对于Hibernate来说,最重要的就是配置文件,即还需要一个User.hbm.xml文件
- <hibernate-mapping>
- <class name="com.example.hibernate.User" table="t_user">
- <id name="id">
- <generator class="uuid"/>
- </id>
- <property name="username"/>
- </class>
- </hibernate-mapping>
其他部分的代码参照上一篇文章即可。
三、建立User实体类的一些原则
1、实现无参的默认的构造函数
2、提供一个标识
3、建议不要使用fianl修饰实体类
4、建议为实体类生成setter和getter方法
对于第3条建议,如果使用了fianl关键字,那么延迟加载(load)将会无效。具体含义将会在下一篇文章中给出实例。
四、HIbernate主键生成策略
在上面User.hbm.xml配置文件中有一个标签:<generator>。它表示的是主键生成策略。主键生成策略必须配置,用来为该持久化类的实例生成唯一的标识。它有如下几种策略
uuid: 用一个128-bit的UUID算法生成字符串类型的标识符,这在一个网络中是唯一的(使用了IP地址),UUID被编码为一个32位16进制数字的字符串,它的生成是由Hibernate生成,一般不会重复UUID包含:IP地址,JVM的启动时间,系统时间和一个计算器值。
identity:MySql数据库中自增长
Sequence:Oracle数据库自增长
native:根据底层数据库能力选择identity、sequence中的一个。
assigned:手动分配主键.<generator>没有指定时的默认生成策略
foreign:使用另外一个相关联的对象的标示符。通常和<one-to-one>配合使用
五、总结
hibernate的初次使用相关推荐
- Hibernate初次搭建与第一个测试例子
今年学了两个框架,今年重装了两次myeclipse,我能怎么办,我也很无奈 安装myeclipse2017 stable2.0 https://www.52pojie.cn/thread-687683 ...
- hibernate中一对多关系的映射
昨天初次接触hibernate,仅仅弄懂了一对一关系的映射.今天学习了一天又有了新的收获,弄懂了一对多之间关系的映射. 一.一对多的关系映射 建立一对多关系关系的表的原则是将一的一方的主键加入到多的一 ...
- 初次接触GWT,知识点总括
初次接触GWT,知识点概括 前言 本人最近开始研究 GWT(Google Web Toolkit) ,现将个人的一点心得贴出来,希望对刚开始接触 GWT的程序员们有所帮助,也欢迎讨论,共同进步. 先说 ...
- 和Hibernate3.6相比,Hibernate 5.x中的增删改性能降低了
背景 升级hibernate后,发现项目中job跑的比较慢,刚开始我还不信,想写个性能测试testcase说服老板们,测完傻了,性能真的有点慢. 经过几天的源代码的对比和阅读,没有发现什么异常的地方除 ...
- Hibernate学习汇总
一.Hibernate的基本原理 1.什么是Hibernate Hibernate,翻译过来是冬眠的意思,正好现在已经进入秋季,世间万物开始准备冬眠了.其实对于对象来说就是持久化. Hibernate ...
- ( 转)Hibernate常用API
http://blog.csdn.net/yerenyuan_pku/article/details/65103203 可在度娘上摘抄如下文字: Hibernate的核心类和接口一共有6个,分别为:S ...
- Struts2+Hibernate+Spring+ZTree+Dtree 实现树形菜单
2019独角兽企业重金招聘Python工程师标准>>> 1.第一步配置web.xml <?xml version="1.0" encoding=" ...
- hibernate mysql 多表查询_查询hibernate表程序
Hibernate初识 简介 相信学过SSH2框架的同学们对Hiberate一点也不陌生.Hibernate是Gavin King于2001年开始,作为EJB2风格实体bean的替代品开发的对象关系映 ...
- java面试常见问题之Hibernate总结
1 Hibernate的检索方式 Ø 导航对象图检索(根据已经加载的对象,导航到其他对象.) Ø OID检索(按照对象的OID来检索对象.) Ø HQL检索(使用面向对象的HQL查询语言.) ...
最新文章
- Horticulture Research 模式图的手稿
- pycharm安装numpy
- js仿QQ中对联系人向左滑动、滑出删除按钮的操作
- (转载)DevExpress ASPxGridView 使用文档一:概述
- tikhonov正则化 matlab_4 L1和l2正则化详解(花书7.1 参数范数惩罚)
- arcgis使用工具箱导出dbf_ArcGIS——好好的属性表,咋就乱码了呢?
- 请问:如何写出没有BUG的代码?
- Redis 3.0.1 安装和配置
- 块级,行内(内联)对比笔记
- 基于SSLStrip的HTTPS会话劫持
- vue-devtoools 调试工具安装
- 斐波那契数列——O(1)算法
- 7z解压缩软件下载安装教程
- linux命令行 teamview,linux下安装team viewer的方法
- DZZ云桌面1.3下载 多图介绍
- P3P求解相机姿态原理介绍
- [转]你需要个人知识管理(PKM)吗?
- android切换夜间模式吗,Android切换夜间模式
- 期货交易应该如何界定交易中的时间周期?
- Python_变量声明