hibernate之save保存:
Object object = new Object();
getSession.save(object);
保存一个对象
还有另一个saveOrUpdate保存或更新:
getSession.saveOrUpdate(object)如果传进来的object是有id的就会执行更新否则执行插入
hibernate之delete删除:
首先要明白数据的3种状态:持久态、托管(游离)态、瞬(临时)态,持久态表示在数据库中存在的,从数据库中取出放在session中的,如果这个session被close或clear了就会变成托管的状态,而临时态就是我们平时new出来的对象。
然后再讲删除即删除数据库中的对象所以必须是持久态或托管态的数据才能删除,临时态是不行的,所以有了这个前提我们再来删除,
拿到数据库中持久态的数据,然后删除.
User user = getSession.get(User.class,id);
getSession.delete(user);
从别处得到的托管态数据如页面传来的数据,将数据从托管变成持久然后再进行删除,但一般很少这么做,因为没必要,页面很少会传来对象,都是传来要删除记录的id然后根据id拿到在数据库中的持久态然后删除。而从数据库中拿到对象除了上面的get还有load都可以拿到对象,不同的是,get方法马上会执行sql语句到数据库去查,而load方法不会立马执行,只有被调用的时候才会执行sql语句。
hibernate之update更新:
getSession.update(object);前提传进来的object对象是有Id的在数据库能查到的,否则不能更新,并且会更新全部字段,而如果传来的字段没有值但数据库里是有值的,其实我们本意是不做修改,但执行会会变成null,这显然不是我们期望的。那么怎么更新部分字段呢,网上搜了,我看到普遍有这么3种方法:
1.在xml配置文件中设置property标签,update="false",也可以用annotation即在属性上加注解@Column(update="false")那么在更新的时候这个字段就不会参与更新了,显而易见这个方法不灵活。
2.不想每个字段都设置嫌麻烦,那就用dynamic-update="true",动态更新,这样就可以自动更新部分字段了,但是只对持久太有效,修改托管态的还是会全部字段都更新,但没改的地方不变不会成null。
3.自己写sql语句灵活方便,但我觉得还不够
String sql = "update User u set u.userAge=:age where u.id=:id";
Query query = getSession.createQuery(sql);
query.setInteger("age",18);
query.setInteger("id",1);
query.executeUpdate();
这样语句写死了那我只能修改指定的字段,我写age就是age字段我写name就是name字段,但如果数据是页面传来的由用户自己写的,我们怎么知道改的是哪个字段?所以我要把全部字段都写好做个判断if用户修改了哪个我就set哪个然后update,这样我觉得老麻烦死了,如果以后发现有好的如getSession.update(object);数据库会根据传进来的数据比较那些改过就修改,没改过就不发sql语句的话,我再来补充。