Hibernate那些事之快速入门

                   --昨夜西风凋碧树,独上高楼,望尽天涯路

        Hibernate事轻量级JavaEE应用的持久层解决方案,不仅管理Java类到数据库表的映射(包括Java数据类型到SQL数据类型的映射),还提供数据查询和获取数据的方法,可以大幅度缩短处理数据持久化的时间。Hibernate倡导低侵入的设计,完全采用普通Java对象(POJO)编程,不要求PO继承Hibernate的某个超类或者实现某个接口。

        下面先介绍一下ORM,ORM的全称是Object/Relation Mapping,即对象/关系数据库映射。ORM可以理解成一种规范,它概述了这类框架的基本特征:完成面向对象的编程语言到关系数据库的映射。ORM工具的作用就是:把对持久化对象的保存、删除、修改等操作,转换成对数据库的操作。从此,程序员可以以面向对象的方式操作持久化对象,而ORM框架负责转换成对应的SQL(结构化查询语言)操作。

        ORM的基本映射方式无非是数据表映射Java类(POJO),数据表的行映射对象(实例),数据列(字段)映射对象的属性。

        Hibernate是当前流行得一款ORM框架,下面我们开始系统的学习它。

        首先建立MAVEN工程,pom文件如下:

 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>luffy</groupId>
  <artifactId>hibernate</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
   <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <!-- 添加Hibernate依赖 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.2.1.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-c3p0</artifactId>
            <version>5.2.1.Final</version>
        </dependency>
 
        <!-- 添加Log4J依赖 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.16</version>
        </dependency>
 
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-nop</artifactId>
            <version>1.6.4</version>
        </dependency>
 
        <!-- 添加javassist -->
        <dependency>
            <groupId>javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.12.0.GA</version>
        </dependency>
 
        <!-- mysql数据库的驱动包 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
    </dependencies>
</project>

        由于Hibernate提供了注解和XML的方式进行映射,我们采用的是xml的方式,只要懂得其原理,二者实际上是一样的。

        建立了POM文件,之后我们编写Hibernate的核心配置文件:

<?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="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!-- 配置数据库驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 配置数据库url -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_test</property>
<!-- 配置用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- 配置密码 -->
<property name="hibernate.connection.password">luffylucy</property>
<!-- 是否输出Hibernate生成的aql语句,开启为true -->
<property name="show_sql">true</property>
<!-- ddl语句自动建表 -->
<property name="hbm2ddl.auto">update</property>
<!-- 是否对输出SQL进行格式化 -->
<property name="format_sql">true</property>

<!-- 连接池的配置 -->
 <property name="hibernate.connection.provider_class">
 org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>

<!-- C3P0随机准备好的最少的JDBC连接数量 -->
<property name="hibernate.c3p0.min_size">5</property>

<!-- 连接池的最大JDBC连接数量 -->
<property name="hibernate.c3p0.max_size">20</property>

<!-- 配置超时周期,在他之后,休闲连接将从连接池中移除 -->
<property name="hibernate.c3p0.timeout">300</property>

<!-- 最多高速缓存100个预编译语句,该属性是使Hibernate获得良好性能的要素 -->
<property name="hibernate.c3p0.max_statements">100</property>

<!-- 连接池被自动验证前,以秒为单位的闲置时间 -->
<property name="hibernate.c3p0.idle_test_period">3000</property>

<mapping class="com.luffy.domain.News"/>

<!--  注册ORM实体类映射文件 
<mapping resource="com/caokaiyuan/domain/User.hbm.xml"/> -->

</session-factory>
</hibernate-configuration>

        在hibernate_test库种建立表:news_inf。建表语句:

CREATE TABLE news_inf (
  `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
  `title` VARCHAR(20) DEFAULT NULL,
  `content` VARCHAR(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8

        下面我们编写POJO(这里请注意,POJO种的字段请与数据表中的对应,后面会讲解通过@Column注解来匹配):

@Entity
@Table(name="news_inf")
public class News {
	
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private Integer id;
	
	private String title;
	
	private String content;
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	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;
	}

        @Entity注解声明该类是一个Hibernate的持久化类

        @Table指定该类映射的表。此处指定该类映射到news_inf表

        @Id用于指定该类的标志属性。所谓标识属性,就是可以唯一标识该对象的属性,标识属性通常映射到数据表的主键列

        @GenerateValue用于指定的主键生成策略,其中strategy属性指定了主键生成策略为IDENTITY,也就是自动增长生成策略

        由于Hibernate与JPA的关系非常密切,所以以上四个注解都是JPA规范种的注解,位于javax.persistence包下。

        现在我们编写Hibernate代码,就可以进行操作了:

@Test
	public void insertData(){
		Configuration conf = new Configuration().configure();
		SessionFactory sf = conf.buildSessionFactory();
		Session session = sf.openSession();
		Transaction tx = session.beginTransaction();
		News n = new News();
		n.setTitle("海贼王");
		n.setContent("我是要成为海贼王的男人");
		session.save(n);
		tx.commit();
		session.close();
		sf.close();
	}

        执行后控制台打印信息: 

log4j:WARN No appenders could be found for logger (org.jboss.logging).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Hibernate: 
    insert 
    into
        news_inf
        (content, title) 
    values
        (?, ?)

        现在为止,我们已经简单的搭建好了一个Hibernate的环境,至于具体参数,API,配置的编写。


猜你喜欢

转载自blog.csdn.net/weixin_37417954/article/details/80002370