注:由于以前自己在学校学习的框架的是Mybatis,由于Mybatis有对数据库的限制,所以现在进公司后,需要重新学习Hibernate,记录一下,一起学习。
一:环境搭建
1.所需jar包:
Hibernate-core-5.1.0.Final.jar ,dom4j-1.6.1.jar,log4j-core-2.5.jar,javassist-3.20.0-GA.jar
mysql-connector-java-5.1.34.jar,antlr-2.7.7.jar,commons-logging-1.2.jar,cglib-2.2.2.jar
commons-collections-3.2.1.jar,javax.transaction-1.1.jar
2.如果使用maven管理jar包,下面是使用maven的依赖,不使用maven就手动导入jar包:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.1.0.Final</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.20.0-GA</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>
<dependency>
<groupId>antlr</groupId>
<artifactId>antlr</artifactId>
<version>2.7.7</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
<version>1.1</version>
</dependency>
</dependencies>
3.我使用的是MySQL,创建表Student和Class,下面是创建sql语句:
create table class(
id int primary key auto_increment,
classname varchar(50)
);
create table student(
id int primary key auto_increment,
studentname varchar(50),
classid int
);
alter table student add constraint fk_classid foreign key(classid) references class(id);
insert into student values(1,'完全',1);
insert into student values(2,'玩去',1);
insert into class values(1,'三年二班');
4.创建相对应的实体类Class.java和Student.java:
Class.java如下: 属性和数据库中的列对应,类实现序列化接口,自动生成序列化ID,右键source生成Get/Set方法和toString方法
Student.java如下:这个类中也和数据库中的列对应,这里用对象对应数据库中的classid属性
5.创建实体类的映射文件Class.hbm.xml和Student.hbm.xml和hibernate.cfg.xml,并将三个资源文件放在src/main/resources包下面
,这样不用指定绝对路径,可以自动加载resources下面的配置文件。
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>
<!--当show_sql属性为true时表示在程序运行时在控制台输出SQL语句,默认为false,建议在调试程序时设为true,发布程序之前再改为false,因为输出SQL语句会影响程序的运行速度-->
<property name="show_sql">true</property>
<!--指定连接数据库用的驱动-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!--指定连接数据库的密码-->
<property name="hibernate.connection.password">a</property>
<!--指定连接数据库的路径-->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<!--指定连接数据库的用户名-->
<property name="hibernate.connection.username">root</property>
<!--指定数据库使用的SQL方言-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!--指定是否按照标准格式在控制台上输出SQL语句-->
<property name="format_sql">true</property>
<!--指定是否在SQL语句中输出便于调试的注释信息-->
<property name="use_sql_comments">true</property>
<!-- 配置映射文件路径 -->
<mapping resource="Class.hbm.xml"/>
<mapping resource="Student.hbm.xml" />
</session-factory>
</hibernate-configuration>
这里是实体的映射文件路径,因为student的映射文件需要使用class对象,所以需要将Class的映射放前面,需要先加载
Class.hbm.xml配置如下:
<?xml version="1.0"?>
<!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.yk.model.Class" table="class" catalog="hibernate" optimistic-lock="version">
<id name="id" type="integer">
<column name="id" />
<generator class="identity" />
</id>
<property name="classname" type="java.lang.String">
<column name="classname" />
</property>
</class>
</hibernate-mapping>
Student.hbm.xml配置如下:
<?xml version="1.0"?>
<!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.yk.model.Student" table="student" catalog="hibernate" optimistic-lock="version">
<id name="id" type="integer">
<column name="id" />
<generator class="identity" />
</id>
<property name="studentname" type="java.lang.String">
<column name="studentname" />
</property>
<many-to-one name="clas" class="com.yk.model.Class">
<column name="classid"></column>
</many-to-one>
</class>
</hibernate-mapping>
这里圈出来的就是配置的对象映射,有多对一,多对多等映射。
6.写一个获取SessionFactory的工具类,代码如下:
package com.yk.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
try {
return new Configuration().configure().buildSessionFactory();
} catch (HibernateException e) {
throw new ExceptionInInitializerError(e);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static void shutdown() {
getSessionFactory().close();
}
}
7.写一个主方法或者使用测试类,测试Hibernate是否成功映射,看控制台输出,测试代码如下:
package com.yk.Hibernate;
import org.hibernate.Session;
import com.yk.model.Student;
import junit.framework.TestCase;
public class HibernateTest extends TestCase {
private static Session session =null;
public static void main(String[] args) {
//从连接工厂获取连接
session = HibernateUtil.getSessionFactory().openSession();
//开启事务
session.beginTransaction();
//这里可以看出Hibernate使用的是jndi机制
Student stu = session.get(Student.class, 1);
System.out.println("学生ID:"+stu.getId()+"\n"+"学生姓名:"+stu.getStudentname()+"\n"+"班级信息:"+stu.getClas());
session.disconnect();
}
}
控制台输出结果:
结果可以看出,将数据库中的多对一关系映查询出来,输出信息正确,班级信息是以对象的形式输出。