Hibernate快速入门
Hibernate快速入门
前两天学习完毕了Mybatis,今天来学习另一个ORM框架,Hibernate。
Hibernate的优势:
- 对象化
Hibernate可以使开发人员以面向对象的思想来对数据库进行操作。Jdbc只能通过sql语句将元素传递给数据库,进行数据库操作。但是Hibernate可以在底层对数据进行对象转化,使开发人员只用面向对象的思想和方式来存取数据即可。
- 更好的移植性
Hibernate使用XML或者jpa的配置以及数据库方言等等的一系列机制,使得Hibernate具有更好的移植性,面对不同的数据库,开发人员仅需要使用想的数据操作即可,无需关心数据库之间的差异,而直接使用Jdbc就不得不考虑数据库之间的差异的问题。
- 缓存机制的使用
Hibernate提供了缓存机制,(session缓存,二级缓存,查询缓存),对于那些改动不大且进场时用的数据,可以将它们放在缓存中,不必每次使用都去查询数据,缓存机制对于提升性能有很大的作用。
- 开发效率高
Hibernate提供了大量的封装(这也是它最大的缺点),很多数据操作以及关联关系等都被封装的很好,开发者不需要写大量的sql语句,这就极大的提高了开发者的开发效率。
Hibernate的快速入门小案例
老生常谈,先说说Hibernate需要什么
1.Jar包
2.要操作的数据库
3.实体类
4.实体类映射文件
5.核心配置文件
按照我们上述的分析,来一步一步的实现。
首先导入Jar包,因为我使用的是Maven工程,这里我就仅需要配置坐标就好了,这里写一下必须的jar包:
1.数据库连接驱动mysql-connector-java
2.hibernate-core
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.6.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
2.数据库:
(这里我就随便找了一个)
3.实体类:
public class News {
private int nid;
private String title;
private String content;
private String photo;
@Override
public String toString() {
return "News{" +
"nid=" + nid +
", title='" + title + '\'' +
", content='" + content + '\'' +
", photo='" + photo + '\'' +
'}';
}
public int getNid() {
return nid;
}
public void setNid(int nid) {
this.nid = nid;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getPhoto() {
return photo;
}
public void setPhoto(String photo) {
this.photo = photo;
}
}
4.实体类对应的映射文件:
命名规范为XXX.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>
<!-- 建立类与表的映射 -->
<class name="com.bean.News" table="news">
<!-- 建立类中的属性与表中的主键相对应 -->
<id name="nid" column="nid">
<!-- 主键的生成策略,后面会讲,现在使用的是本地生成策略 -->
<generator class="native" />
</id>
<!-- 建立类中的普通属性和表中的字段相对应 -->
<property name="title" column="title" />
<property name="content" column="content" />
<property name="photo" column="photo" />
</class>
</hibernate-mapping>
解释一下这里的几个关键的标签和标签属性:
< class >标签中的name属性就是代表你要操作哪个数据库表所对应的实体类的全类名,table属性也显而易见,就是对应数据库的那张表。
剩下的属性和mybatis的映射文件相同,如果映射的是主键,就是用id标签,如果映射的不是主键,就使用property标签,name对应实体类中的属性,column对应数据库表中的列名。
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>
<!-- 下面是三个必须要有的配置 -->
<!-- 配置连接MySQL数据库的基本参数 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate_demo01</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 配置Hibernate的方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 下面两个是可选的配置哟! -->
<!-- 打印sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化sql语句 -->
<property name="hibernate.format_sql">true</property>
<!-- 告诉Hibernate的核心配置文件加载哪个映射文件 -->
<mapping resource="com/bean/News.hbm.xml"/>
</session-factory>
</hibernate-configuration>
这个就没啥好说的了。
hibernate需要的文件都创建完毕了,接下来就是创建一个测试类,来对hibernate的功能进行测试,我们这个demo就实现CRUD功能。
创建测试类:
//这里我使用的是单元测试:
import com.offcn.bean.News;
import com.offcn.bean.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.List;
public class Hibernate02 {
Session session;
Transaction transaction;
SessionFactory sessionFactory;
@Before
public void init() {
//1. 加载Hibernate的核心配置文件
Configuration configuration = new Configuration().configure();
//如果在Hibernate的核心配置文件没有设置加载哪个映射文件,则可手动加载映射文件
//configuration.addResource("com/meimeixia/hibernate/demo01/Customer.hbm.xml");
//2. 创建SessionFactory对象,类似于JDBC中的连接池
sessionFactory = configuration.buildSessionFactory();
//3. 通过SessionFactory获取到Session对象,类似于JDBC中的Connection
session = sessionFactory.openSession();
//4. 手动开启事务,(最好是手动开启事务)
transaction = session.beginTransaction();
}
//增加
@Test
public void insert(){
News news = new News();
news.setTitle("号外号外");
news.setContent("大新闻");
news.setPhoto("photo01");
session.save(news);
}
//删除
@Test
public void delete(){
//删除方法里面传递的也是一个对象
News news = new News();
news.setNid(12);
session.delete(news);
}
//修改
@Test
public void update(){
//对象其中必须包含主键
News news = new News();
news.setTitle("修改后Title");
news.setContent("修改后Content");
news.setNid(10);
session.update(news);
}
//查询
@Test
public void findById(){
//有两种查询的方法,get和load,load具有延迟加载的效果。
News news = session.get(News.class, 10);
System.out.println(news);
News news1 = session.load(News.class, 10);
System.out.println(news1);
}
@After
public void commit(){
transaction.commit();
session.close();
sessionFactory.close();
}
}
增加操作的结果
删除操作的结果
日志文件打印的sql语句:
修改操作的结果:
查询操作的结果
快速入门就是以上的啦,喜欢请点个赞。