hibernate(3)

来源:互联网 发布:手机怎么找回淘宝密码 编辑:程序博客网 时间:2024/05/29 17:05
public class DBHelper {
private static SessionFactory sessionFactory;


static{
Configuration configuration = new Configuration().configure("");//设置配置类
sessionFactory = configuration.buildSessionFactory();//建立SessFactory
}

//save方法保存对象到数据库
public void mysave(){
Session session = sessionFactory.openSession();
Transaction transaction = null;
//通过SessionFactory开启Session,不会马上取得Connection,而是在最后真正需要连接资料库进行更新或查询时才会取得Connection,如果有设定Connection pool,
//则从Connection pool中取得Connection,而关闭Session时,如果有设定Connection pool,则是将Connection归还给Connection pool,
//而不是直接关闭Connection
UserModel userModel = new UserModel();
userModel.setName("wlf");
userModel.setTheDate(new Timestamp(System.currentTimeMillis()));
try {
transaction = session.beginTransaction();
//在Hibernate中,开启一个Session会建立一个Persistence context,它可以进行快取管理、dirty check等,而所有的读取、更新、插入等动作,则是在Transaction中完成。
session.save(userModel);
transaction.commit();
//save()等操作之后,不会马上对资料库进行更新,而是在Transaction的commit()之后才会对资料库进行更新,在Transaction之间的操作要就全部成功,要就全部失败,
//如果更新失败,则在资料库层面会撤消所有更新操作,然而记忆体中的持久物件是不会回复原有状态的,事实上,当 Transaction失败,这一次的Session就要马上跟着失效,
//放弃所有记忆体中的物件,而不是尝试以原物件再进行更新的动作。
} catch (Exception e) {
transaction.rollback();//如果发生错误,则transaction回滚,清空其中的内容。
}finally {
session.close();
}
}


//get,load方法查询id = 1 的内容
public void myGet(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
try {
session.get(UserModel.class,new Integer(1));
// session.load(UserModel.class, new Integer(1));
//如果未能发现相符合的资料,则get()方法会返回null,而load()方法会丢出ObjectNotFoundException,在进阶的应用中,load()方法可以返回代理(proxy)物件,
//在必要时才真正查询资料库取得对应资料,并可充分利用快取机制。
transaction.commit();
} catch (Exception e) {
transaction.rollback();
}finally {
session.close();
}
}

//delete方法删除内容
public void myDelete(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
try {
UserModel userModel = (UserModel) session.get(UserModel.class, new Integer(1));
session.delete(userModel);
transaction.commit();
} catch (Exception e) {
transaction.rollback();
}finally {
session.close();
}
}

//使用update更新内容
public void myUpdate(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
UserModel userModel = new UserModel();
try {
userModel = (UserModel)session.get(UserModel.class, new Integer(1));
transaction.commit();
} catch (Exception e) {
transaction.rollback();
}finally {
session.close();
}

try {
userModel.setName("wmm");
session.update(userModel);
transaction.commit();
} catch (Exception e) {
transaction.rollback();
}finally {
session.close();
}
}

//使用merge存储(SaveOrUpdate)内容  ??
public void SaveOrUpdate(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
UserModel userModel1 = new UserModel();
UserModel userModel2 = new UserModel();
UserModel userModel3 = new UserModel();
try {
userModel1 = (UserModel)session.get(UserModel.class, new Integer(1));
transaction.commit();
} catch (Exception e) {
transaction.rollback();
}finally {
session.close();
}

try {
userModel2 = (UserModel)session.get(UserModel.class, new Integer(1));
userModel3 = (UserModel) session.merge(userModel1);
//merge()会将user1与user2的状态合并,传回的物件实例就是user2原先所参考的实例。
session.update(userModel3);
transaction.commit();
} catch (Exception e) {
transaction.rollback();
}finally {
session.close();
}
}

//createQuery通过hql语句实现各种功能:各种查询、删除、更新:
//查询数据 : hql = "form UserModel where name = 'wlf'";
//查询数据条数: hql = "select count(*) from UserModel";
//别名:hql = "form UserModel user where user.id = 1" user是给 UserModel起一个别名,在这条语句中出现user就等同于 UserModel
   //这样写一是方便,二是当多表关联有相同字段的时候通过这个别名可以区别出来.user.id就是UserModel对应的表中的id。
//可以在where后面跟随各种表达式,如:
   //"where (user.id/10 = 3)";
   //"where user.name is not null" //测试字段值是否为空,为空用is null;
   //"where user.name between 20 and 30";//测试字段值是否在某一范围内;
   //"where user.age <>0";//测试int,BigDecimal型字段值是否等于0;
   //"where user.name in ('wlf','wmm')";//测试字段值是否在指定范围内;
   //模糊查询:"where user.name like 'w%'";
   //排序:order by id;    反序: order by theDate desc; 正序再反序:order by id,theDate desc;
   //分组:group by user.name; 结合having: group by user.name having user.name = 'wlf';
//删除数据: hql = "delete UserModel where name = 'wlf'";
//更新数据 : hql = "update UserModel set name='wlf' where name='wmm'";
public void myCreateQuery(){
String hql = "";
Session session = sessionFactory.openSession();
Transaction transaction = null;
List list = null;
   try {
transaction = session.beginTransaction();
Query query = session.createQuery(hql);
list = query.list();
transaction.commit();
} catch (Exception e) {
transaction.rollback();
}finally {
session.close();
}
}



public void myCreateQuery1(){
String hql = "";
Session session = sessionFactory.openSession();
Transaction transaction = null;
List list = null;
try {
transaction = session.beginTransaction();
Query query = session.createQuery(hql);
//对query的操作:
//参数绑定:
//1.按参数名称绑定:
//hql = "from UserModel user where user.name=:name and user.age=:age";
//query.setString("name", "wlf");
//query.setInteger("age", 18);

//2.按参数位置绑定:
//hql = "form UserModel user where user.name=? and user.age=?";
//query.setString(0, "wlf");
//query.setInteger(1, 18);

//3.setParameter()方法:    //用法同1,只是设置类型的方法不同
//hql = "form UserModel user where user.name=:name";
//query.setParameter("name", "wlf", Hibernate.STRING);
//如上面代码所示,setParameter()方法包含三个参数,分别是命名参数名称,命名参数实际值,以及命名参数映射类型。
//对于某些参数类型setParameter()方法可以根据参数值的Java类型,猜测出对应的映射类型,因此这时不需要显示写出映射类型;
//但是对于一些类型就必须写明映射类型,比如java.util.Date类型,因为它会对应Hibernate的多种映射类型,比如Hibernate.DATA或者Hibernate.TIMESTAMP。
//也可以按参数位置绑定,用法同2
//若不确定参数个数,可以定义一个object,然后遍历其所有参数即可。

//4.setProperties()方法:(setEntity())
//在Hibernate中可以使用setProperties()方法,将命名参数与一个对象的属性值绑定在一起,该对象可以是自定义的类也可以用hash表,后者应该比较方便些
//setProperties()方法会自动将customer对象实例的属性值匹配到命名参数上,但是要求命名参数名称必须要与实体对象相应的属性同名
//Customer customer=new Customer();
//customer.setName(“pansl”);
//customer.setAge(80);
//Query query=session.createQuery(“from Customer c where c.name=:name and c.age=:age ”);
//query.setProperties(customer);
//或者:
//HashMap<String, String> parameterMap = new HashMap<String, String>();
//parameterMap.put("accountId", accountId);
//parameterMap.put("code", code);
//query.setProperties(parameterMap);
//可以将对象进行参数传递,从而在db层的上一层对参数进行确定。
//这里还有一个特殊的setEntity()方法,它会把命名参数与一个持久化对象相关联(?)

//此外,可以设置返回结果的起始值:
//query.setFirstResult(firstResult);
//query.setMaxResults(maxResults);
list = query.list();
transaction.commit();
} catch (Exception e) {
transaction.rollback();
}finally {
session.close();
}
}
}
0 0
原创粉丝点击