文章目录
  1. 1. 项目整体构成
  2. 2. 配置文件hibernate.cfg.xml
  3. 3. 映射文件User.hbm.xml
  4. 4. User.java(JavaBean)
  5. 5. HibernateUitl.java
  6. 6. UserDAO.java
  7. 7. UserDaoHibernateImpl.java
  8. 8. 总结
    1. 8.1. Session接口
    2. 8.2. 对象的三种状态
      1. 8.2.1. 瞬时
      2. 8.2.2. 持久
      3. 8.2.3. 脱管

使用Hibernate完成CRUD操作,包括增删改查。

项目整体构成

项目整体构成

配置文件hibernate.cfg.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/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:///test</property>
<property name="connection.username">root</property>
<property name="connection.password">8989</property>

<property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!--对应不同数据库的方言-->

<property name="hbm2ddl.auto">create</property> <!--通过映射文件生成ddl文件,用来直接建表-->
<property name="show_sql">true</property>

<mapping resource="cn/zju/domain/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>

映射文件User.hbm.xml

映射文件是一个很核心的文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cn.zju.domain">

<class name="User"> <!--指定一个JavaBean--><!--还需指定表名table="User",缺省情况下代表类名和表名相同-->
<id name="id"> <!--专门用来映射主键-->
<generator class="native" />
</id>

<property name="name" unique="true"/>
<property name="birthday" />
</class>

</hibernate-mapping>

User.java(JavaBean)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package cn.zju.domain;

import java.util.Date;


public class User {
private int id;
private String name;
private Date birthday;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Date getBirthday() {
return birthday;
}

public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}

HibernateUitl.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package cn.zju.dao;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public final class HibernateUitl {
private static SessionFactory sessionFactory;

private HibernateUitl() {
}

static {

Configuration cfg = new Configuration();
cfg.configure();
sessionFactory = cfg.buildSessionFactory();
}

public static SessionFactory getSessionFactory() {
return sessionFactory;
}

public static Session getSession() {
return sessionFactory.openSession();
}
}

UserDAO.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package cn.zju.dao;

import cn.zju.domain.User;

public interface UserDao {
public void saveUser(User user);

public User findUserByName(String name);

public User findUserById(int id);

public void updateUser(User user);

public void remove(User user);
}

UserDaoHibernateImpl.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package cn.zju.dao.impl;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

import cn.zju.dao.HibernateUitl;
import cn.zju.dao.UserDao;
import cn.zju.domain.User;

public class UserDaoHibernateImpl implements UserDao {

public User findUserById(int id) {
Session s = null;
try {
s = HibernateUitl.getSession();
User user = (User) s.get(User.class, id);
return user;
} finally {
if (s != null)
s.close();
}
}

public User findUserByName(String name) {
Session s = null;
try {
s = HibernateUitl.getSession();
Criteria c = s.createCriteria(User.class);
c.add(Restrictions.eq("name", name));
User user = (User) c.uniqueResult();
return user;
} finally {
if (s != null)
s.close();
}
}

public User findUserByName1(String name) {
Session s = null;
try {
s = HibernateUitl.getSession();
String hql = "from User as user where user.name=:n";
Query q = s.createQuery(hql);
q.setString("n", name);
User user = (User) q.uniqueResult();
return user;
} finally {
if (s != null)
s.close();
}
}

public void remove(User user) {
Session s = null;
Transaction tx = null;
try {
s = HibernateUitl.getSession();
tx = s.beginTransaction();
s.delete(user);
tx.commit();
} finally {
if (s != null)
s.close();
}
}

public void saveUser(User user) {
Session s = null;
Transaction tx = null;
try {
s = HibernateUitl.getSession();
tx = s.beginTransaction();
s.save(user);
tx.commit();
} finally {
if (s != null)
s.close();
}
}

public void updateUser(User user) {
Session s = null;
Transaction tx = null;
try {
s = HibernateUitl.getSession();
tx = s.beginTransaction();
s.update(user);
tx.commit();
} finally {
if (s != null)
s.close();
}
}
}

总结

Session接口

Session接口是Java应用程序与Hibernate之间的主要运行接口。它是抽象了持久化服务概念的核心抽象API类。
Session的几个主要方法:

  1. save()、persist:保存数据,persist在事务外不会产生insert语句。
  2. delete():删除数据
  3. update():更新对象,如果数据库中没有记录,会出现异常。
  4. get():根据ID查询,会立刻访问数据库。
  5. load():根据ID查(返回的是代理,不会立即访问数据库)。
  6. saveOrUpdate()、merge():根据ID和version的值来确定是save或update,调用merger时对象还是脱管的。
  7. lock():把对象变为持久对象,但不会同步对象。

    对象的三种状态

    瞬时

    数据库没有数据与之对应,超过作用域会被JVM垃圾回收,一般是new出来且没有与session关联的对象。

    持久

    数据库中有数据与之对应,当前与session有关联,并且相关联的session没有关闭,事务没有提交,持久对象状态发生改变,在事务提交时会影响到数据库。

    脱管

    数据中有数据与之对应,但当前没有session与之关联,脱管对象状态发生改变时,Hibernate不能检测到(当session关闭的时候,对象就会有持久状态变为脱管状态)。
文章目录
  1. 1. 项目整体构成
  2. 2. 配置文件hibernate.cfg.xml
  3. 3. 映射文件User.hbm.xml
  4. 4. User.java(JavaBean)
  5. 5. HibernateUitl.java
  6. 6. UserDAO.java
  7. 7. UserDaoHibernateImpl.java
  8. 8. 总结
    1. 8.1. Session接口
    2. 8.2. 对象的三种状态
      1. 8.2.1. 瞬时
      2. 8.2.2. 持久
      3. 8.2.3. 脱管