前言
与mybatis相同,Hibernate同为ORM(Object-Relational-Mapping,对象关系映射)的开源持久层框架。由于它使用方便,简单易学,灵活性强,扩展性强,能够大大地简化程序开发的效率,所以受到广大开发人员的喜爱。好了,废话不多说了!直接开始搭建开发环境,并初步学习Hibernate语法。
作者会尽最大努力将详细步骤写出来,如果有哪里写错的,请联系我。
一、准备工作
安装jdk(版本1.7以上)
Eclipse,MyEclipse,Idea(我始终觉得作为一名合格的程序员,变更修改开发集成工具应该是常识,以保证不论哪种集成工具开发都不会成为阻碍项目进行因素)。
二、导入jar
官网下载Hibernate(同样,最开始学习时找包也是令我头疼的事情,但随着实践和经验的积累,这些技巧和实力也在增长)。对依赖包进行下载(maven的官网上有有关Hibernate依赖包的详细说明)。
在此,我还是把jar列出来吧!要不新手还是不会下jar。
三、创建java工程(创建java工程就好)
接着把jar导入工程,创建lib包。将下载好的jar包放入并右键单击工程。
选择Build Path->Configuare Build Path…
选择Java Build Path->再在右侧的内容中选择AddLibrary…
把lib文件夹下的jar全部添加进去,Apply and Closed
四、编写实体类和实体类配置文件(我会给出我设计的实体,各位请参照并建立)
建立com.entity.User
public class User {
private int id;
private String username;
private String password;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
建立User.hbm.xml(同样在com.entity包下)
<?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 package="com.entity">
<class name="User" table="perfack">
<id name="id">
<generator class="increment" />
</id>
<property name="username" column="username" />
<property name="password" column="password" />
<property name="age" column="age" />
</class>
</hibernate-mapping>
五、编写Hibernate的核心配置文件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>
<!-- 数据库连接设置 -->
<!--数据库驱动 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!--数据库连接 -->
<property name="connection.url">jdbc:mysql://localhost:3306/test</property>
<!--数据库用户名 -->
<property name="connection.username">root</property>
<!--数据库密码 -->
<property name="connection.password">123456</property>
<property name="connection.characterEncoding">UTF-8</property>
<!-- JDBC连接池最大连接数量(使用内置的) -->
<property name="connection.pool_size">20</property>
<!-- 指定与Hibernate进行交互的特定SQL方言。 -->
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!-- 将所有执行的SQL都打印出来 -->
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<!--将持久类的映射配置文件添加到配置中 -->
<mapping resource="com/entity/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
六、测试
public class Main {
private SessionFactory sessionFactory;
protected void initDataBase() throws Exception {
final StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();
try {
setSessionFactory(new MetadataSources(registry).buildMetadata().buildSessionFactory());
} catch (Exception e) {
StandardServiceRegistryBuilder.destroy(registry);
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
Main main = new Main();
main.initDataBase();
} catch (Exception e) {
e.printStackTrace();
}
}
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
}
七、Main主函数分析
无论是增删,还是改查,Main均要获取session,这段代码安全性低,重复性高。因此,我们可以设计单例模式的静态工厂来获取session.
package com.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
public HibernateUtil() {
}
private static String RESOURCE = "resource/hibernate.cfg.xml";
private static SessionFactory sessionFactory = null;
private static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
static {
try {
Configuration cfg = new Configuration().configure(RESOURCE);
sessionFactory = cfg.buildSessionFactory();
} catch (Exception e1) {
e1.printStackTrace();
throw new ExceptionInInitializerError("初始化hibernate错误,请检查配置文件或数据库");
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static Session getSession() {
// sessionTL的get()方法根据当前线程返回其对应的线程内部变量,
// 也就是我们需要的Session,多线程情况下共享数据库链接是不安全的。
// ThreadLocal保证了每个线程都有自己的Session。
Session session = threadLocal.get();
// 如果session为null,则打开一个新的session
if (session == null) {
session = (sessionFactory != null) ? sessionFactory.openSession() : null;
threadLocal.set(session);
}
return session;
}
public static void closeSession() {
Session session = (Session) threadLocal.get();
threadLocal.set(null);
if (session != null) {
session.close();
}
}
}
下面建立测试类
package com.test;
import org.hibernate.Session;
import com.entity.User;
import com.util.HibernateUtil;
public class Main {
public static void main(String[] args) {
Session session = HibernateUtil.getSession();
session.beginTransaction();
User user = new User();
user.setUsername("Jerry");
user.setPassword("Hdc09130415");
user.setAge(20);
session.save(user);
session.getTransaction().commit();
HibernateUtil.getSession().close();
}
}
八、测试:运行结果
log4j:WARN No appenders could be found for logger (org.jboss.logging).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Hibernate: select max(id) from perfack
Hibernate: insert into perfack (username, password, age, id) values (?, ?, ?, ?)