@Testjava public void demo01(){mysql //1 查询全部web Session session = factory.openSession();算法 session.beginTransaction();sql
//1 使用简单类名 , 存在自动导包数组 // * Customer.hbm.xml <hibernate-mapping auto-import="true">session // Query query = session.createQuery("from Customer");app //2 使用全限定类名ide Query query = session.createQuery("from com.hibernate.a_init.Customer");函数
List<Customer> allCustomer = query.list(); for (Customer customer : allCustomer) { System.out.println(customer); }
session.getTransaction().commit(); session.close(); } |
1.3 选择查询
@Test public void demo02(){ //2 简单条件查询 Session session = factory.openSession(); session.beginTransaction();
//1 指定数据,cid OID名称 // Query query = session.createQuery("from Customer where cid = 1"); //2 若是使用id,也能够(了解) // Query query = session.createQuery("from Customer where id = 1"); //3 对象别名 ,格式: 类 [as] 别名 // Query query = session.createQuery("from Customer as c where c.cid = 1"); //4 查询全部项,mysql--> select * from... Query query = session.createQuery("select c from Customer as c where c.cid = 1");
Customer customer = (Customer) query.uniqueResult(); System.out.println(customer);
session.getTransaction().commit(); session.close(); } |
@Test public void demo04(){ //4 投影 Session session = factory.openSession(); session.beginTransaction();
//1 默认 //若是单列 ,select c.cname from,须要List<Object> //若是多列,select c.cid,c.cname from ,须要List<Object[]> ,list存放每行,Object[]多列 // Query query = session.createQuery("select c.cid,c.cname from Customer c"); //2 将查询部分数据,设置Customer对象中 // * 格式:new Customer(c.cid,c.cname) // * 注意:Customer必须提供相应的构造方法。 // * 若是投影使用oid,结果脱管态对象。 Query query = session.createQuery("select new Customer(c.cid,c.cname) from Customer c");
List<Customer> allCustomer = query.list(); for (Customer customer : allCustomer) { System.out.println(customer.getCid() + " : " + customer.getOrderSet().size()); }
session.getTransaction().commit(); session.close(); } |
@Test public void demo03(){ //3排序 ,mysql--> select... order by 字段 [asc]|desc ,.... Session session = factory.openSession(); session.beginTransaction();
Query query = session.createQuery("from Customer order by cid desc");
List<Customer> allCustomer = query.list(); for (Customer customer : allCustomer) { System.out.println(customer.getCid()); }
session.getTransaction().commit(); session.close(); } |
@Test public void demo05(){ //分页 Session session = factory.openSession(); session.beginTransaction();
Query query = session.createQuery("from Customer"); // * 开始索引 , startIndex 算法: startIndex = (pageNum - 1) * pageSize; // *** pageNum 当前页(以前的 pageCode) query.setFirstResult(0); // * 每页显示个数 , pageSize query.setMaxResults(2);
List<Customer> allCustomer = query.list(); for (Customer customer : allCustomer) { System.out.println(customer.getCid()); }
session.getTransaction().commit(); session.close(); } |
@Test public void demo06(){ /* 6 绑定参数 * 方式1:占位符,使用? 在hql语句替换具体参数 * 设置参数 query.setXxx(int , object) * 参数1:?位置,从0开始。 * 参数2:实际参数 * 例如:String --> query.setString(int,String) * 方式2:别名 , 格式 “属性= :别名 ” * 设置参数 query.setXxx(String,object) * 参数1:别名 * 参数2:实际参数 * 例如:Integer --> query.setInteger(String,Integer) * 提供公共设置方法 * setParameter(int|string , Object) */ Session session = factory.openSession(); session.beginTransaction();
Integer cid = 1;
//方式1 // Query query = session.createQuery("from Customer where cid = ?"); // query.setInteger(0, cid); //方式2 Query query = session.createQuery("from Customer where cid = :xxx"); // query.setInteger("xxx", cid); query.setParameter("xxx", cid);
Customer customer = (Customer) query.uniqueResult(); System.out.println(customer);
session.getTransaction().commit(); session.close(); } |
@Test public void demo07(){ /* 7 聚合函数 */ Session session = factory.openSession(); session.beginTransaction();
//1 // Query query = session.createQuery("select count(*) from Customer"); //2 别名 // Query query = session.createQuery("select count(c) from Customer c"); //3 oid Query query = session.createQuery("select count(cid) from Customer");
Long numLong = (Long) query.uniqueResult(); int num = numLong.intValue();
System.out.println(num);
session.getTransaction().commit(); session.close(); } |
1.交叉链接 ,等效 sql 笛卡尔积
2.隐式内链接,等效 sql 隐式内链接
3.内链接,等效sql内链接
4.迫切内链接,hibernate底层使用 内链接。
5.左外链接,等效sql左外链接
6.迫切左外链接,hibernate底层使用 左外链接
7.右外链接,等效sql右外链接
内链接和迫切内链接?
左外链接和迫切左外链接?
@Test public void demo08(){ /* 8 连接查询 : 左外链接和迫切左外链接? * * 左外链接 , left outer join * 底层使用sql的左外链接,hibernate进行数据自动封装,将一条记录,封装给两个对象(Customer,Order) * 将两个对象添加到一个对象数组中Object[Customer,Order] * * 迫切左外连接 left outer join fetch * 底层使用sql的左外链接,hibernate将一条记录封装给Customer,讲order数据封装Order,并将order关联到Customer * customer.getOrderSet().add(order) * 默认查询的数据重复 */ Session session = factory.openSession(); session.beginTransaction();
//左外链接 // List list = session.createQuery("from Customer c left outer join c.orderSet ").list(); //迫切左外连接 (默认数据重复) // List list = session.createQuery("from Customer c left outer join fetch c.orderSet ").list(); //迫切左外连接 (去重复) List list = session.createQuery("select distinct c from Customer c left outer join fetch c.orderSet ").list();
session.getTransaction().commit(); session.close(); } |
l 思想:将HQL从java源码中,提取到配置文件中。
l 分类:全局、布局
l 配置
全局:*.hbm.xml <class></class><query name="名称">HQL语句
局部: <class name="" table=""><id><property> <query name="">HQL</class>
l 得到
全局:
session.getNamedQuery("queryName")
局部:
session.getNamedQuery("className.queryName") 须要使用类的全限定名称
@Test public void demo09(){ /* 9 命名查询 */ Session session = factory.openSession(); session.beginTransaction();
//全局 //List list = session.getNamedQuery("findAll").list(); //局部 List list = session.getNamedQuery("com.hibernate.a_init.Customer.findAll").list();
System.out.println(list.size());
session.getTransaction().commit(); session.close(); } |
QBC:Query By Criteria条件查询.面向对象的查询的方式.
// 简单查询:
List<Customer> list = session.createCriteria(Customer.class).list();
for (Customer customer : list) {
System.out.println(customer);
}
Criteria criteria = session.createCriteria(Order.class);
criteria.setFirstResult(10);
criteria.setMaxResults(10);
List<Order> list = criteria.list();
Criteria criteria = session.createCriteria(Customer.class);
// criteria.addOrder(org.hibernate.criterion.Order.asc("age"));
criteria.addOrder(org.hibernate.criterion.Order.desc("age"));
List<Customer> list = criteria.list();
// 按名称查询:
/*Criteria criteria = session.createCriteria(Customer.class);
criteria.add(Restrictions.eq("cname", "tom"));
List<Customer> list = criteria.list();*/
// 模糊查询;
/*Criteria criteria = session.createCriteria(Customer.class);
criteria.add(Restrictions.like("cname", "t%"));
List<Customer> list = criteria.list();*/
// 条件并列查询
Criteria criteria = session.createCriteria(Customer.class);
criteria.add(Restrictions.like("cname", "t%"));
criteria.add(Restrictions.ge("age", 35));
List<Customer> list = criteria.list();
l DetachedCriteria 离线查询对象,不须要使用Session就能够拼凑查询条件。通常使用在web层或service层拼凑。将此对象传递给dao层,此时将与session进行绑定执行查询。
l 离线查询条件与QBC同样的。
@Test public void demo10(){ /* 10 离线查询 */
//web & service DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class); detachedCriteria.add(Restrictions.eq("cid", 1));
//---------------dao
Session session = factory.openSession(); session.beginTransaction();
// 离线Criteria 与session绑定 Criteria criteria = detachedCriteria.getExecutableCriteria(session); List<Customer> allCustomer = criteria.list(); System.out.println(allCustomer.size());
session.getTransaction().commit(); session.close(); } |
l 整合c3p0
步骤一:导入c3p0 jar包
步骤二:hibernate.cfg.xml 配置
hibernate.connection.provider_class org.hibernate.connection.C3P0ConnectionProvider
l c3p0具体配置参数
###########################
### C3P0 Connection Pool###
###########################
#hibernate.c3p0.max_size 2
#hibernate.c3p0.min_size 2
#hibernate.c3p0.timeout 5000
#hibernate.c3p0.max_statements 100
#hibernate.c3p0.idle_test_period 3000
#hibernate.c3p0.acquire_increment 2
#hibernate.c3p0.validate false