一,回顾
上一节介绍了hibernate如何使用xml文件来配置使用,我们发现除过hibernate的基本配置文件(hibernate.cfg.xml)外,每有一个实体类需要与数据库的中的表进行映射就需要建一个*.hbm.xml文件进行字段的映射,这是十分繁琐的一件事。幸好,hibernate提供了基于注解的功能来使用,减少了繁琐的配置文件的使用。
二,hibernate注解功能的使用
(1)新建一个普通的maven项目,引入相应的jar包依赖,我的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>com.mytest</groupId>
<artifactId>hibernate2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>hibernate2</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.5.4-Final</version>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.24.0-GA</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
</dependencies>
</project>
上面配置了hibernate的依赖,引入了mysql的驱动,还有就是日志的配置;
org.javassist的功能是用于操作java字节码的,hibernate依赖该jar包,注意,我使用的版本是3.24.0-GA,如果jdk版本低于1.8是无法使用的,会报相应的错误。如下:
Caused by: java.lang.UnsupportedClassVersionError: javassist/util/proxy/MethodFilter : Unsupported major.minor version 52.0
其中jdk1.8对应的version就是52.0
(2)新建hibernate的配置文件,hibernate.cfg.xml配置数据库口令,和具体映射的类。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mytest</property>
<property name="hibernate.connection.username">root</property>
<!-- 方言设置,不同的数据库有不同的方言信息,以下为mysql的 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!--2.2.显示Hibernate在运行的时候执行的sql语句-->
<property name="hibernate.show_sql">true</property>
<!--2.3.格式化sql-->
<property name="hibernate.format_sql">true</property>
<!--2.4.自动建表-->
<!-- 使用了该配置要是相应的表还没有被创建,那么在运行时hibernate会自动新建一个相应的表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping class="com.entity.User"></mapping>
</session-factory>
</hibernate-configuration>
上面的mapping class就是相应的需要映射的类,当然可以根据自己的情况配置多个,我们配置hibernate.hbm2ddl.auto为update,这样当没有创建表时,hibernate将会为我们自动创建一个,十分方便。
(3)新建需要映射的类com.entity.User
package com.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="tb_user")
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id")
private int id;
@Column(name="name",length=20,nullable=false)
private String name;
@Column(name="age")
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
这就是一个POJO,通过注解,hibernate会将它与数据库中的一个叫做tb_user的表进行映射,注意上面所用到的注解来自javax.persistence,这是java的jpa(Java Persistence API–java持久层api)规范,该规范定义了ORM框架需要遵守的规则,hibernate实现了该规范,因为orm框架不止hibernate,这样做的好处就是统一,只要是遵守了该规范,底层的ORM框架可以随意换,而不会造成什么影响。
主要注解的功能:
@Entity
@Table(name=“tb_user”)
上面的注解作用于类上,表示该类是一个持久层类,与数据库中的某个表具有映射的关系,name属性用于指明表的名称。
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
id注解作用于主键上,@GeneratedValue注解是用来定义主键的生成策略,它有好几个选择,此处使用strategy=GenerationType.AUTO就是没有定义具体的策略,这样主键就会根据底层数据库来自行选择,像mysql支持主键自增的策略,这样我们在插入数据时就不用再指定主键的字段;而oracle则需要通过序列来产生,就不支持自动产生主键的功能了。至于其他的生成策略,在使用时有需要进行查找就行了,此处不再赘言。
@Colum
该注解作用于属性上,表明该属性与表中的字段是映射关系。
三,测试
新建一个java类用于测试,我的类如下:
package com.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
import com.entity.User;
public class Test1 {
public static void main(String[] aggs) {
Session session = null;
Transaction tr = null;
try {
//还有使用Configuration进行初始化的,但它不支持注解的使用!!!
//也还有别的初始化的方式,详细的可以参照该类的实现,或者自行查找资料
//注意:AnnotationConfiguration是配合mapping class属性来扫描实体类进行初始化的,所以就不用再配置每个实体类的xml文件了。
AnnotationConfiguration cfg = new AnnotationConfiguration().configure("hibernate.cfg.xml");
//通过配置文件创建session工厂
SessionFactory sessionFactory = cfg.buildSessionFactory();
//开启session
session = sessionFactory.openSession();
//开启事务
tr = session.beginTransaction();
User user = new User();
user.setName("隔壁老王");
user.setAge(17);
session.save(user);
//事务要提交后才会保存到数据库中
tr.commit();
}catch(Exception e) {
//发生异常,进行回滚
if(tr != null)
tr.rollback();
}finally {
if(session != null) {
//记得使用完关闭session啊,该资源是有限的
session.close();
}
}
}
}
其中加载配置文件时请根据自己文件的位置选择相应的路径。
然后,运行,当看到控制台打印出sql语句就代表成功了呢!
至于其他的功能,hibernate支持多种方式进行增删查改,例如:HQL(Hibernate Query lanague),原生的sql语句等,网上一查一大堆,还有就是表跟表之间有关联关系,如一对一,一对多,多对多,就需要用到@OneToOne,@OneToMany,@ManyToMany注解,以及延迟加载的使用,该章节就不再赘言。