hibernate 运行流程分析:
第一步:Configurationconfiguration = new Configuration();
第二步:{hibernate.cfg.xml 1、描述数据库的链接的信息 2、加载映射文件*.hbm.xml} →configuration.configure();
第三步:sessionFactory = configuration.buildSessionFactory();
{1、hibernate把数据库的链接信息、把映射文件的信息、持久化类的信息
2、sessionFactory是由单例模式产生的
3、一般情况下一个hibernate应该有一个数据库链接
4、该类本身是线程安全的
5、是一个重量级类}
第四步:sessionFactory.openSession();
打开了一个数据库的链接,准备进行数据库的操作
用session进行查询
增删改查
开启事务
session.beginTransaction();
进行cud的操作
……
提交事务,关闭session
session.close();
注意事项:
1、一个类是否是持久化类
1、加载配置文件
2、在配置文件中加载映射文件
3、解析映射文件中class元素的name属性,找到对应的类
2、在客户端的参数的类必须是持久化类
一般的错误已经分析:
①找不到持久化,意味着在映射文件中根本没有配置该类
③在映射文件中class元素中的name属性的值写错了
④没有构造函数
利用session.get方法产生一个对象,调用的是默认的构造函数,所以一个持久化类中必须有一个默认的构造函数
⑤数据库中没有记录
⑥
public void testQueryPerson(){
Session session = sessionFactory.openSession();
List<Person> personList = session.createQuery("from Person").list();
for(Person person:personList){
System.out.println(person.getPname());
}
session.close();
}
public void testQueryPersonByID(){
Session session = sessionFactory.openSession();
/**
* 按照主键的方式查询数据库表中的记录
* 第二个参数的类型必须和持久化中标示符的类型保持一致
*/
Person person = (Person)session.get(Person.class, 1L);
System.out.println(person.getPname());
session.close();
}
/**
* hibernate内部会检查标示符,看标示符中的值在数据库相应的表中有没有对应的记录,如果有,则删除
*/
@Test
public void testDeletePerson(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
/**
* 1、根据id把值从数据库中查找出来
* 2、把对象删除掉
*/
Person person = (Person)session.get(Person.class, 1L);
session.delete(person);
/**
* 1、新创建一个person对象
* 2、给person对象的标示符赋值
* 3、调用session.delete方法删除
*/
//Person person = new Person();
//person.setPid(2L);
//session.delete(person);
transaction.commit();
session.close();
}
@Test
public void testUpdatePerson(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
/**
* 1、根据id把持久化对象提取出来
* 2、进行修改
* 3、执行upate操作
*/
Person person = (Person)session.get(Person.class, 1L);
person.setPsex("不详");
session.update(person);
transaction.commit();
session.close();
}