【Hibernate一】概述及入门
crud的操作
主键的生成机制
类型
持久化类
映射文件 *.hbm.xml
配置文件 hibernate.cfg.xml
2、关系部分
一对多的单项
一对多的双向
多对多的双向
一对一
在many-to-one加一个属性unique="true"
cascade 级联
3、性能的部分
- 维护关系 inverse
- 懒载入 lazy
- 抓取策略 fetch
- 一级缓存
- 二级缓存
查询缓存
4、查询
hql
条件查询
显然Hibernate是ORM框架中做得比較好的一款!
- 面向对象数据库编程;
- 代码书写更加简洁;
- 具有缓存机制。提高效率;
准备条件:
.png)
|
<?xml version= '1.0' encoding ='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate
Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd" >
<hibernate-configuration>
<session-factory >
<!-- 数据库的username
--> <property name="connection.username" >root </property>
<!-- password -->
<property name="connection.password" >root </property>
<!-- url -->
<property name= "connection.url">
jdbc:mysql:// localhost:3306/hibernate512
</property>
<!-- 方言 告诉hibernate,要操作的数据库是mysql -->
<property name="dialect" >org.hibernate.dialect.MySQLDialect </property>
<!-- 导入驱动 -->
<property name= "connection.driver_class" >
com.mysql.jdbc.Driver
</property>
<!-- validate
仅仅检查结构 update 检查结构,更新或者创建表 create 每次启动 hibernate时,都要创建表 create-drop 启动 hibernate时创建表。当 hibernate关闭时,删除表
--> <property name= "hbm2ddl.auto">update</property >
<!--显示sql语句的输出
--> <property name= "show_sql"> true</ property >
<property name= "format_sql"> true</ property >
<!--关联映射文件,手动加入。然后自己主动生成。
--> <mapping resource="com/oteman/hibernate/domain/Person.hbm.xml" />
</session-factory >
</hibernate-configuration>
|
|
package com.oteman.hibernate.domain;
public class Person
{ Long pid;
String pname;
String pgender;
public Long
getPid() { return pid ;
}
public void setPid(Long
pid) { this.pid =
pid; }
public String
getPname() { return pname ;
}
public void setPname(String
pname) { this.pname =
pname; }
public String
getPgender() { return pgender ;
}
public void setPgender(String
pgender) { this.pgender =
pgender; }
}
|
|
<?xml version= "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" >
<!-- 数据库表和类之间的映射关系 字段和表列名之间的关系 -->
<hibernate-mapping>
<class name="com.oteman.hibernate.domain.Person" table="Person" >
<id name= "pid" column ="pid" length="5" type="java.lang.Long" >
<generator class= "increment"></generator >
</id>
<property name= "pgender" column ="gender" length="10" type="string"></ property>
<property name= "pname" column ="name" length="20" ></property>
</class >
</hibernate-mapping>
|
|
@Test
public void testCreateTable(){
Configuration configuration= new Configuration();
configuration.configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
}
|
|
/**
* 向数据库中添加数据
*/
@Test
public void add(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Person p= new Person();
p.setPgender( "男");
p.setPname( "张三");
session.save(p);
transaction.commit();
session.close();
}
/**
* 更新数据, hibernate具有快照机制,会将对象前后的值进行比較,假设发现对象的属性没有发生改变,那么就不进行update操作,能够观察 sql语句;
*/
@Test
public void update(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Person person=(Person) session.get(Person. class,
2l); person.setPname( "哈哈");
/*//另外一种形式:
Person p=new Person();
p.setPgender("男");
p.setPid(2L);
p.setPname("李四");*/
session.update(person);
transaction.commit();
session.close();
}
/**
* 删除数据
*/
@Test
public void delete(){
Session session= sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Person person=(Person) session.get(Person. class,
1l); session.delete(person);
transaction.commit();
session.close();
}
/**
* 查询全部!
*/
@Test
public void query(){
Session session= sessionFactory.openSession();
List list = session.createQuery("from
Person").list(); System. out.println(list.size());
session.close();
}
|
|
public class GeneratroTest extends HibernateUtils{
/**
*
* 1.<id name=" pid" column="pid"
type="java.lang.Long"> <generator class="increment"> </generator>
</id>
* increament形式产生的 sql语句
* Hibernate:
select
max( pid)
from
person
Hibernate:
insert
into
person
( pname, psex , pid)
values
(?, ?
, ?) 说明:
1、先得到主键的最大值
2、在最大值的基础上加1
3、上述的两步过程是由 hibernate内部完毕的
*/
@Test
public void testIncrement(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Person person = new Person();
//person.setPid(11L);为increament时,自行设置的id没实用, hibernate会帮我们处理id;
person.setPname( "云三班长" );
person.setPsex( "不详");
session.save(person);
transaction.commit();
session.close();
}
/**
*
* 2.<generator class="identity"> </generator>
*
* Hibernate:
insert
into
person
( pname, psex )
values
(?, ?)
说明:
主键的生成交给数据库来做,数据库必须支持自己主动增长机制,会出现id不连续的情况,效率比increment要高一些;
*/
@Test
public void testIdentity(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Person person = new Person();
//person.setPid(11L);
person.setPname( "云三班长" );
person.setPsex( "不详");
session.save(person);
transaction.commit();
session.close();
}
/**
* 3.<generator class=" uuid"></generator>
* 主键的生成是由 hibernate内部完毕的
*/
@Test
public void testUUID(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Person person = new Person();
person.setPname( "云三班长" );
person.setPsex( "不详");
session.save(person);
transaction.commit();
session.close();
}
/**
* 4.<generator class="assign"> </generator>
* 主键的生成由自己指定。
*/
@Test
public void testAssigned(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Person person = new Person();
person.setPid(11L);
person.setPname( "云三班长" );
person.setPsex( "不详");
session.save(person);
transaction.commit();
session.close();
}
}
|
【Hibernate一】概述及入门的更多相关文章
- 一起学习Hibernate: Hibernate01 —— Hibernate的概述与入门案例
一 Hibernate的介绍 1 让我们从JDBC与替代它的框架Hibernate进行一下对比. 1.1 JDBC的缺点 1) 代码结构繁琐.每次书写sql语句操作数据库都得需要很多步; 2) 是面向 ...
- 三大框架 之 Hibernate框架概述(概述、配置、核心API)
目录 Hibernate框架概述 什么是框架 hibernate简介(JavaEE技术三层架构所用到的技术) hibernate是什么框架 ORM hibernate好处 Hibernate基本使用 ...
- MySql概述及入门(五)
MySql概述及入门(五) MySQL集群搭建之读写分离 读写分离的理解 为解决单数据库节点在高并发.高压力情况下出现的性能瓶颈问题,读写分离的特性包括会话不开启事务,读语句直接发送到 salve 执 ...
- MySQL概述及入门(四)
MySql概述及入门(四) 什么是MySQL的锁? 数据库锁定机制,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则,简单说,就是不让别人动 总的来说,MySQL各 ...
- MySQL概述及入门(三)
MySql概述及入门(三) MySQL性能优化 主要优化安全和性能方面 安全方面 : 数据可持续性 性能方面 : 数据的高性能访问 性能优化——慢查询 在MySQL数据库中有一个慢查询日志功能,去获取 ...
- MySQL概述及入门(二)
MySql概述及入门(二) MySQL架构 逻辑架构图: 执行流程图: MySQL的存储引擎 查询数据库支持的存储引擎 执行: show engines: 多存储引擎是mysql有别于其他数据库的一大 ...
- MySQL概述及入门(一)
MySql概述及入门(一) 什么是MySQL? MySQL是当今主流的关系型数据库管理系统(记录是有行有列的数据库) , 可以与Oracle 和SQL Server 竞争 , 是最好RDBMS( ...
- Hibernate学习笔记(一)—— Hibernate概述及入门
一.Hibernatea概述 1.1 什么是Hibernate? 在介绍什么是Hibernate之前,我们先讨论一下什么是框架?框架是用来提高开发效率的,框架封装好了一些功能,我们需要使用这些功能时, ...
- Hibernate_day01--课程安排_Hibernate概述_Hibernate入门
Hibernate_day01 Hibernate课程安排 今天内容介绍 WEB内容回顾 JavaEE三层结构 MVC思想 Hibernate概述 什么是框架 什么是hibernate框架(重点) 什 ...
随机推荐
- JAVAEE学习——hibernate01:简介、搭建、配置文件详解、API详解和CRM练习:保存客户
今日学习:hibernate是什么 一.hibernate是什么 框架是什么: 1.框架是用来提高开发效率的 2.封装了好了一些功能.我们需要使用这些功能时,调用即可.不需要再手动实现. 3.所以框架 ...
- 管理openstack多region介绍与实践
转:http://www.cnblogs.com/zhoumingang/p/5514853.html 概念介绍 所谓openstack多region,就是多套openstack共享一个keyston ...
- Selenium快速入门(下)
Frame相关 import time from selenium import webdriver from selenium.common.exceptions import NoSuchElem ...
- Selenium快速入门(上)
浏览器驱动下载 Edge浏览器 Firefox浏览器 Safari浏览器 Chrome浏览器 PhantomJS浏览器 下载完成之后,添加到环境变量. 声明浏览器对象 selenium支持的浏览器版本 ...
- Redis学习篇(十二)之管道技术
通过管道技术降低往返时延 当后一条命令不依赖于前一条命令的返回结果时,可以使用管道技术将多条命令一起 发送给redis服务器,服务器执行结束之后,一起返回结果,降低了通信频度.
- 2017四川省赛D题《Dynamic Graph》
题意:给出一个n个点m条边的有向无环图(DAG),初始的时候所有的点都为白色.然后有Q次操作,每次操作要把一个点的颜色改变,白色<->黑色,对于每次操作,输出满足下列点对<u,v&g ...
- HDU2874【倍增、ST】
题目链接[https://vjudge.net/problem/HDU-2874] 题意: 输入一个森林,总节点不超过N(N<10000),由C次询问(C<1000000),每次询问两个点 ...
- [Usaco2015 Feb]Censoring --- AC自动机 + 栈
bzoj 3940 Censoring 题目描述 FJ把杂志上所有的文章摘抄了下来并把它变成了一个长度不超过10^5的字符串S. 他有一个包含n个单词的列表,列表里的n个单词记为T1......Tn. ...
- [NC13A]反蝴蝶效应/[SPOJ-NPC2014D]General Joke
[NC13A]反蝴蝶效应/[SPOJ-NPC2014D]General Joke 题目大意: 按顺序访问\(A_{1\sim n}(n\le10^5)\),经过\(A_i\)时身上必须有\(A_i\) ...
- [QSCOJ39]喵哈哈村的代码传说 第五章 找规律
题目大意: 给你n堆排,两人轮流对其中一堆牌进行以下操作之一: 1.从这堆牌中取出任意数量的牌: 2.将这这堆牌分为任意大小的3堆牌. 不能操作者负. 问先手是否有必胜策略. 思路: 尝试构造sg函数 ...