Eclipse整合Hibernate

来源:互联网 发布:淘宝修改评论链接 编辑:程序博客网 时间:2024/05/24 13:28

注:由于以前自己在学校学习的框架的是Mybatis,由于Mybatis有对数据库的限制,所以现在进公司后,需要重新学习Hibernate,记录一下,一起学习。


一:环境搭建

1.所需jar包:

Hibernate-core-5.1.0.Final.jardom4j-1.6.1.jarlog4j-core-2.5.jarjavassist-3.20.0-GA.jar

mysql-connector-java-5.1.34.jarantlr-2.7.7.jarcommons-logging-1.2.jarcglib-2.2.2.jar

commons-collections-3.2.1.jarjavax.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,创建表StudentClass,下面是创建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.javaStudent.java

Class.java如下:属性和数据库中的列对应,类实现序列化接口,自动生成序列化ID,右键source生成Get/Set方法和toString方法


 

Student.java如下:这个类中也和数据库中的列对应,这里用对象对应数据库中的classid属性

 

5.创建实体类的映射文件Class.hbm.xmlStudent.hbm.xmlhibernate.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();
        }
}
控制台输出结果:


 

结果可以看出,将数据库中的多对一关系映查询出来,输出信息正确,班级信息是以对象的形式输出。

 


0 0
原创粉丝点击