手把手教你搭建一个简单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%n2.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> <!--<!– 连接池操作 –> <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
如有任何建议和疑问,欢迎共同探讨!
- 手把手教你搭建一个简单Hibernate项目
- 手把手教你用webpack来搭建一个项目
- 手把手教你搭建一款简单应用
- Hibernate实验项目全程跟踪,手把手教你配置Hibernate
- 手把手教你在Windows端搭建Redmine项目管理软件
- 手把手教你如何搭建iOS项目基本框架
- 手把手教你如何搭建iOS项目基本框架
- 手把手教你如何搭建iOS项目基本框架
- 手把手教你如何搭建iOS项目基本框架
- 手把手教你如何搭建iOS项目基本框架
- 手把手教你搭建一个属于自己的Ghost博客
- 手把手教你搭建一个属于自己的Ghost博客
- 手把手教你配置hibernate
- 手把手教你Hibernate工程
- 手把手教你做一个简单的VB数据库程序
- 手把手教你搭建SpringMVC
- 手把手搭建一个SSM项目(适合新手)
- 使用Eclipse无插件搭建一个简单的Hibernate项目
- Codeforces Round #445 (Div. 2): D. Restoration of string(模拟)
- 全球爆发的“恶意清除软件”攻击毁坏了大量的数据
- maven报错有重复类
- jsp 显示页面时间
- windows下面的ReactNative环境搭建以及挖坑
- 手把手教你搭建一个简单Hibernate项目
- servlet/filter/listener/interceptor区别与联系
- FPGA与MATLAB联合仿真FIR滤波器
- GreenDAO 3.2
- phpstorm配置Apache服务器
- python yield关键词
- QT之qss教程-QToolButton
- Spring Boot 集成MyBatis
- sql语句在mysql中查询没有问题,通过navicat premium直接从mysql数据库导入到SqlServer数据库中,查询语句出现错误