創建工具類,封裝Session
1.SessionFactory 工廠類
1).創建Session
2).進行二級緩存
SessionFactory是重量級資源特點:功能非常強大,佔用的內存就多
由於重量級資源佔用內存,不能頻繁的創建,只創建一個,就會引發線程安全問題,
重量級資源一般來講是線程安全.運行多線程訪問。
2.Session 代表了用戶的操作
1.提供了一套CRUD的方法 save(Object); update(Object); delete(Object);
get(calss,pk);
2.內部封了Connection
Session:輕量級資源(每一個用戶獨享,消耗內存很少)
模擬一個註冊
ReigstAction-->UserBiz -->UserDao
register(User u ) save(User u);
應該在同一個Session當中,在同一個線程中完成註冊
對於事務的控制在Biz層進行處理
應爲biz可能會處理多個Dao層的數據,事務的原子特性【要麼成功要麼失敗】,事務的處理必須在Biz層處理
事務的特性:原子性,持久性,一致性,隔離性
Object ----> Thread對象
ThreadLocal 工具類:將一個對象存入到線程的Map當中
key: 當前ThreadLocal對象
value:存入的值/對象
1.實體類User.java.在com.jsu.hb.pojo包中
package com.jsu.hb.pojo;
import java.util.Date;
public class User {
private Integer id;//使用封裝類型
private String name;
private Date birthday;
private int age;
public Integer getId() {
return id;
}
public void setId(Integer 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;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2.數據庫中提供的相對應的表
create table t_user(
t_id Integer primary key,
t_name varchar2(20),
t_birthday date
t_age Integer
)
3.創建工具類HibernateUtil.java
package com.jsu.hb.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static SessionFactory sf;
private static ThreadLocal<Session> tl= new ThreadLocal<Session>();
static{
try{
Configuration cfg = new Configuration();
cfg.configure();
sf=cfg.buildSessionFactory();
}catch(Exception e){
e.printStackTrace();
}
}
public static Session openSession(){
return sf.openSession();
}
public static Session getCurrentSession(){
Session session = tl.get();//先從儲存的線程中查找
if(session==null){
session=openSession();
tl.set(session);
return session;
}
return session;
}
}
4.提供映射關係的配置文件,在com.jsu.hb.pojo包中
<?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> <!-- name:所操作對象的全路徑 table:該對象所對應的表名 --> <class name="com.jsu.hb.pojo.User" table="t_user"> <!-- 主鍵配置 name:對象當中的主鍵名 User實體類當中 column:與表對應的列名 type:java當中的數據類型 --> <id name="id" column="t_id" type="java.lang.Integer"> <!-- 定義主鍵生成器 --> <generator class="increment"></generator> </id> <!-- 普通屬性的配置,非主鍵屬性的配置 --> <property name="name" column="t_name" type="java.lang.String"></property> <property name="birthday" column="t_birthday" type="java.util.Date"></property> <property name="age" column="t_age" type="java.lang.Integer"></property> </class> </hibernate-mapping>
5.在com.jsu.hb.dao包中,創建UserDao
package com.jsu.hb.dao;
import org.hibernate.Session;
import com.jsu.hb.pojo.User;
import com.jsu.hb.util.HibernateUtil;
public interface UserDao {
public void save(User u);
}
6.在com.jsu.hb.dao.impl包中,創建dao的實現類UserDaoImpl
package com.jsu.hb.dao.impl;
import org.hibernate.Session;
import com.jsu.hb.dao.UserDao;
import com.jsu.hb.pojo.User;
import com.jsu.hb.util.HibernateUtil;
public class UserDaoImpl implements UserDao{
public void save(User u) {
Session session = HibernateUtil.getCurrentSession();
session.save(u);
}
}
7.在biz層com.jsu.hb.biz包中創建UserBiz
package com.jsu.hb.biz;
import com.jsu.hb.pojo.User;
public interface UserBiz {
public void register(User u);
}
8.在com.jsu.hb.biz.impl包中創建biz的實現類UserBizImpl
package com.jsu.hb.biz.impl;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.jsu.hb.biz.UserBiz;
import com.jsu.hb.dao.UserDao;
import com.jsu.hb.dao.impl.UserDaoImpl;
import com.jsu.hb.pojo.User;
import com.jsu.hb.util.HibernateUtil;
public class UserBizImpl implements UserBiz {
private UserDao userDao = new UserDaoImpl();
public void register(User u) {
//在biz層處理事務
Session session = HibernateUtil.getCurrentSession();
Transaction tx = session.getTransaction();
tx.begin();
userDao.save(u);
tx.commit();
}
}
9.在com.jsu.hb.action包中,提供RegisterAction
package com.jsu.hb.action;
import java.util.Date;
import com.jsu.hb.biz.UserBiz;
import com.jsu.hb.biz.impl.UserBizImpl;
import com.jsu.hb.pojo.User;
public class RegisterAction {
public static void main(String[] args) {
//1.獲得數據
User u = new User();
u.setName("leon");
u.setAge(23);
u.setBirthday(new Date());
//2.調用業務層處理數據
UserBiz userBiz = new UserBizImpl();
userBiz.register(u);
//3.提示結果
System.out.println("********註冊成功********");
}
}