hibernate学习笔记之三(单条记录的增删改查)

(hibernate学习笔记系列来自于 “疯狂Java” Hibernate视频学习)

  • 保存用户

    • session.save(person);
    • session.persist(person);
  • 查询用户
    • load(Class theClass,Serializable id)
    • get(Class theClass,Serializable id)
  • 修改用户
    • session.update(person)
    • session.merger(person);
  • 保存或修改用户
    • session.saveOrUpdate(person)
    • merge(person)
  • 删除用户
    • session.delete(person)

增加记录有两种方法,save()和persist();
而persist:坚持; 存留; 固执; 继续存在,所以persist()的名字更加显而易见
save()会返回一个id
而persist()没有返回值
**如果添加的对象指定了id字段,persist会出现异常,而save会忽略id字段的设置**
    private static void save(){
        //session.save(person)的返回值是一个Serializable
        //创建Configuration
        Configuration config = new Configuration().configure();
        //创建SessionFactory
        @SuppressWarnings("deprecation")
        SessionFactory factory = config.buildSessionFactory();
        //创建session
        Session session = factory.openSession();
        //创建事务
        Transaction transaction = (Transaction) session.beginTransaction();
        //创建持久化对象
        Person person = new Person();
        person.setName("zhou");
        person.setAddress("jiangsu");
        person.setBirthday(new Date(System.currentTimeMillis()-8L*365*24*60*60*1000));
        person.setWeight(65.6f);
        //Integer id = (Integer) session.save(person);
        //System.out.println("新增用户的id为:" + id);
        session.persist(person);
        transaction.commit();
        session .close();
    }

根据id查询一条记录,方法有两种load()和get()方法
  • load(Class theClass,Serializable id)

    theClass指待查询的持久化类,Serializable id表示表中的第几条记录

  • get(Class theClass,Serializable id)

    get立即查询,而load是延迟查询(用的时候查询)

    load返回的是一个持久化类的代理,等到使用实例的除id之外的字段才查询数据库

    load方法查询id对应的记录不存在时会出现ObjectNotFoundException异常

    get方法查询的记录不存在的时候返回记录为null

    在*.hbm.xml文件里可以使用class标签的lazy属性设置load方法是否立即查询,默认为true,代表延迟查询

Configuration config = new Configuration().configure();
//hibernate4 通过下面的方式获取SessionFactory更加高效安全
ServiceRegistry sr = new ServiceRegistryBuilder()
               .applySettings(config.getProperty())
               .buildServiceRegistry();
SessionFactory sessionFactory = config.buildSessionFactory(sr);
Session session = sessionFactory.openSession();
//查询不需要事务
//第一个参数查询的持久化类,第二个参数是第几条记录
//根据id查询,适合查询一条记录
Person person = (Person)session.get(Person.class,2);
System.out.println("get---->" + p);
session.close();
//load方式查询
Session session1 = sessionFactory.openSession();
Person p = (Person)session1.load(Person.class,1);
System.out.println("load---->" + p);
session1.close();

方法为update(),merge(),saveOrUpdate()

首先需要了解hibernate中对象存在的三种状态

update()和merge(),saveOrUpdate()都有两种方式
  • 先查询出一条记录,然后在执行update进行更新数据记录

    改的时候需要事务,所以要用session创建一个transaction对象。
    修改的时刻在session关闭的时候
    
  • 自己new一个对象,然后设置所要更新的字段,其他的字段也要设置为原来的值(否则会变成空),然后设置id的值,这个id必须是数据库中存在的id,否则会出现异常
    在这里我们也可以看出数据库中唯一标识字段应该是一个对象,而不是基本类型,因为基本类型会有默认的值,这样的话如果忘了setId(id),那么就会修改掉id=0的记录
    
  • 利用session.merge(Object o)

    merge()方法会返回o所对应的一个持久化对象,如果o本身就是一个持久化对象,则返回值与o指向的是同一个对象;如果o是一个临时状态(new出来的一个对象),则返回值是一个持久化对象,而与o是不同的。

    对于merge

    如果给定的id不存在就是新增,即使id不存在;

    如果id存在,就是修改。

  • 利用saveOrUpdate()

    根据传递的对象有没有ID来进行新增或修改操作。

    有id就是修改

    没有id就是新增

    如果传递的对象的id在数据库里不存在,则会出错

方法:delete()
用get或者load得到要删除的记录,然后调用delete(Object o);
或者new一个对象,设置id,然后调用delete(),如果id不存在抛出异常

以上的操作都是针对一条记录的增删改查

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-29 03:23:07

hibernate学习笔记之三(单条记录的增删改查)的相关文章

ASP.NET学习笔记(2)——用户增删改查

说明(2017-7-4 11:48:50): 1. index.html 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <

《Hibernate学习笔记之三》:联合主键的映射

<Hibernate学习笔记之三>:联合主键的映射 就如在前面所举的例子一样,是使用的id作为唯一的主键,一般情况下我们也只使用唯一的一个属性作为主键,但是在实际中,我们可能会遇到几个属性作为主键的情况,因此,在本篇博文中,就来介绍下,联合主键的映射关系应该如何来做?? 联合主键的映射有两种方式来进行实现. 1.使用映射文件 XXX.bhm.xml 2.使用Annotation Hibernate首先需要使用联合主键的实体类必须实现Serializable接口,即为了使序列能够被序列化进行传输

Django项目的创建与介绍.应用的创建与介绍.启动项目.pycharm创建启动项目.生命周期.三件套.静态文件.请求及数据.配置Mysql完成数据迁移.单表ORM记录的增删改查

一.Django项目的创建与介绍 ''' 安装Django #在cmd中输入pip3 #出现这个错误Fatal error in launcher: Unable to create process using '"' #可以直接用 python3 -m pip 代替 pip3 #这个问题是pip3 版本过低直接在cmd中执行 python3 -m pip install --upgrade pip 更新pip3 # 在指定解释器环境下安装django 1.11.9 # 在真实python3环境

hibernate学习笔记之三(一级缓存的使用和管理)

(hibernate学习笔记系列来自于 "疯狂Java" Hibernate视频学习) 一级缓存 一级缓存生命周期很短,与session生命周期一致,所以一级缓存也叫session级缓存或事务级缓存.位于缓存中的对象处于持久化状态,它与表中的相关记录对应,session能够在某些时间点,按照缓存中持久化对象的属性来同步数据库中表的记录,这一过程称为清理缓存. 一级缓存实现原理. session缓存是由它的实现类sessionImpl中定义的一些集合属性构成的,原理是保证有一个引用在关联

Hibernate基于Maven和Struts2搭建的增删改查

注:要全套流程截图操作的自行在我博客下载 一.建立一个maven多模块项目 二.把各个模块依赖起来,导入相应jar包 三.选中entity模块,右键Add Framework Support,找到hibernate确认 四 .配置一个数据库 五.建立并配置hibernate.cfg.xml信息 六.用hibernate创建实体对象 七.在util模块编写hibernateUtil类,在dao模块调用Util和实体创建增删改查的方法,在service模块实现相关业务 八.右键web模块,Add F

mybatis实战教程(mybatis in action)之三:实现数据的增删改查

前面已经讲到用接口的方式编程.如果不一致就会出错,这一章主要在上一讲基于接口编程的基础上完成如下事情:1. 用 mybatis 查询数据,包括列表2. 用 mybatis 增加数据3. 用 mybatis 更新数据.4. 用 mybatis 删除数据. 查询数据,前面已经讲过简单的,主要看查询出列表的查询出列表,也就是返回list, 在我们这个例子中也就是 List<User> , 这种方式返回数据,需要在User.xml 里面配置返回的类型 resultMap, 注意不是 resultTyp

MySQL数据库学习【第三篇】增删改查操作

注意:1.如果你在cmd中书命令的时候,输入错了就用\c跳出 2.\s查看配置信息 一.操作文件夹(库) 增:create database db1 charset utf8; 删:drop database db1; 改:alter database db1 charset gbk; 查:show databases; #查看所有的数据库 show create database db1; #查看db1数据库 二.操作文件(表) 切换到文件夹下:use db1 增:create table t

初识hibernate框架之一:进行简单的增删改查操作

Hibernate的优势 l 优秀的Java 持久化层解决方案  (DAO) l 主流的对象—关系映射工具产品 l 简化了JDBC 繁琐的编码 l 将数据库的连接信息都存放在配置文件 l 自己的ORM框架 l 一定要手动实现Hibernate(模拟Hibernate实现) 一:创建一个java project项目 如下图 2:创建一个大配置文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hib

MySQL—记录的增删改查操作

1.插入记录: 方法一:INSERT [INTO] tbl_name [(col_name,···)] {VALUES|VALUE} ({expr |DEFAULT},···),(···),··· 例如: INSERT users VALUES(NULL,'Mary','666666',25,1); 方法二:INSERT [INTO] tbl_name SET col_name={expr |DEFAULT},··· 说明:与第一种方法的去呗在于,此方法可以使用子查询(SubQuery):另外,