回顾hibernate 配置的步骤:
第一步、导入hibernate包,lib下面的required
第二步、src下面创建hibernate.cfg.xml
project包里找到etc,打开hibernate.cfg.xml,导入doctype,复制dtd。
第三步、配置hibernate
<hibernate-configuration>
<session-factory>
//配置数据库 **注意不要有空格
hibernate-properties找到MySQL,键值对的形式。
1.配置方言,告诉hibernate使用哪种类的数据库
2.配置MySQL驱动
3.配置MySQL的url地址
4.配置用户名
5.配置密码
6.配置orm的xml <mapping resource='' />
第四步、创建JavaBean对象
第五步、关系映射文件
hibernate中如何获得SessionFactory?
当所有映射定义被Configuration
解析后, 应用程序必须获得一个用于构造Session
实例的工厂. 这个工厂将被应用程序的所有线程共享: //读取映射文件 Configuration cfg = new Configuration()
//创建sessionFactory SessionFactory sf =cfg.buildSessionFactory();
//获得链接对象 session
Session session = sf.openSession();
//开启一个事务
Transaction tx = session.beginTransaction();
//创建一个对象
Student s = new Student();
//设置对象属性
s.setName("小明");
//存对象到数据库
session.save(s);
// 获取数据
Student s = (Student) session.get(Student.class,1);
s.setName("小红");
session.delete(s);
//提交事务
tx.commit();
Hibernate允许你的应用程序创建多个SessionFactory实例. 这对 使用多个数据库的应用来说很有用.
hibernate中session接口提供的操作数据库的方法:
sava(); //存数据
update(); //更新
delete(); //删除数据
load(); //从数据库中加载对象
find(); //从数据库中查询对象
//举个例子:
//创建一个session
Session session = sessionFactory.openSession();
//开启一个事务
Transaction tx = session.beginTransaction();
//编写查询语句
String hqlUpdate = "update Customer c set c.name = :newName where c.name =:oldName";
// or String hqlUpdate = "update Customer set name = :newName where name =:oldName";
//执行数据库操作
int updatedEntities = s.createQuery( hqlUpdate )
.setString( "newName", newName )
.setString( "oldName", oldName )
.executeUpdate();
//提交事务
tx.commit();
//关闭session接口
session.close();
saveorupdate() 和 save() 、update() 的区别
1.saveorupdate()如果传入的对象在数据库中有就做update操作,如果没有就做save操作。主键在saveorupdate()方法中是起着关键作用的,只有这个主键的值不为空的时候才进行insert还是update的判断,否则直接insert
若主键不为空,就可以进行saveorupdate()操作了。
2.save()在数据库中生成一条记录,如果数据库中有,会报错说有重复的记录。
3.update()就是更新数据库中的记录
适用范围:
save方法更适用于确定了是要插入,而且需要得到插入数据的主键
而saveOrUpdate更倾向于不缺定是插入还是更新,而且你不需要得到他的主键
另一方面,如果你无法确定你要插入或更新的对象是不是持久态或游离态时。如果你save一个持久态或更
新一个游离态,这都是有问题的,此时你就要用到saveOrUpdate
总体来说,如果你能确定你即将操作对象的状态,则不需要用saveOrUpdate
get() 和 load()的区别
1.get()采用立即加载方式,而load()采用延迟加载;
get()方法执行的时候,会立即向数据库发出查询语句,
而load()方法返回的是一个代理(此代理中只有一个id属性),只有等真正使用该对象属性的时候,才会发出sql语句
2.如果数据库中没有对应的记录,get()方法返回的是null.而load()方法出现异常ObjectNotFoundException