Hibernate ORM框架学习日记基础篇-1
一、简介
Hibernate是轻量级Java EE应用的持久层解决方案,不仅管理Java类库到数据库表的映射,还提供数据查询和获取数据的
方法,它完成对象模型和基于SQL的关系模型的映射关系,使得开发者可以完全采用面向对象的方法来开发应用程序。
ORM全称为Object/Relation Mapping,即对象/关系数据库映射,完成面向对象到关系数据库的映射,将关系数据库包装成
面向对象的模型
二、hibernate 及相关下载
在Eclipse中新建一个项目,然后准备好需要的jar包,数据库使用的是mysql
a.官网下载hibernate orm jar包,解压之后将lib中的required所有jar包导入项目
b.由于使用mysql数据库连接,所以要将mysql的数据库连接的jar导入项目,即mysql-connector-java-5.1.42-bin.jar
c.这里使用c3p0数据源进行数据库的连接管理,所以需要将下载的hibernate jar包中的lib文件夹下的optional文件夹下的
c3p0文件夹下的所有jar包导入项目
d.测试类需要用到JUnit,需要在项目中导入JUnit4的jar包
三、开始使用hibernate
1.创建持久化对象
持久化对象(PO)是hibernate中重要的媒介,以面向对象的方式完成对数据库的增删改的操作,在我们对持久化进行创建、修改
删除的操作时,不需要去再去操作数据库,hibernate会负责把这种操作转换为对数据库表的操作。
持久化对象(PO)= java的普通传统对象POJO+持久化的注解
import java.util.Date; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity @Table(name="user_info") public class User { private Integer userId; private String userName; private String telNumber; private Date registerDate; @Id @GeneratedValue(strategy=GenerationType.IDENTITY) public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getTelNumber() { return telNumber; } public void setTelNumber(String telNumber) { this.telNumber = telNumber; } @Temporal(TemporalType.TIMESTAMP) @Column(name="registerDate") public Date getRegisterDate() { return registerDate; } public void setRegisterDate(Date registerDate) { this.registerDate = registerDate; } }
上面创建一个名为User的持久化对象,并使用了相应的注解
@Entity 表明该类为Hibernate的持久化类
@Table 指定该类映射的数据库中的表,user_info
@Id 表示该类的标识属性,一般对应数据库的主键
@GeneratedValue: 表示主键的生产策略,此处的策略为自动增长
@Column:对应表中的字段名称
@Temporal:处理时间的格式
…
通过上面的注解就将POJO类映射到了数据库的user_info表中
二、配置文件hibernate.cfg.xml
右击src文件夹,新建文件,命名为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/huan</property> <property name="connection.username">root</property> <property name="connection.password">root</property> <!-- 连接池管理策略 --> <!-- 最大连接数 --> <property name="hibernate.c3p0.max_size">100</property> <!-- 最小连接数 --> <property name="hibernate.c3p0.min_size">10</property> <!-- 获得连接的超时时间,如果超过这个时间,会抛出异常,单位毫秒 --> <property name="hibernate.c3p0.timeout">5000</property> <!-- 最大的PreparedStatement的数量 --> <property name="hibernate.c3p0.max_statements">100</property> <property name="hibernate.c3p0.idle_test_period">300</property> <property name="hibernate.c3p0.acquire_increment">2</property> <property name="hibernate.c3p0.validate">true</property> <!-- 数据库的方言 --> <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> <!-- 根据需要自动创建表 如果表存在不新建表,只操作数据 --> <property name="hbm2ddl.auto">update</property> <!-- 打印sql --> <property name="show_sql">true</property> <!-- 格式化打印的sql --> <property name="hibernate.format_sql">true</property> <!-- 罗列持久化的类名 --> <mapping class="com.huan.entity.User"/> </session-factory> </hibernate-configuration>
hibernate配置文件的默认名称为hibernate.cfg.xml,hibernate会自动去加载该文件。
三、测试使用hibernate
import java.util.Date; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.huan.entity.User; public class HibernateBasicUseTest { private SessionFactory sessionFactory; @Before public void setUp() { //解析配置文件 默认去加载hibernate.cfg.xml Configuration config = new Configuration().configure(); //创建SessionFactory实例 sessionFactory = config.buildSessionFactory(); } @After public void tearDown(){ sessionFactory.close(); } @Test public void testHibernateBasicUse(){ //创建Session Session session = sessionFactory.openSession(); //开启事务 Transaction tx = session.beginTransaction(); //操作持久化对象 User user = new User(); user.setRegisterDate(new Date()); user.setTelNumber("15678986774"); user.setUserName("aha"); //保存 session.save(user); //事务提交 tx.commit(); //关闭Session session.close(); } }
上面代码创建了一个测试类,对于使用Hibernate可以总结为如下步骤
1.获取Configuration实例(加载配置文件)
2.获取SqlSessionFactory
3.获取Session
4.开启事务Transaction
5.完成业务逻辑,使用Session操作持久化对象,即完成对数据库的操作
6.提交事务,关闭Session
运行上面的测试类,由于之前的<property name="hbm2ddl.auto">update</property>为update,在没有表的情况下hibernate会先去创建表,
所以第一次运行上面的测试类可以看到控制台输出了两条SQL语句。
然后到数据库中查看是否已经新建了表并且保存了数据:
结果表明测试运行成功,整个过程并没有手写sql语句去操作数据库,这个操作由hibernate去完成,我们操作的仅仅是User对象。
这应该就是ORM框架的特色吧。