文章目录
Configuration对象
Hibernate有两种形式的配置文件:默认情况下 上边两种文件都要放在src目录下
hiberbate.cfg.xml
通常使用xml配置对象 可以配置更丰富的内容
hibernate.properties
用于配置key/value形式的内容 key不能重复 配置有局限性 一般不用
用于加载对象
直接new Configuration构造方法加载的是hibernate.properties文件
new Configuration().configre()方法加载的是hibernate.cfg.xml文件(configre(文件路径) 方法可以指定路径)
加载映射文件
一般来说直接配置在hibernate.cfg.xml中
<mapping resource="org/ccit/com/domain/User.hbm.xml"/>
使用configuration对象的addResource()方法
configure.addResource("org/ccit//com/domain/User.hbm.xml");
使用configuration对象的addClass()方法 (addClass()方法自动添加后缀)
configure.addClass(User.class);
public Configuration addClass(Class persistentClass) throws MappingException {
String mappingResourceName = persistentClass.getName().replace('.', '/') + ".hbm.xml";
log.info("Reading mappings from resource: " + mappingResourceName);
return this.addResource(mappingResourceName, persistentClass.getClassLoader());
}
SessionFactory工厂
相当于java连接池 管理所有的session
通过Configuration对象获取SessionFactory对象
SessionFactory sessionFactory = configure.buildSessionFactory();
SessionFactory还用于缓存配置信息 (数据库配置信息 映射文件 预定义HQL语句 等)
SessionFactory线程安全 多个线程同时访问 不会出现线程并发访问问题
获取session会话
1,factory.openSession() 获取一个全新的session
2,factory.getCurrentSession()获取一个当前线程绑定的session
使用这种方法 必须在hibernate.cgf.xml文件配置
<!-- hibernate支持 将创建的session绑定到本地线程中 底层使用ThreadLocal 在程序之间共享session 如果提交或事务回滚 底层自动关闭session-->
property name="hibernate.current_session_context_class">thread</property>
第二种方法在同一线程中获取相同的session
new Thread(){
@Override
public void run() {
System.out.println(sessionFactory.getCurrentSession().hashCode());
System.out.println(sessionFactory.getCurrentSession().hashCode());
}
}.start();
Transaction事务
事务可以在heibernate.cfg.xml中配置 自动提交事务
<!-- 是否自动提交事务 -->
<property name="hibernate.connection.autocommit">true</property>
如果不配置 可以通过session对象获得
//开启事务
Transaction transaction = session.getTransaction();
//开启事务后 数据才会存入到数据库中
transaction.begin();
//保存 直接把对象保存到数据库
User user = new User();
user.setUsername("LIANG");
user.setPassword("2233");
session.save(user);
//4 提交事务
//transaction.rollback();事务回滚
transaction.commit();
session中的方法
save方法
插入数据
User user = new User();
user.setUsername("LIANG");
user.setPassword("2233");
session.save(user);
update方法
//1,获取一个对象
User user=(User)session.get(User.class,6);
//2,调用set方法 直接相当于更新
user.setUsername()
//也可以添加
//session.save(user)
//session.update(user)
//根据id判断 是否存在存在调用update() 不存在调用save()
//session.saveorupdate(user)
get,load方法
get方法是直接加载数据库
load是懒加载 用的时候才会查询数据库
load方法返回的是对象的一个代理
//get查询 根据id查询 hibernate会根据类名查表 如果没有查到 返回null值
User user=(User)session.get(User.class,1);
//load查询,如果没有查到 会抛出ObjectNotFonundException异常
User user = (User)session.load(User.class, 1);
delete方法
//1,获取一个对象
User user=session.get(User.class,1);
//2,删除对象
user.delete(user);
//只要对象中有id 并且id在数据库中存在 就可删除成功
User user1=new User();
user1.setUid(1);
session.delete(user1);