大家不要再看这个了,这纯粹是一篇纪念帖 ,只具有参考意义
可以去官网看最新的介绍 英语还是要好好学 童鞋
hibernate orm 官网
http://hibernate.org/orm/
Hibernate ORM 5.3.5.Final用户指南
http://docs.jboss.org/hibernate/orm/5.3/userguide/html_single/Hibernate_User_Guide.html
Hibernate入门指南
https://docs.jboss.org/hibernate/orm/5.3/quickstart/html_single/
专题指南
http://docs.jboss.org/hibernate/orm/5.3/topical/html_single/
Hibernate ORM 4.2
http://hibernate.org/orm/documentation/4.2/
Hibernate入门指南
http://docs.jboss.org/hibernate/orm/4.2/quickstart/en-US/html_single/
HIBERNATE - Relational Persistence for Idiomatic Java
http://docs.jboss.org/hibernate/orm/4.2/manual/en-US/html_single/ 这篇讲的很好
http://docs.jboss.org/hibernate/orm/4.2/manual/en-US/html_single/
Hibernate团队提供托管在SourceForge文件发布系统上的发行包 ZIP ,TGZ 格式和 格式。每个发行包都包含JARs,文档,源代码和其他优点。
您可以从http://sourceforge.net/projects/hibernate/files/hibernate4/ 的列表中下载所选格式的Hibernate版本 。
该lib/required/目录包含Hibernate所需的所有JAR。此目录中的所有jar也必须包含在项目的类路径中。
该/lib/jpa/目录包含 hibernate-entitymanagerjar及其以外的依赖项lib/required/。这定义了Hibernate对JPA的支持 。
该lib/envers目录包含hibernate-envers jar及其以外的依赖项lib/required/
该lib/optional目录包含Hibernate可选功能所需的jar。
不知道能干到年底不,估计要转行,轻轻的来但不愿悄悄的走,只想留下些什么。
以前的笔记发出来,只想纪念 曾经 的wh
Object:对象,java对象,此处特指JavaBean
Relational:关系,二维表,数据库中的表。
映射|映射元数据:对象中属性,与表的字段,存在对应关系。
create database user_db;
user_db;
create table t_user(
id int auto_increment primary key,
username varchar(50),
password varchar(30)
);
主要导入的是lib下的required 的jar包
javabean
public class User {
/* 省略get set方法
* create table t_user(
id int auto_increment primary key,
username varchar(50),
password varchar(30)
);
*/
private Integer uid;
private String username;
private String password;
}
user.hbm.xml
主要是要添加约束文件
com.mysql.jdbc.Driver
jdbc:mysql:///h_day01_db
root
1234
@Test
public void demo01(){
User user = new User();
user.setUsername("伟哥哥");
user.setPassword("1234");
//1 加载配置文件获得核心配置对象
Configuration config = new Configuration().configure();
//2 获得工厂 SessionFactory,相当于连接池
SessionFactory factory = config.buildSessionFactory();
//3获得会话session,相当于链接Connection
Session session = factory.openSession();
//4 开启事务
Transaction transaction = session.beginTransaction();
//操作
session.save(user);
//5 提交事务 | 回滚事务
transaction.commit();
//6 释放资源--关闭session
session.close();
//7 释放资源--关闭工厂factory
factory.close();
}
可以看下数据库 有没有值
解决方案:
将映射文件添加到核心配置文件中 hbm.xml --> hibernate.cfg.xml
PO:persistent object ,用于与数据库交互数据。--dao层 (JavaBean + hbm )
BO:Business object 业务数据对象。--service层
VO:Value Object 值对象。--web层
不建议直接使用JavaBean 描述三个对象。最少也得有个vo
hibernate 核心配置文件种类
hibernate.cfg.xml 通常使用xml配置文件,可以配置内容更丰富。
hibernate.properties 用于配置key/value 形式的内容,key不能重复的。配置有很多的局限性。一般不用。
参考文件:hibernate-distribution-3.6.10.Final\project\etc\ hibernate.properties
提供了核心配置文件常用的配置项,及选择参数。
1.提供构造 new Configuration() hibernate将自动加载 hibernate.properties文件
hibernate.properties文件必须存放在类路径(src)下
2.提供方法 configure() 将加载src下的hibernate.cfg.xml
3.扩展api
configure(String) 加载指定目录下的 xml文件
4.手动加载配置文件
// 手动加载指定的配置文件
config.addResource("com/test/User.hbm.xml");
// 手动加载指定类,对应的映射文件 User--> User.hbm.xml
config.addClass(User.class);
常见异常
开发中:将hbm.xml映射 配置 hibernate.cfg.xml
学习中:可以使用 addClass 或 addResource
//打开一个新的会话 session
factory.openSession();
//获得当前线程中绑定的会话session
factory.getCurrentSession();
hibernate支持,将创建的session绑定到本地线程中,底层使用ThreadLocal,在程序之间共享session。
1.必须在hibernate.cfg.xml 配置
<property name="hibernate.current_session_context_class">threadproperty>
|
2.如果提交或回滚事务,底层将自动关闭session
save 保存
update 更新
delete 删除
get 通过id查询,如果没有 null
load 通过id查询,支持延迟加载,如果没有抛异常
createQuery("hql") 获得Query对象
createCriteria(Class) 获得Criteria对象
开启事务 beginTransaction()
获得事务 getTransaction()
提交事务:commit()
回滚事务:rollback()
try{
//开启
//session操作
//提交
} catch(e){
//回滚
}
扩展:不需要手动的管理事务,之后所有的事务管理都交予spring。
list() 查询所有
uniqueResult() 获得一个结果。如果没有查询到返回null,如果查询多条抛异常。
setFirstResult(int) 分页,开始索引数startIndex
setMaxResults(int) 分页,每页显示个数 pageSize
criteria.add(Restrictions.eq("username", "tom"));
// Restrictions.gt(propertyName, value) 大于
// Restrictions.ge(propertyName, value) 大于等于
// Restrictions.lt(propertyName, value) 小于
// Restrictions.le(propertyName, value) 小于等于
// Restrictions.like(propertyName, value) 模糊查询,注意:模糊查询值需要使用 % _
public class H3Utils {
// 会话工厂,整个程序只有一份。
private static SessionFactory factory;
static{
//1 加载配置
Configuration config = new Configuration().configure();
//2 获得工厂
factory = config.buildSessionFactory();
//3 关闭虚拟机时,释放SessionFactory
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
System.out.println("虚拟机关闭!释放资源");
factory.close();
}
}));
}
/**
* 获得一个新的session
* @return
*/
public static Session openSession(){
return factory.openSession();
}
/**
* 获得当前线程中绑定session
* * 注意:必须配置
* @return
*/
public static Session getCurrentSession(){
return factory.getCurrentSession();
}
}
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driverproperty> <property name="hibernate.connection.url">jdbc:mysql:///h_day01_dbproperty> <property name="hibernate.connection.username">rootproperty> <property name="hibernate.connection.password">1234property>
<property name="hibernate.current_session_context_class">threadproperty>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialectproperty>
<property name="hibernate.show_sql">trueproperty> <property name="hibernate.format_sql">trueproperty>
<property name="hibernate.hbm2ddl.auto">createproperty>
<property name="javax.persistence.validation.mode">noneproperty>
<mapping resource="com/itest/User.hbm.xml"/> session-factory> |
提供一个无参数 public访问控制符的构造器
提供一个标识属性,映射数据表主键字段
所有属性提供public访问控制符的 set get 方法(javaBean)
标识属性应尽量使用基本数据类型的包装类型
不要用final修饰实体 (将无法生成代理对象进行优化)
Java按地址区分同一个类的不同对象.
关系数据库用主键区分同一条记录
Hibernate使用OID来建立内存中的对象和数据库中记录的对应关系
结论: 对象的OID和数据库的表的主键对应。为保证OID的唯一性,应该让Hibernate来为OID赋值
主键需要具备: 不为空/不能重复/不能改变
自然主键: 在业务中,某个属性符合主键的三个要求.那么该属性可以作为主键列.
代理主键: 在业务中,不存符合以上3个条件的属性,那么就增加一个没有意义的列.作为主键.
基本数据类型和包装类型对应hibernate的映射类型相同
基本类型无法表达null、数字类型的默认值为0。
包装类默认值是null。当对于默认值有业务意义的时候需要使用包装类。
类型对应
Java数据类型 |
Hibernate数据类型 |
标准SQL数据类型 |
byte、java.lang.Byte |
byte |
TINYINT |
short、java.lang.Short |
short |
SMALLINT |
int、java.lang.Integer |
integer |
INGEGER |
long、java.lang.Long |
long |
BIGINT |
float、java.lang.Float |
float |
FLOAT |
double、java.lang.Double |
double |
DOUBLE |
java.math.BigDecimal |
big_decimal |
NUMERIC |
char、java.lang.Character |
character |
CHAR(1) |
boolean、java.lang.Boolean |
boolean |
BIT |
java.lang.String |
string |
VARCHAR |
boolean、java.lang.Boolean |
yes_no |
CHAR(1)('Y'或'N') |
boolean、java.lang.Boolean |
true_false |
CHAR(1)('Y'或'N') |
java.util.Date、java.sql.Date |
date |
DATE |
java.util.Date、java.sql.Time |
time |
TIME |
java.util.Date、java.sql.Timestamp |
timestamp |
TIMESTAMP |
java.util.Calendar |
calendar |
TIMESTAMP |
java.util.Calendar |
calendar_date |
DATE |
byte[] |
binary |
VARBINARY、BLOB |
java.lang.String |
text |
CLOB |
java.io.Serializable |
serializable |
VARBINARY、BLOB |
java.sql.Clob |
clob |
CLOB |
java.sql.Blob |
blob |
BLOB |
java.lang.Class |
class |
VARCHAR |
java.util.Locale |
locale |
VARCHAR |
java.util.TimeZone |
timezone |
VARCHAR |
java.util.Currency |
currency |
VARCHAR |
package 用于配置PO类所在包 例如: package="com.itheima.d_hbm" name:PO类全限定类名 例如:name="com.itheima.d_hbm.Person" 如果配置 package,name的取值可以是简单类名 name="Person" table : 数据库对应的表名 dynamic-insert="false" 是否支持动态生成insert语句 dynamic-update="false" 是否支持动态生成update语句 如果设置true,hibernate底层将判断提供数据是否为null,如果为null,insert或update语句将没有此项。 普通字段 name : PO类的属性 column : 表中的列名,默认name的值相同 type:表中列的类型。默认hibernate自己通过getter获得类型,一般情况不用设置 取值1: hibernate类型 string 字符串 integer 整形 取值2: java类型 (全限定类名) java.lang.String 字符串 取值3:数据库类型 varchar(长度) 字符串 int 整形
javabean 一般使用类型 java.util.Date jdbc规范提供3中 java类型 mysql类型 java.sql.Date date java.sql.time time java.sql.timestamp timestamp null datetime
以上三个类型都是java.util.Date子类
length : 列的长度。默认值:255 not-null : 是否为null unique : 是否唯一 access:设置映射使用PO类属性或字段 property : 使用PO类属性,必须提供setter、getter方法 field : 使用PO类字段,一般很少使用。 insert 生成insert语句时,是否使用当前字段。 update 生成update语句时,是否使用当前字段。 默认情况:hibernate生成insert或update语句,使用配置文件所有项 注意:配置文件如果使用关键字,列名必须使用重音符
|
主键 name:属性名称 access="" 设置使用属性还是字段 column="" 表的列名 length="" 长度 type="" 类型 1.increment 由hibernate自己维护自动增长 底层通过先查询max值,再+1策略 不建议使用,存在线程并发问题 2.identity hibernate底层采用数据库本身自动增长列 例如:mysql auto_increment 3.sequence hibernate底层采用数据库序列 例如:oracle 提供序列 4.hilo
5.native 根据底层数据库的能力选择 identity、sequence 或者 hilo 中的一个。【】 ##以上策略使用整形,long, short 或者 int 类型 6.uuid 采用字符串唯一值【】 ##以上策略 代理主键,有hibernate维护。 7.assigned 自然主键,由程序自己维护。【】 |