对象关系映射(ORM)已经在前面的博文中介绍了:ORM介绍
本篇博文主要来介绍Hibernate的基本映射
概念
关系:事物之间相互作用、相互联系的状态
关联:将对象(数据库表)之间通过某种方式联系起来
映射:将一种形式转化为另一种形式
基本映射:表与表之间没有任何联系(系统中的字典表)
Hibernate提供了几种映射方式
Hibernate基本组件
映射类(User.java):它是描述数据库表的结构,表中的字段被描述成属性,将来就可以实现把表中的记录映射成为该类的对象
映射文件(User.hbm.xml):它是指定数据库表和映射类之间的关系包括映射类和数据库表的对应关系、表字段和类属性类别的对应关系以及表字段和类属性名称的对应关系。
数据库配置文件(User.properties/User.cfg.xml):它是指定与数据库连接时需要的连接信息,例如:连接哪种数据库、登录数据库的用户名、登录密码以及连接字符串、映射类的地址映射信息
实例
1、映射实体类:User.java
<span style="font-size:18px;">package com.bjpowernode.hibernate;
import java.util.Date;
//默认空构造函数的重要性
public class User {
<span style="color:#ff0000;">//空的构造函数
public User(){
}
//有参数的构造函数
Public User(String id,String name,String password){
this.id=id;
this.name=name;
this.password=password;
}</span>
private String id;
private String name;
private String password;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
}</span>
实体类设计原则:
(1)提供一个标识
(2)提供无参的默认的构造函数
hibernate框架会调用默认构造实例对象。如果没有提供任何构造方法,虚拟机会自动提供默认构造方法;如果其他有参的构造方法,虚拟机就不再为你提供默认构造方法,这时必须将无参的构造方法手动写在代码里,否则实例化时会报错.
(3)建议不要使用final修饰实体类
采用load延时加载数据的时候会继承实体类生成代理对象
(4)建议为实体类生成getter和setter方法
如果不使用,所有属性都需要加上field标识
2、映射文件(User.hbm.xml)
<pre name="code" class="html"><span style="font-size:18px;"> <hibernate-mapping>
<!-- name为实体名,table属性对应着数据库中的表(如果省略此属性,表名为实体名) -->
<class name="com.bjpowernode.hibernate.User">
<!-- 主键映射,name属性是实体的标识符属性,对应数据库中的主键 -->
<id name="id">
<!-- 主键生成器,class为生成策略,根据不同需求设定 -->
<generator class="uuid"/>
</id>
<!-- 其他属性 -->
<property name="name"/>
<property name="password"/>
</class>
</hibernate-mapping>
</span>
3、数据库配置文件:hibernate.cfg.xml
<span style="font-family:SimSun;"> <span style="font-size:18px;"><!-- 数据库映射文件 -->
<hibernate-configuration>
<session-factory>
<!-- 数据库连接驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- hibernate_first为数据库名 -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property>
<!-- 数据库用户名和密码 -->
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<!-- 方言:为每一种数据库提供适配器,方便转换 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 数据库中的表与映射文件对应,如果不一致则更新表的结构 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 是否在后台显示hibernate语句转换为的sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 读取映射文件 -->
<mapping resource="com/bjpowernode/hibernate/User.hbm.xml"/>
</session-factory>
</hibernate-configuration></span></span>
4、客户端
public class Client {
public static void main(String[] args) {
//读取Hibernate.cfg.xml文件
Configuration cfg = new Configuration().configure();
//建立SessionFactory
SessionFactory factory = cfg.buildSessionFactory();
//取得session
Session session = null;
try {
session = factory.openSession();
//开启事务
session.beginTransaction();
User user = new User();
user.setName("高晓青");
user.setPassword("123");
//保存对象
session.save(user);
//提交事务
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
//回滚事务
session.getTransaction().rollback();
}finally {
if (session != null) {
if (session.isOpen()) {
//关闭session
session.close();
}
}
}
}
}
结果:
注:
单独创建表,那怎么办?
程序中写一个普通的main方法,用来批量生成表:ExportDB;直接运行是不可以的,因为还没有数据库hibernate_first,需要先建库,然后再执行ExportDB即可
public class ExportDB {
public static void main(String[] args) {
//默认读取hibernate.cfg.xml文件
Configuration cfg = new Configuration().configure();
SchemaExport export = new SchemaExport(cfg);
//会根据
hibernate.cfg.xml自动建数据库表
export.create(true, true);
}
}
本篇博文主要是hibernate的一个小实例,下面会继续总结hibernate的其他映射。