hibernate学习笔记之三(单条记录的增删改查)
2015-07-01 15:20
429 查看
(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)
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,代表延迟查询
首先需要了解hibernate中对象存在的三种状态
先查询出一条记录,然后在执行update进行更新数据记录
自己new一个对象,然后设置所要更新的字段,其他的字段也要设置为原来的值(否则会变成空),然后设置id的值,这个id必须是数据库中存在的id,否则会出现异常
利用session.merge(Object o)
merge()方法会返回o所对应的一个持久化对象,如果o本身就是一个持久化对象,则返回值与o指向的是同一个对象;如果o是一个临时状态(new出来的一个对象),则返回值是一个持久化对象,而与o是不同的。
对于merge
如果给定的id不存在就是新增,即使id不存在;
如果id存在,就是修改。
利用saveOrUpdate()
根据传递的对象有没有ID来进行新增或修改操作。
有id就是修改
没有id就是新增
如果传递的对象的id在数据库里不存在,则会出错
以上的操作都是针对一条记录的增删改查
保存用户
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不存在抛出异常
以上的操作都是针对一条记录的增删改查
相关文章推荐
- RAC的学习相关
- FragmentActivity获取Fragment内控件的方法
- Python序列化
- 蓝牙及蓝牙耳机工作原理
- TCP和UDP
- commons-fileupload实现文件上传、下载、在线打开
- 谷歌最新的百分比布局库的示例项目
- mysql 用户管理 权限控制
- java压缩图片处理
- Win10系统Snap分屏功能把屏幕分成多个部分独立显示
- 堆排序算法分析
- HashMap和TreeMap的区别
- 使用JSOUP解析HTML文档
- Web服务器常用配置问题
- 我的第一篇技术BLOG
- Mac下安装爬虫框架Scrapy
- swift简单的赋值
- django 模板路径
- Visual Studio静态编译
- 进程间通信——管道通信