手把手教你搭建一个简单Hibernate项目

来源:互联网 发布:app游戏制作软件 编辑:程序博客网 时间:2024/05/19 20:58

1、项目环境: Jdk7 + Idea2017 + MySQL5 + Hibernate4

2、基础步骤

2.1新建项目

利用Idea新建项目,在右边的Addtional Libraries And FrameWorks中选择Hibernate,该选项下的Hibernate的库一般而言是最新版本的,若是你想要用自己的库,可在下方的Libraries中选择Use Libraries->create,然后选择你自己的Jar包,如果想要让Idea下载以前版本的库,可点击Configure按钮选择对应版本。如图2-1所示:

图2-1

此后点击next,输入项目名,项目初始架构搭建完成,需要注意的是log4j以及mysql驱动包是笔者自行引入的包,项目需要,读者可自行将Jar包复制进lib目录下,大致结构如图2-2所示:


图2-2

2.2文件配置

2.2.1日志配置

利用log4j可方便查看相应的信息,所以在该项目中笔者引入了log4j的jar,如前面描述,将jar包复制进lib目录下即可。然后在src目录下新建log4j.properties,以下是其具体代码:

log4j.rootLogger = debug,stdout,D,E### 输出信息到控制抬 ###log4j.appender.stdout = org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target = System.outlog4j.appender.stdout.layout = org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n### 输出DEBUG 级别以上的日志到=E://logs/error.log ###log4j.appender.D = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.D.File = E://logs/2017_11_13_hiberTest_log.loglog4j.appender.D.Append = truelog4j.appender.D.Threshold = DEBUG log4j.appender.D.layout = org.apache.log4j.PatternLayoutlog4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n### 输出ERROR 级别以上的日志到=E://logs/error.log ###log4j.appender.E = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.E.File =E://logs/2017_11_13_hiberTest_error.log log4j.appender.E.Append = truelog4j.appender.E.Threshold = ERROR log4j.appender.E.layout = org.apache.log4j.PatternLayoutlog4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
2.2.2hibernate配置文件的配置

在项目初始化之后,可在src下看到一个hibernate.cfg.xml文件,该文件是hibernate的配置文件,笔者相应的配置如下:

<?xml version='1.0' encoding='utf-8'?><!DOCTYPE hibernate-configuration PUBLIC        "-//Hibernate/Hibernate Configuration DTD//EN"        "http://www.hibernate.org/dtd/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">123</property>        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/practice</property>        <property name="hibernate.connection.username">root</property>        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>        <!-- 设置连接编码 -->        <property name="connectio.useUnicode">true</property>        <property name="connection.characterEncoding">utf-8</property>        <!-- 展示组织好的sql语句 -->        <property name="hibernate.show_sql">true</property>        <property name="hibernate.format_sql">true</property>        <property name="hibernate.current_session_context_class">thread</property>        <!-- 生成策略 -->        <property name="hibernate.hbm2ddl.auto">update</property>        <property name="hibernate.generate_statistics">true</property>        <!--&lt;!&ndash;  连接池操作  &ndash;&gt;        <property name="hibernate.connection.provider_class">org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider</property>        <property name="hibernate.c3p0.min_size">5</property>        <property name="hibernate.c3p0.max_size">30</property>        <property name="hibernate.c3p0.timeout">2000</property>        <property name="hibernate.c3p0.idle_test_period">2000</property>        <property name="hibernate.c3p0.acquire_increment">2</property>        <property name="hibernate.c3p0.max_statements">100</property>        <property name="hibernate.c3p0.validate">true</property>-->        <!-- 文件映射 -->        <mapping resource="panda/bean/User.hbm.xml"></mapping>    </session-factory></hibernate-configuration>
2.2.3实体类以及映射文件

在完成hibernate.cfg.xml的配置之后,需要完成对象关系映射,完成方式一般有两种,第一种是手动编写实体类以及映射文件,运行项目,在数据库中生成对应的数据库表以及字段;第二种方式是通过数据库表和字段逆向生成实体类和映射文件。首先介绍第一种方式,新建一个bean包,在bean包下新建一个User实体类,类的具体信息如下:

package com.panda.bean;import java.io.Serializable;
public class User implements Serializable{    private Integer id;    private String name;    private String sex;    private Integer age;    ## setter和getter方法##    @Override    public boolean equals(Object o) {        if (this == o) return true;        if (o == null || getClass() != o.getClass()) return false;        User user = (User) o;        if (age != user.age) return false;        if (name != null ? !name.equals(user.name) : user.name != null) return false;        return sex != null ? sex.equals(user.sex) : user.sex == null;    }    @Override    public int hashCode() {        int result = name != null ? name.hashCode() : 0;        result = 31 * result + (sex != null ? sex.hashCode() : 0);        result = 31 * result + age;        return result;    }}

需要注意的是,新建的实体类需要实现Serializable接口,同时为了提高查询效率,还需要重写equals和hashCode方法。此后在对应的包下再新建一个User.hbm.xml文件,这个文件是User的映射文件,格式必须固定为:类名.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"><!-- Generated 2017-2-14 15:34:09 by Hibernate Tools 4.0.0.Final --><hibernate-mapping>    <class name="com.panda.bean.User" table="user" >        <!--id对应于主键 generator是主键的生成策略 increment是自增-->        <id name="id" type="java.lang.Integer">            <column name="id" />            <generator class="increment"/>        </id>                <!--property对应的类的成员字段 type表示字段的类型 column表示数据表中的字段记录-->        <property name="name" type="java.lang.String">            <column name="name" length="50" not-null="true"/>        </property>        <property name="sex" type="java.lang.String">            <column name="sex" length="50" not-null="true" />        </property>        <property name="age" type="java.lang.Integer">            <column name="age" not-null="true" />        </property>    </class></hibernate-mapping>

相应的配置注释都在上面,读者可自行深入。文件配置完成之后,可运行项目初始化时生成的Main.class,生成数据表。图2-3对应相应的SQL语句,图2-4对应于在命令行窗口查看数据库生成的表。


图2-3


图2-4

第二种方式是通过数据库表逆向生成实体类以及映射表,拿上述中的User表为例,在Idea中的左下角选择Persistence


图2-5

单击之后出现你的项目名,然后右键选择最后一个选项,如图2-6所示:


图2-6

然后出现图2-7的配置界面:


图2-7

步骤1是选择你的DataSource,如果笔者没有配置DataSource,可查阅相关资料配置,步骤2是选择将实体类生成在哪个包下,步骤3是选择对应的表,点击OK。


图2-8

在图2-8中,生成了UserEntity实体类,并且在hibernate.cfg.xml中添加了mapping

3、项目运行

为了保证严谨性,在项目下新建一个dao以及daoImpl包,在dao下新建一个UserDao接口,并写一个insertUser方法,在daoImpl包下新建一个UserDaoImpl类,继承UserDao,实现方法,相关代码如下:

package com.panda.daoImpl;import com.panda.bean.User;import com.panda.dao.UserDao;import com.panda.tool.HibernateUtil;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.junit.Test;public class UserDaoImpl implements UserDao {    @Test    public void insertUser() {        Session session = HibernateUtil.getSession();        Transaction transaction = session.beginTransaction();        try {            User user = new User();            user.setName("Mack");            user.setSex("男");            user.setAge(25);            session.save(user);            transaction.commit();        }catch (Exception e) {            e.printStackTrace();            transaction.rollback();        }    }}

上述代码中的HibernateUtil是一个工具类,虽然项目初始化的Main类也具有相同作用,但笔者更喜欢自己的方式,代码如下:

package com.panda.tool;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistryBuilder;public class HibernateUtil {    private static SessionFactory sessionFactory;    /**     * 利用getSession方法时切记在Hibernate的配置文件中     * @return Session     */    public static Session getSession(){        return getSessionFactory().getCurrentSession();    }    /**     * SessionFactory是重量级的     * 最好做成单例模式     * @return SessionFactory     */    public static SessionFactory getSessionFactory(){        //保证SessionFactory为单例        if (sessionFactory == null ||sessionFactory.isClosed()) {            Configuration configure = new Configuration();            configure.configure();            sessionFactory = configure.buildSessionFactory(new ServiceRegistryBuilder().applySettings(configure.getProperties()).buildServiceRegistry());        }        return sessionFactory;    }}

完成之后,运行项目,出现如图2-9和2-10的结果,项目运行成功。


图2-9


图2-10

如有任何建议和疑问,欢迎共同探讨!


阅读全文
0 0
原创粉丝点击