ORM
ORM-对象关系映射。
O:对象(java中的实体类)
R:关系(数据库中的数据表)
M:映射(将实体类与数据库表之间的关系说明清楚)
持久层
Hibernate
它是一个轻量级,企业级,开源的ORM持久层框架。是可以操作数据库的框架。
通常情况下,软件工程的持久层解决方案,一个为主一个为辅。两者并存(写SQL语句的和不写SQL语句的)。
轻量级:指的是使用时依赖的资源很少(目前我们使用的阶段,只依赖log4j,c3p0连接池)。
企业级:指的是在企业级应用中使用的比较多。
开源:开放源代码。
ORM的操作方式:建立对象关系映射,实现操作实体类就相当于操作数据库表。
入门案例
1、准备数据库
库名:hibernate
表名:goods
2、导入Hibernate的jar文件
3、实体类:Goods.java
package org.haiwen.entity;
public class Goods {
private Integer goodsId;
private String goodsName;
private Float goodsPrice;
private Integer goodsNumber;
public Goods() {
super();
}
public Goods(Integer goodsId, String goodsName, Float goodsPrice, Integer goodsNumber) {
super();
this.goodsId = goodsId;
this.goodsName = goodsName;
this.goodsPrice = goodsPrice;
this.goodsNumber = goodsNumber;
}
public Integer getGoodsId() {
return goodsId;
}
public void setGoodsId(Integer goodsId) {
this.goodsId = goodsId;
}
public String getGoodsName() {
return goodsName;
}
public void setGoodsName(String goodsName) {
this.goodsName = goodsName;
}
public Float getGoodsPrice() {
return goodsPrice;
}
public void setGoodsPrice(Float goodsPrice) {
this.goodsPrice = goodsPrice;
}
public Integer getGoodsNumber() {
return goodsNumber;
}
public void setGoodsNumber(Integer goodsNumber) {
this.goodsNumber = goodsNumber;
}
@Override
public String toString() {
return "Goods [goodsId=" + goodsId + ", goodsName=" + goodsName + ", goodsPrice=" + goodsPrice
+ ", goodsNumber=" + goodsNumber + "]";
}
}
4、ORM文件:Goods.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">
<hibernate-mapping>
<!-- 1.配置类和表对应
class标签
name属性:实体类全路径
table属性:数据库表名称 -->
<class name="org.haiwen.entity.Goods" table="goods">
<!-- 2.配置实体类id和表id对应
hibernate要求实体类有一个属性唯一值
hibernate要求表有字段作为唯一值 -->
<!-- id标签
name属性:实体类里面id属性名称
column属性:生成的表字段名称 -->
<id name="goodsId" column="goods_id">
<!-- 设置数据库表id增长策略
native:生成表id值就是主键自动增长
没有序列写assigned -->
<generator class="native" />
</id>
<!-- 配置其他属性和表字段对应
name属性:实体类属性名称
column属性:生成表字段名称 -->
<property name="goodsName" type="java.lang.String" column="goods_name" />
<property name="goodsPrice" type="java.lang.Float" column="goods_price" />
<property name="goodsNumber" type="java.lang.Integer" column="goods_number" />
</class>
</hibernate-mapping>
5、配置文件:hibernate.cfg.xml
<?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 name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- 第二部分:配置hibernate信息,可选的 -->
<!-- 输出底层sql语句 -->
<property name="show_sql">true</property>
<!-- 输出底层sql语句格式 -->
<property name="format_sql">true</property>
<!-- dialect 表示方言,针对不同的数据库产品,在翻译成SQL语句时是不同 -->
<!-- mysql的是org.hibernate.dialect.MySQLDialect -->
<!-- oracle的是org.hibernate.dialect.Oracle10gDialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Hibernate的hbm2ddl(数据定义语言)属性-->
<!-- hbm2ddl.auto的取值
none:不用Hibernate自动生成表
create:每次都会创建一个新的表
create-drop:每次都会创建一个新的表,执行程序结束后删除这个表
update:如果数据库中有表,使用原来的表,如果没有表,创建一个新表,可以更新表结构
validate:只会使用原有的表,对映射关系进行校验 -->
<property name="hibernate.hbm2dll.auto">update</property>
<!-- 第三部分:把映射文件放到核心配置文件中 -->
<mapping resource="org/haiwen/entity/Goods.hbm.xml"/>
</session-factory>
</hibernate-configuration>
6、测试类:T1.java
package org.haiwen.test;
import org.haiwen.entity.Goods;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
public class T1 {
@Test
public void T1() {
Goods goods = new Goods(null, "步枪M4", 41F, 10);
// 1.解析主配置文件
Configuration c = new Configuration().configure();
// 2.根据配置文件创建SessionFactory
SessionFactory sf = c.buildSessionFactory();
// 3.根据SessionFactory创建Session
Session session = sf.openSession();
System.out.println(session);
// 4.开启事务
session.getTransaction().begin();
// 5.执行操作
session.save(goods);
// 6.提交事务
session.getTransaction().commit();
// 7.释放资源
session.close();
sf.close();
}
}
实体类的编写规范应该遵循JavaBean的编写规范
Bean:在软件开发中指可用的组件
JavaBean:指的是java语言编写的可重用组件
编写规范:
- 类都是public修饰,一般实现序列化接口
- 默认无参构造函数
- 属性都是私有的,设置公有get/set方法
- 基本类型和包装类型,选择包装类型(比如考试时,为了区分缺考和0分)