hibernate的crud操作

public class testAdd extends hibernateUtil{
    @Test
    public void testAddPerson(){
        //为了防止代码重写太多次,我们把前面三步放在utils里面。
        //得到session,注意,这里的session与jsp的session不同
        Session session=sessionFactory.openSession();
        //开启事务
        Transaction transaction=session.beginTransaction();
        //创建新对象
        Person person=new Person();
        //设置值,为什么不设置id?因为在映射文件中定义了主键的生成方式为increment
        person.setPname("andy");
        //保存
        session.save(person);
        //提交事务
        transaction.commit();
        //关闭连接
        session.close();
    }

    @Test
    public void testQuery(){
        //查询不用开启事务
        Session session=sessionFactory.openSession();
        //这里使用的是hql语句,需要注意的是,这里的from Person 用的是POjo的名字,所以也要大写
        //.list()是把里面的数据封装到list里面
        List<Person> persons=session.createQuery("from Person").list();
        for(Person person:persons)
            System.out.println(person.getPname());
        session.close();
    }

    @Test
    public void testQuery_Id(){
        Session session=sessionFactory.openSession();
        //因为我们在存储的时候,id的类型是Long,所以在后面加上L,否则会类型不匹配,
        Person person=(Person) session.get(Person.class, 1L);
        System.out.println(person.getPname());
        session.close();
    }

    @Test
    public void testUpdate(){
        Session session=sessionFactory.openSession();
        //由于修改,需要用到事务,所以我们先开启事务
        Transaction transaction=session.beginTransaction();
        //修改有两种方法,
        //a)先查找出来,再修改
        //这里需要注意的是,session.get方法,里面的对象,一定要有一个空参的构造方法,因为该方法是hibernate利用反射技术来生成对象的! 
//      Person person=(Person) session.get(Person.class, 1L);
//      person.setPname("ansel2");
        //b)先创建对象, 然后设置对象的Id与要修改对象一致,
        Person person=new Person();
        //其中第二种方法比较麻烦,因为这个对象是自己创建的,需要重新把里面的其他值也赋值到,如果对象一多,就废了,使用这种方法的前提是,session缓存中,只有一个id为2L的对象,否则会报错(不同的对象有一样的id)
        person.setPid(2L);
        person.setPname("andy2");
        //在这里要记住用session来save,并且这里的Person必须与映射文件的Person对应,否则会报错,详情看最下面的注释1中的内容
        session.update(person);
        //提交事务
        transaction.commit();
        //关闭session
        session.close();
    }

    @Test
    public void testDelete(){
        Session session=sessionFactory.openSession();
        //由于删除需要用到事务,所以我们先开启事务
        Transaction transaction=session.beginTransaction();
        //这时候,跟上面修改一样,可以先先拿出来再删,也可以创建对象删
        //这里可以使用创建对象删除,因为只需要知道主键,其他内容都已经没关系了,因为要删除了
        Person person=new Person();
        person.setPid(2L);
        session.delete(person);
        transaction.commit();
        session.close();
    }
}

注释1:
如果这个时候,我们把cn.ansel.domain的Person复制到当前包中,并且把刚刚倒入的cn.ansel.domain.Person去掉,在运行,就会报错,错误如下:
这里写图片描述
在之前一个贴说过,hibernate是根据映射文件中的class属性类判断一个类是否为pojo,这里的Person与映射文件中的Person不一样,并且在当前测试包下的Person也没有配置到映射文件上,所以会报出未知的实体 这个错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值