04 Session接口及getloadpersist方法

 写一个从数据库里取数据的方法
查询的话,不会牵扯到修改数据库,所以不用打开事务
static User getUser(int id){
Session s=null;
Transaction tx=null;
try{
s.HibernateUtil.getSession();
Class userClass=User.class;
User user=(User)s.get(userClass,id);

return user;
}finally{
if(s!=null)
s.close();
}
}

-------------------------------------------------
Class userClass=User.class;
User user=(User)s.get(userClass,id);
这里区分一下类和实例: 类是图纸,实例就是根据图纸建的大楼
比如User是图纸,user是大楼
在Java中什么都是对象,所以,图纸(User)也算一个对象。
那么,怎么来描述User这个对象呢?
比如,String,User都是图纸,在Java中图纸叫做Class
怎么得到Class的实例userClass? 这个实例不是我们构
造出来的,是由Java虚拟机构造出来的:User.class
虚拟机将在将Class加入到内存里边,它就会构造出这样
一个实例出来
User.class 的.class相当于一个静态成员(Object提供)
这个属性的赋值,是虚拟机在装载这个类之后,构造出这
个实例。赋值到userClass对象
Class包括的信息:类名,类的方法,类的属性,类的继承,
实现了哪些接口
反射所能办到的,都是通过class来办到的。
可以拿到它的一构造方法来构造一个对象,也可以拿到它
的一个普通方法来调用它,都是可以的。

-------------------------------------------------
User user=(User)s.get(userClass,id);
Hibernate要通过这个get方法拿到映射文件
它能完成所有的操作,都是依据映射文件来办到的。
把类的信息给它以后,它知道是哪一个类以后,然后找到
相应的映射文件,关联到数据表,就可以对类和表之间进
行映射和处理。

-----------------------------------------------
Hibernate工作的依据就是映射文件,所以我们需要知道
它是怎样的定义这个映射文件的
public static void main(String[] args){
User user=new User();
user.setBirthday(new Date());
user.setName("name");
addUser(user);
System.out.println("id:"+ user.getId());
User u=getUser(user.getId());
System.out.println("name:"+ u.getName());
}
运行结果: id:1
                   name:name

static User getUser(int id){
Session s=null;
Transaction tx=null;
try{
s.HibernateUtil.getSession();
Class userClass=User.class;
User user=(User)s.get(userClass,id);
return user;
}finally{
if(s!=null)
s.close();
}
}

-------------------------------------------------
为了看到sql语句可以在 hibernate.cfg.xml中添加属性
<property name="show_sql">true</property>
hibernate-3.2.5\hibernate-3.2\etc\hibernate.properties
下,可查到hibernate的属性

------------------------------------------------
get:
User user=(User)s.get(userClass,id);
更多方法可以看源码session.class

------------------------------------------------
load:
User user=(User)s.load(userClass,id);
load 不会去访问数据库(懒加载),当第一次使用时
才会去访问数据库
load的user对象是永远不会为空的,它自己new出
了一个User的子类

------------------------------------------------
merge:
将对象和数据进行一次更新

------------------------------------------------
presist:
跟save的效果是一样的
区别:当未开启事务,save会插入数据,然后回滚
而persist直接不插入

------------------------------------------------
refresh:
相当于重新读取一次

------------------------------------------------
-Session的几个主要方法
1.save,persist保存数据,persist在事务外不会产生 insert语句。
2.delete,删除对象
3.update,更新对象,如果数据库中没有记录,会出现异常。
4.get,根据ID查,会立刻访问数据库。
5.Load,根据ID查(返回的是代理,不会立即访问数据库)
6.saveOrUpdate,merge(根据ID和version的值来确定是save或
update),调用merge你的对象还是托管的。
7.lock(把对象变成持久对象,但不会同步对象的状态)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值