import java.math.BigInteger;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import com.mysql.jdbc.jdbc2.optional.SuspendableXAConnection;
import bean.Category;
import bean.Product;
import bean.User;
public class Test {
public static void main(String[] args) {
// /hibernate.cfg.xml not found /bean/product.hbm.xml not found
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session s = sf.openSession();
s.beginTransaction();
// Session s1 = sf.openSession();
// s1.beginTransaction();
// s1.get(User.class, 3);
// Session s2 = sf.openSession();
// s2.beginTransaction();
// s2.get(User.class, 3);
//add
// Product p = new Product();
// System.out.println("瞬时状态");
// p.setName("product gao");
// System.out.println(p.getId());
// s.save(p);
// System.out.println(p.getId());
// System.out.println("持久状态");
//delete
// Product p = (Product) s.get(Product.class, 16);
// s.delete(p);
// Product p = new Product();
// p.setId(17);
// s.delete(p);
//update
// Product p = (Product) s.load(Product.class, 16);
// System.out.println(1);
// System.out.println(p.getName());
// System.out.println(2);
// 相同的加载(16),不会再执行sql语句,一级缓存,放在session里面
// Product pa = (Product) s.get(Product.class, 16);
// System.out.println(pa.getName());
// System.out.println(3);
// p.setName("大哥");
// s.update(p);
//4种查询方式
//1
Query q = s.createQuery("from Product p");
List<Product> ps = q.list();
for (Product p : ps) {
System.out.println(p.getName());
}
//2
// Criteria c =
// s.createCriteria(Product.class);
// c.addOrder(Order.desc("id"));
//
// //分页
// c.setFirstResult(3);
// c.setMaxResults(3);
// List<Product> ps = c.list();
// for (Product p : ps) {
// System.out.println(p.getName());
// }
//模糊查询
// Criteria c =
// s.createCriteria(Product.class);
// Category ct = (Category) s.get(Category.class , 2);
//
// c.add(Restrictions.eq("c", ct));
// c.add(Restrictions.like("name", "%s%"));
//
// List<Product> ps = c.list();
// for (Product p : ps) {
// System.out.println();
// System.out.println(p.getName());
// }
//3
// SQLQuery q = s.createSQLQuery("select count(*) from product p");
// List<BigInteger> l = q.list();//index 1
// int count = l.get(0).intValue();
// System.out.println(count);
// SessionFactory sf = new Configuration().configure().buildSessionFactory();
// Session s = sf.openSession();
// s.beginTransaction();
// SQLQuery q = s.createSQLQuery("select p.cid,p.name,c.id,c.name from Product p left join Category c on p.cid=c.id");
// List<Object[]>l = q.list();
// for (Object[] ol : l) {
// System.out.print(ol[0]+"\t");
// System.out.print(ol[1]+"\t");
// System.out.print(ol[2]+"\t");
// System.out.print(ol[3]+"\t");
// System.out.println();
// }
//脱离关系方式一
// Category cg = (Category) s.get(Category.class, 2);
// Set<Product> ps = cg.getProducts();//列出的是category id为2的所有商品,不需要cid
// for (Product pr : ps) {
// if(-1!=pr.getName().indexOf("s")){
// pr.setC(null);
// }
// }
// s.update(cg);
//脱离关系方式二
// Category cg = (Category) s.get(Category.class, 2);
// Set<Product> ps = cg.getProducts();//列出的是category id为2的所有商品,不需要cid
// Product pDelete = null;
// for (Product pr : ps) {
// if(-1!=pr.getName().indexOf("s")){
// pDelete = pr;
// }
// }
// ps.remove(pDelete);
// s.update(cg);
//many to one
// Category c = (Category) s.get(Category.class,2);
// Product p = (Product) s.get(Product.class, 13);
// p.setC(c);
// s.update(p);
/**前面两种脱离方法都进行了查询(通过Set),但是由于Set是无序的且没有分页效果
*
*,故很少使用,下面这种方法才适用
*/
// Query q = s.createQuery("from Product p where p.c =:c order by p.id");
// q.setInteger("c", 3);
//
// List<Product> ps = q.list();
// for (Product p : ps) {
// System.out.println(p.getName());
// }
//模糊查询
// Query q = s.createQuery("from Product p where p.name like:name");
// q.setString("name", "%s%");
//
// List<Product> ps = q.list();
// for (Product p : ps) {
// System.out.println();
// System.out.println(p.getName());
// }
// Product p = (Product) s.get(Product.class, 13);
// Set us = p.getUsers();
// User ua = (User) s.get(User.class,10);
// User ub = (User) s.get(User.class,11);
// us.add(ua);
// us.add(ub);
// s.update(p);
//
// User u = (User) s.get(User.class,10);
// Set ps = u.getProducts();
// Product pc = (Product) s.get(Product.class, 13);
// Product pd = (Product) s.get(Product.class, 11);
// ps.add(pc);
// ps.add(pd);
// s.update(u);
/** get 和 load 方法的区别
* load 延迟加载(lazy load),用的时候才调用sql语句 当查询为空时,load抛出异常
* get 立即调用sql语句。 当查询为空时,get不报异常,只是返回空
*/
// User ua = (User) s.load(User.class,10);
// System.out.println(ua.getName());
//
// User ub = (User) s.get(User.class,11);
// System.out.println(ub.getName());
//瞬时状态","持久状态","脱管状态"
// SessionFactory sf = new Configuration().configure().buildSessionFactory();
// Session s1 = sf.openSession();
//opensession每次新建一个session,getcurrentsession跟着线程走,如果在主线程中多次调用,也会只有一个session
// s1.beginTransaction();
// User ub = (User) s1.get(User.class,11);
//
// Session s2 = sf.openSession();
// s2.beginTransaction();
// User ua = (User) s2.get(User.class,11);
// s1.close();
// s2.close();
// System.out.println(p.getId());
/**
*
* getcurrentsession跟着线程走,如果在主线程中多次调用,也会只有一个session
*/
// SessionFactory sf = new Configuration().configure().buildSessionFactory();
// final Session s = sf.getCurrentSession();
// final Session s1 = sf.getCurrentSession();
//
// Thread t = new Thread(){
// public void run(){
// s.beginTransaction();
// s.get(User.class, 3);
// s.getTransaction().commit();
s.close();
// }
// };
// t.start();
// Thread t1 = new Thread(){
// public void run(){
// s1.beginTransaction();
// s1.get(User.class, 3);
// s1.getTransaction().commit();
s1.close();
// }
// };
// t1.start();
// SessionFactory sf = new Configuration().configure().buildSessionFactory();
// Session s1 = sf.openSession();//增删改时才需要在事物里面操作,get不需要事物
// s1.beginTransaction();
// User u1 = (User) s1.get(User.class, 3);
// System.out.println(u1);
// Session s2 = sf.getCurrentSession();
// s2.beginTransaction();
// User u2 = (User) s2.get(User.class, 3);//增删改,get都需要在事物里面操作,并且在提交事物后,自动关闭session
// System.out.println(u2);
// s1.getTransaction().commit();
// s1.close();
// System.out.println("脱管状态"); //数据库关闭了
// sf.close();
// Session s2 = sf.getCurrentSession();
// s2.beginTransaction();
//
//
//
//
// List l = s.createQuery("from User").list();
// System.out.println("1");
// User u2 = (User) s2.get(User.class, 4);//增删改,get都需要在事物里面操作,并且在提交事物后,自动关闭session
//因为一级缓存,已经将user方法了session
// List li = s.createQuery("from User where id =9").list();//在执行一次sql语句;下面通过n+1减少执行次数
// User u2 = (User) s2.get(User.class, 9);
// Iterator it = s2.createQuery("from User").iterate();
// while(it.hasNext()){
// User u3 = (User) it.next();
// u3.getName();
// }
s.getTransaction().commit();
System.out.println("脱管状态"); //数据库关闭了
sf.close();
//lazy = "false"延迟加载关闭,将执行所有的sql语句
}
}