Hibernate的使用(二)

本文详细介绍Hibernate使用注解配置的全过程,从Maven项目搭建、数据库连接配置,到实体类映射及测试,深入浅出讲解注解功能,简化XML配置,提升开发效率。

一,回顾

上一节介绍了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注解,以及延迟加载的使用,该章节就不再赘言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值