1、在pom中引入hibernate和h2内存数据库
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.3.176</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.1.Final</version>
</dependency>
2、目录结构及代码
hibernate.cfg.xml放在代码之外,和最终的class目录平级。
user.hbm.xml放在包内,和class文件同包。
<!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="hibernate.connection.driver_class">org.h2.Driver</property>
<property name="hibernate.connection.url">jdbc:h2:./h2db/sxaz42b4</property>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.password">sa</property>
<property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.show_sql">true</property>
<mapping resource="gaofeng/db/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
<?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>
<class name="gaofeng.db.User" table="User">
<id name="Id" column="Id"> <generator class="increment" /> </id>
<property name="name" column="name" />
</class>
</hibernate-mapping>
package gaofeng.db;
public class User {
public int getId() {
return Id;
}
public void setId(int id) {
Id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private int Id;
private String name;
}
package gaofeng.db;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
public class UserDao {
public Session session;
public List<User> getAll(){
@SuppressWarnings("unchecked")
List<User> users = session.createQuery("from User").list();
for (User user : users) {
System.out.println(user.getId() + ":" + user.getName());
}
return users;
}
public List<User> getOnePage(){
@SuppressWarnings("unchecked")
List<User> users = session.createQuery("from User").setFirstResult(2).setMaxResults(2).list();
for (User user : users) {
System.out.println(user.getId() + ":" + user.getName());
}
return users;
}
public User load(int id){
try{
return (User) session.load(User.class, id);
}catch(Exception e){
e.printStackTrace();
}
return null;
}
public void add(User user){
Transaction transaction = session.beginTransaction();
try{
session.save(user);
transaction.commit();
}catch(Exception e){
transaction.rollback();
}
}
public void del(User user){
Transaction transaction = session.beginTransaction();
try{
session.delete(user);;
transaction.commit();
}catch(Exception e){
transaction.rollback();
}
}
public void update(User user){
Transaction transaction = session.beginTransaction();
try{
session.update(user);
transaction.commit();
}catch(Exception e){
transaction.rollback();
}
}
public void init(){
Configuration cfg=new Configuration().configure();
StandardServiceRegistryBuilder ssrb=new StandardServiceRegistryBuilder().applySettings(cfg.getProperties());
ServiceRegistry service= ssrb.build();
SessionFactory factory=cfg.buildSessionFactory(service);
session= factory.openSession();
}
public void closeSession() {
if(session!=null) session.close();
}
}
package gaofeng.db;
import org.hibernate.Transaction;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class UserDaoTest {
UserDao dao = new UserDao();
@Before
public void setUp() throws Exception {
dao.init();
}
@After
public void tearDown() throws Exception {
dao.getAll();
dao.closeSession();
}
@Test
public void test() {
User user = new User();
user.setId(2);
user.setName("gaofeng"+System.currentTimeMillis());
Transaction trx = dao.session.beginTransaction();
dao.session.saveOrUpdate(user);
trx.commit();
}
@Test
public void test2() {
User user = dao.load(2);
user.setName("gaofeng"+System.currentTimeMillis());
Transaction trx = dao.session.beginTransaction();
dao.session.saveOrUpdate(user);
dao.session.clear();
trx.commit();
}
@Test
public void test3() {
Transaction trx = dao.session.beginTransaction();
dao.session.createSQLQuery("update User set name='gaofeng' ").executeUpdate();
trx.commit();
}
}
4、会话工厂是一个重量级对象,线程安全的,里面有大量的二级缓存,原则上一个数据库只应该有一个会话工厂。
会话时一个轻量级对象,非线程安全,里面有缓存信息,有会话池管理,可以随用随创建。
5、对象有瞬时态,离线态,持久化态。 持久化态时,不管中间做了多少次操作,只是最终关闭会话时,与持久化池中的内容比较,不相同,才发update语句。
update、save、deltete、需要提交事务。
load默认是延迟加载的,get不是延迟加载的。
由于load的记录可能不存在,所以入库时,尽量用saveOrUpdate。
clear可以清除当前会话中的操作。