创建工具类,封装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("********注册成功********");
}
}