目录
1. 学习网址
2. 简介
2.1. ORM
- [概念] 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
2.2. 创始人
Gavin King
2.3. 用途
- 解决阻抗不匹配的问题
- 将对象模型存入关系模型中
- 实体类对应关系型中的一个表
- 实体类的一个属性对应关系型数据库表中的一个列
- 实体类的一个实例对应关系型数据库表中的一条记录
- 简化编程
2.4. 优缺点
- 无需编写SQL,操作面向对象,提高生产效率
- 开发对象化
- 移植性好(更换数据库时,只需更改相应配置文件)
- 透明持久化(对象无需继承框架任何类或接口)
- 轻量级框架(无侵入性)
- 测试方便
3. 对象关系映射
3.1. 对象-关系映射模式
- 属性映射
- 类映射
- 关联映射
- 一对一
- 一对多
- 多对多
3.2. 常用的O/R映射框架
- Hibernate
- ApacheOJB
- JDO
- Toplink
- EJB
- IBatis
- JAP
4. 基础配置
4.1. 依赖包配置(Maven)
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate </groupId>
<artifactId> hibernate-entitymanager</artifactId>
<version>5.2.1.final</version>
</dependency>
<dependency>
<groupId>org.hibernate </groupId>
<artifactId>hibernate-ehcache </artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate </groupId>
<artifactId>hibernate-validator </artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>net.sf.ehcache </groupId>
<artifactId>ehcache </artifactId>
<version>2.9.0</version>
</dependency>
4.2. 日志环境
- maven配置log4j和slf4j
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.2</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
- 创建log4j配置文件log4j.properties,并设
log4j.logger.org.hibernate.tool.hbm2ddl = debug
4.3. JUnit环境
- Maven配置
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
- 创建测试类
public class UserTest {
private static SessionFactory sf = null;
@BeforeClass // 表示JUnit此类被加载到内存中就执行这个方法
public static void beforeClass() {
sf = new AnnotationConfiguration().configure().buildSessionFactory();
}
@Test
public void testUserSave() {
User user = new User();
user.setName(str);
Session session = sf.openSession();
session.beginTransaction();
session.save(t);
session.getTransaction().commit();
session.close();
}
@AfterClass // JUnit在类结果时,自动关闭
public static void afterClass() {
sf.close();
}
}
- 输出SQL语句到控制台:
log4j.logger.org.hibernate.SQL = debug
或者在hibernate配置文件中设置<property name="format_sql">true</property>
- SQL语句格式化输出:
<property name="hibernate.show_sql">true</property>
样式如下:
16:32:39,750 DEBUG SchemaExport:377 -
create table Teacher (
id integer not null,
name varchar(255),
title varchar(255),
primary key (id)
)
5. Annotation
5.1. 实体类-表 映射
@Entity
@Table(name = "tableName")
public class User {
}
5.2. 属性-字段 映射
- 名称相同
@Basic
- 名称不同
@Column(name="_colname")
5.3. 属性不需持久化
@Transient
public String getName() {
}
5.4. 时间类型属性
@Temporal(value=TemporalType)
其中TemporalType有三个值:
- TemporalType.TIMESTAMP 表示yyyy-MM-dd HH:mm:ss
- TemporalType.DATE 表示yyyy-MM-dd
- TemporalType.TIME 表示HH:mm:ss
@Temporal(value=TemporalType.DATE)
public Date getDate() {
return date;
}
5.5. 枚举类型属性
- 枚举注解
@Enumerated(value=EnumType)
其中EnumType有两个值:
- EnumType.STRING 表示直接将枚举名称存入数据库
EnumType.ORDINAL 表示将枚举所对应的数值存入数据库
@Convert
如果想数据库保存的是枚举类的value值,应实现类型转换类
/**
* 枚举类型
*/
public enum Power {
Normal("普通师生"),
Checker("检查员"),
Manager("管理员");
private String value;
private Power(String value) {
this.value = value;
}
public String getValue() {
return this.value;
}
// 实现转换方法
public static Power fromString(String value) {
Objects.requireNonNull(value,"Power value can not be null");
Power power = null;
if("普通师生".equals(value)) {
power = Normal;
} else if("检查员".equals(value)) {
power = Checker;