Hibernate工作原理浅析和持久化对象常用方法介绍
初学Hibernate,阅读了有关书籍,做了如下笔记和思考心得。
第一部分:Hibernate 工作原理
首先我们使用MyEclipse 6.5开发环境,我们可以使用其添加Hibernate框架的能力,自动导入那些需要使用的包。并且自动创建
Hibernate配置文件以及HibernateSessionFactory
一、构建Configuration实例,初始化该实例中的所有变量
private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); private static Configuration configuration = new Configuration(); private static org.hibernate.SessionFactory sessionFactory; private static String configFile = CONFIG_FILE_LOCATION;
configuration.configure(configFile);
sessionFactory = configuration.buildSessionFactory();
session = (sessionFactory != null) ? sessionFactory.openSession(): null;//这个是在MySessionFactory中Session session = MySessionFactory.getSession();//这个是在类似MemberDAOImpl的类中
Transaction ts = session.beginTransaction();
session.save(user);
tx.commit()
MySessionFactory.closeSession();
Session session = MySessionFactory.currentSession();//或者为MySession.getSession();Transaction ts = null;try{ts = session.beginTransaction();//业务代码ts.commit();}catch(Exception ex){if(ts!=null)ts.rollback();ex.printStackTrace();}finally{MySessionFactory.closeSession();}
Session session = MySessionFactory.currentSession();Transaction ts = null;try{Connection conn = session.connection();Statement stat = conn.creatStatement();String sql = "select * from orders";ts = session.beginTransaction();ResultSet rs = stat.executeQuery(sql);while(rs.next){System.out.println(rs.getString(1)+"\t"+rs.getString(2));}ts.commit();}
Item item = (Items)session.get(Items.class,id);
session.save(item);
session.update(item);
if(!Hibernate.isInitialized(item.getOrders())){Hibernate.initialize(item.getOrders());}
Query query = session.createQuery();Iterator it = query.list().iterator();
Query query = session.createQuery("from Orders as a order by a.money desc");query.setMaxResults(1);//设置最大检索数目为1Orders orders = (Orders)query.uniqueResult();//装载单个对象
Query query = session.createQuery("from Customer as a Where a.cname =:p1");//这里:p1是参数名query.setString("p1","张三");//为参数p1指定参数值。query.setMaxResults(1);Customer customer = (Customer)query.uniqueResult();
Query query = session.createQuery("from Orders as a");int pageSize = 15;//每页的记录条数int pageNo =1 ;//当前页号,即第几页query.setFirstResult((pageNo-1)*pageSize);//指定从哪一个对象还是检索query.setMaxResult(pageSize);//指定一次最多检索出的对象数目Iterator it = query.list().iterator();//查询我们需要的那页。
Query query = session.createQuery("from Customer as a inner join a.orders as b");//内连接,这里我们要注意,我们
<set name="orders" cascade="all" lazy="true" inverse="true"> <key column="CUSTOMER_ID" /> <one-to-many /></set>它指定了外键CUSTOMER_ID,而存在该默认的连接,我们不需要再输入where这一句。
Query query = session.createQuery("from Customer as a left join a.orders as b");//左外连接Query query = session.createQuery("from Customer as a right join a.orders as b");//右外连接Query query = session.createQuery("from Customer as a, Orders as b");//交叉连接,内连接。逗号可以理解为交叉连接
package com.beanpublic class MyReport{private String cname;private String bank;private String orderno;private Double money;public MyReport(String cname ,String bank,String orderno,Double money){cname = this.cname;bank = this.bank;orderno = this.orderno;money = this.money;}//省略了set和get方法}
Session session = MySessionFactory.currentSession();Transaction ts = session.beginTransaction();Query query = session.createQuery("select new com.bean.MyReport(a.cname,a.bank,b.orderno,b.money)from Customer as a inner join a.orders as b");Iterator it =query().list().iterator();ts.commit();MySessionFactory.closeSession();MyReport report = null;while(it.hasNext()){report = (MyReport)it.next();System.out.println("顾客姓名:"+report.getCname());System.out.println("银行账号:"+report.getBank());System.out.println("订单编号:"+report.getOrderno());System.out.println("订单金额:"+report.getMoney());}