Java
Java Web框架

Hibernate(3)

简介:Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

1. 核心配置文件详解

  • <?xml version="1.0" encoding="UTF-8"?>
  • <!DOCTYPE hibernate-configuration PUBLIC
  • "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  • "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
  • <hibernate-configuration>
  • <session-factory>
  • <!-- property 元素用于配置Hibernate中的属性
  • 键:值
  • -->
  • <!-- hibernate.connection.driver_class : 连接数据库的驱动 -->
  • <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  • <!-- hibernate.connection.username : 连接数据库的用户名 -->
  • <property name="hibernate.connection.username">root</property>
  • <!-- hibernate.connection.password : 连接数据库的密码 -->
  • <property name="hibernate.connection.password">1234</property>
  • <!-- hibernate.connection.url : 连接数据库的地址,路径 -->
  • <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/EE19Day01</property>
  • <!-- show_sql: 操作数据库时,会 向控制台打印sql语句 -->
  • <property name="show_sql">true</property>
  • <!-- format_sql: 打印sql语句前,会将sql语句先格式化 -->
  • <property name="format_sql">true</property>
  • <!-- hbm2ddl.auto: 生成表结构的策略配置
  • update(最常用的取值): 如果当前数据库中不存在表结构,那么自动创建表结构.
  • 如果存在表结构,并且表结构与实体一致,那么不做修改
  • 如果存在表结构,并且表结构与实体不一致,那么会修改表结构.会保留原有列.
  • create(很少):无论是否存在表结构.每次启动Hibernate都会重新创建表结构.(数据会丢失)
  • create-drop(极少): 无论是否存在表结构.每次启动Hibernate都会重新创建表结构.每次Hibernate运行结束时,删除表结构.
  • validate(很少):不会自动创建表结构.也不会自动维护表结构.Hibernate只校验表结构. 如果表结构不一致将会抛出异常.
  • -->
  • <property name="hbm2ddl.auto">update</property>
  • <!-- 数据库方言配置
  • org.hibernate.dialect.MySQLDialect (选择最短的)
  • -->
  • <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  • <!-- hibernate.connection.autocommit: 事务自动提交 -->
  • <property name="hibernate.connection.autocommit">true</property>
  • <!-- 将Session与线程绑定=> 只有配置了该配置,才能使用getCurrentSession -->
  • <property name="hibernate.current_session_context_class">thread</property>
  • <!-- 引入ORM 映射文件
  • 填写src之后的路径
  • -->
  • <mapping resource="com/itheima/a_hello/User.hbm.xml"/>
  • </session-factory>
  • </hibernate-configuration>

2. Hibernate中持久化类

2.1. 编写规则

  • 提供一个无参数public访问控制符的构造器;
  • 提供一个标识属性,映射数据表主键字段;
  • 所有属性提供public访问控制符的setget方法(JavaBean);
  • 标识属性应尽量使用基本数据类型的包装类型;
  • 不要用final修饰实体,将无法生成代理对象(因为代理对象时以继承方式生成的)进行优化。

2.2. 持久化对象的唯一标识OID

  • Java按地址区分同一个类的不同对象;
  • 关系数据库用主键区分同一条记录;
  • Hibernate使用OID来建立内存中的对象和数据库中记录的对应关系;

结论: 对象的OID和数据库的表的主键对应。为保证OID的唯一性,应该让Hibernate来为OID赋值。

2.3. 区分自然主键和代理主键

主键需要具备: 不为空,不能重复,不能改变。

  • 自然主键:在业务中,某个属性符合主键的三个要求,那么该属性可以作为主键列;
  • 代理主键:在业务中,不存符合以上3个条件的属性,那么就增加一个没有意义的列作为主键。

2.4. 基本数据与包装类型

  • 基本数据类型和包装类型对应hibernate的映射类型相同
  • 基本类型无法表达null、数字类型的默认值为0
  • 包装类默认值是null,当对于默认值有业务意义的时候需要使用包装类。

2.5. 属性详解(User.hbm.xml)

  • <?xml version="1.0" encoding="UTF-8"?>
  • <!DOCTYPE hibernate-mapping PUBLIC
  • "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  • "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  • <!-- ORM元数据 表对象关系映射文件
  • package : 配置该配置文件中类所在的包. -->
  • <hibernate-mapping package="com.coderap.hello" >
  • <!--
  • class:配置实体与表的关系
  • name:填写实体的完整类名
  • table:与实体对应表的名称
  • dynamic-insert:动态插入,默认值是false
  • true,如果字段值为null,不参与insert语句
  • dynamic-update:动态更新,默认值是false
  • true,没改动过的属性,将不会生成到update语句中
  • -->
  • <class name="User" table="t_user" >
  • <!--
  • id:配置实体与表中id对应
  • name:user对象中标识主键的属性名称
  • column:主键在表中的列名
  • length:列的数据长度
  • unsaved-value(不常用):指定主键为什么值时,,当做null来处理
  • access(强烈推荐不要用):field,那么在操作属性时,会直接操作对应的字段而不是get/set方法
  • -->
  • <id name="id" column="id" length="255" >
  • <!--
  • generator:主键生成策略
  • 1.increment:数据库自己生成主键,先从数据库中查询最大的ID值,将ID值加1作为新的主键
  • 2.identity:依赖于数据的主键自增功能
  • 3.sequence:序列,依赖于数据中的序列功能(Oracle)
  • 4.hilo(纯了解,永远用不到):Hibernate自己实现序列的算法,自己生成主键(hilo算法)
  • 5.native:自动根据数据库判断,三选一:identity|sequence|hilo
  • 6.uuid:生成32位的不重复随机字符串当做主键
  • 7.assigned:自己指定主键值,表的主键是自然主键时使用
  • -->
  • <generator class="uuid"></generator>
  • </id>
  • <!--
  • property : 实体中属性与表中列的对应
  • name : 实体中属性名称
  • column : 表中列的名称
  • length : 数据长度
  • precision: 小数点后的精度
  • scale: 有效位数
  • insert(一般不用): 该属性是否加入insert语句
  • update(一般不用): 该属性是否加入update语句
  • not-null : 指定属性的约束是否使用 非空
  • unique : 指定属性的约束是否使用 唯一
  • -->
  • <!--
  • type: 表达该属性的类型,可以用三种方式指定属性
  • -->
  • <property name="name" column="name" update="true" type="string" ></property>
  • <property name="password" column="password"></property>
  • <property name="sal" column="sal" precision="2" scale="3" ></property>
  • </class>
  • </hibernate-mapping>

2.5.1. 类型对应

上面的讲解中<property name="name" column="name" update="true" type="string" ></property>中的type属性可以取以下类型的值:

Java数据类型 Hibernate数据类型 标准SQL数据类型(对于不同的DB可能有所差异)
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.BigDecima 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