Hibernate学习之一对多基础查询(二)

一。Hibernate的基础查询

     1.对象导航查询
     2.hql查询
     3.hql条件查询
     4.hql模糊查询
     5.hql排序查询
     6.hql分页查询
     7.hql投影查询
     8.hql记录数查询

     9.hibernate对sql的支持

     这些基本查询讲完以后够基本用的,下一期作者会讲一下Hibernate的高级查询。

二。Hibernate配置文件

     (1)People.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC   
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
    	<class name="com.ies.entity.People" table="t_people">
    		<id name="pid" column="pid">
    			<generator class="native"></generator>
    		</id>
    		<property name="pname" column="pname"></property>
    		<property name="page" column="page"></property>
    		
    		<set name="setCar" cascade="save-update,delete">
    			<!-- 一对多,有外键,
					hibernate机制:双向维护外键,在一和多那一方都配置外键
					key的column属性表示外键名称
			 	-->
    			<key column="pid"></key>
    			<one-to-many class="com.ies.entity.Car"/>
    		</set>
    	</class>
    </hibernate-mapping>

     (2).Car.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC   
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
    	<class name="com.ies.entity.Car" table="t_car">
    		<id name="cid" column="cid">
    			<generator class="native"></generator>
    		</id>
    		<property name="cname" column="cname"></property>
    		<property name="cage" column="cage"></property>
    		<!-- name:少的一方在多的一方类中的表示
    			column:外键
    			class:外键所指的类名
    			 -->
			<many-to-one name="people" column="pid" class="com.ies.entity.People"></many-to-one>
    	</class>
    </hibernate-mapping>

(3)src/hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
		<session-factory>
			<!-- 1数据库信息 -->
			<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
			<property name="hibernate.connection.url">jdbc:mysql:///mydb3</property>
			<property name="hibernate.connection.username">root</property>
			<property name="hibernate.connection.password">000000</property>
			
			<!-- 2.hibernate 其他配置-->
				<!-- 配置事务的隔离级别 -->
			<property name="hibernate.connection.isolation">4</property>
				<!-- 显示底层sql语句 -->
			<property name="hibernate.show_sql">true</property>
				<!-- 输出底层sql语句格式 -->
			<property name="hibernate.format_sql">true</property>
				<!-- hibernate会自动创建表 
					update:若表存在则更新,没有则创建
				-->
			<property name="hibernate.hbm2ddl.auto">update</property>
				<!-- 配置数据库方言,做分页的时候会使用到
					让hibernate框架识别不同的数据库
					方言一定要写成这样不能修改其他的  否则无法创建表
				 -->
			<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
			<!-- 配置 Session 绑定本地线程 -->
			<property name="hibernate.current_session_context_class">thread</property>
			<!-- 引入配置文件 -->
			<mapping resource="com/ies/entity/Car.hbm.xml"/>
			<mapping resource="com/ies/entity/People.hbm.xml"/>
					
		</session-factory>    
    
    </hibernate-configuration>

三。Hibernate配置文件对应实体类

     (1)People.java

package com.ies.entity;

import java.util.HashSet;
import java.util.Set;

/*
 * people
 */
public class People {
	
	private Integer pid;
	private String pname;
	private String page;
	
	private Set<Car> setCar = new HashSet<>();
	
	public Integer getPid() {
		return pid;
	}
	public void setPid(Integer pid) {
		this.pid = pid;
	}
	public Set<Car> getSetCar() {
		return setCar;
	}
	public void setSetCar(Set<Car> setCar) {
		this.setCar = setCar;
	}
	public String getPname() {
		return pname;
	}
	public void setPname(String pname) {
		this.pname = pname;
	}
	public String getPage() {
		return page;
	}
	public void setPage(String page) {
		this.page = page;
	}
	@Override
	public String toString() {
		return "People [pid=" + pid + ", pname=" + pname + ", page=" + page + "]";
	}
}

(2)Car.java

package com.ies.entity;

/*
 * animal
 */
public class Car {
	
	private Integer cid;
	private String cname;
	private String cage;
	
	private People people;

	public Integer getCid() {
		return cid;
	}

	public void setCid(Integer cid) {
		this.cid = cid;
	}

	public String getCname() {
		return cname;
	}

	public void setCname(String cname) {
		this.cname = cname;
	}

	public String getCage() {
		return cage;
	}

	public void setCage(String cage) {
		this.cage = cage;
	}

	public People getPeople() {
		return people;
	}

	public void setPeople(People people) {
		this.people = people;
	}

	@Override
	public String toString() {
		return "Car [cname=" + cname + ", cage=" + cage + "]";
	}
}

四。查询Demo

HibernateUtil.java

获取sessionFactory和session对象。

package com.ies.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
	private static SessionFactory sessionFactory = null;
	static {
		Configuration  cfg = new Configuration();
		cfg.configure();
		/**
		 * 创建session的对象
		 * 读取核心配置文件的内容。
		 * 会根据映射关系,在数据库里把表创建
		 */
		sessionFactory = cfg.buildSessionFactory();
	}
	
	public  static SessionFactory getSessionFactory() {
		return sessionFactory;
	}
	
	public static Session openSession() {
		return sessionFactory.openSession();
	}
		
	public static Session currentSession() {
		return sessionFactory.getCurrentSession();
	}

	public static void main(String[] args) {
		
	}
}

 1.对象导航查询

package com.ies.test;

import java.util.List;
import java.util.Set;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.persister.collection.ElementPropertyMapping;
import org.hibernate.query.Query;
import org.junit.Test;

import com.ies.entity.Car;
import com.ies.entity.People;
import com.ies.util.HibernateUtil;
import com.sun.org.apache.xml.internal.resolver.helpers.PublicId;

import sun.security.x509.PrivateKeyUsageExtension;


public class HqlQueryDemo {
	private SessionFactory sessionFactory = null;
	private Session session = null;
	private Transaction transaction  = null;
/*
	 * 对象导航查询=====================================
	 */
	@Test
	public void testSelect() {
		try {
			sessionFactory = HibernateUtil.getSessionFactory();
			session = sessionFactory.openSession();
			Transaction transaction = session.beginTransaction();
			People people = session.get(People.class, 5);
			Set<Car> cars = people.getSetCar();
			for (Car car : cars) {
				System.out.println(car.toString());
			}
			People people2 = session.load(People.class, 5);
			Set<Car> cars2 = people2.getSetCar();
			for (Car car : cars2) {
				System.out.println(car.toString());
			}
			transaction.commit();
		}catch (Exception e) {
			transaction.rollback();
			e.printStackTrace();
		}finally {
			session.close();
			sessionFactory.close();
		}
	}
}

2.hql查询

/*
	 * ================hql=================查询
	 */
	@Test
	public void testHql() {
		try {
			sessionFactory = HibernateUtil.getSessionFactory();
			session = sessionFactory.openSession();
			transaction = session.beginTransaction();
			String hql = "FROM People";
			Query query = session.createQuery(hql);
			List<People> list = query.list();
			for (People people : list) {
				System.out.println(people.toString());
			}
			transaction.commit();
		}catch (Exception e) {
			transaction.rollback();
			e.printStackTrace();
		}finally {
			session.close();
			sessionFactory.close();
		}
	}

 3.条件查寻

/*
	 *条件查寻
	 */
	@Test
	public void testHqlWithConditions() {
		try {
			sessionFactory = HibernateUtil.getSessionFactory();
			session = sessionFactory.openSession();
			transaction = session.beginTransaction();
			String hql = "";
			//hibernate4.x的jar才可以这样写
			hql = "FROM People where pid = ?1";
			Query query = session.createQuery(hql);
			query.setParameter(1, 3);
			List<People> list = query.list();
			for (People people : list) {
				System.out.println(people.toString());
			}
			transaction.commit();
		}catch (Exception e) {
			transaction.rollback();
			e.printStackTrace();
		}
	}

4. hql模糊查询

/*
	 * hql =======模糊查询=====
	 */
	@Test
	public void testHqlWithConditions2() {
		try {
			sessionFactory = HibernateUtil.getSessionFactory();
			session = sessionFactory.openSession();
			transaction = session.beginTransaction();
			String hql = "FROM People where pname like ?1";
			Query query = session.createQuery(hql);
			query.setParameter(1, "%t%");
			List<People> list = query.list();
			for (People people : list) {
				System.out.println(people.toString());
			}
			transaction.commit();
		}catch (Exception e) {
			transaction.rollback();
			e.printStackTrace();
		}finally {
			session.close();
			sessionFactory.close();
		}
	}

5.hql排序查询

/*
	 * 排序查询
	 */
	@Test
	public void testHqlInOrder() {
		try {
			sessionFactory = HibernateUtil.getSessionFactory();
			session = sessionFactory.openSession();
			transaction = session.beginTransaction();
			String hql="From People order by pid desc";
			Query query = session.createQuery(hql);
			List<People> list = query.list();
			for (People people : list) {
				System.out.println(people.toString());
			}
			transaction.commit();
		}catch (Exception e) {
			e.printStackTrace();
		}finally {
			session.close();
			sessionFactory.close();
		}
	}

6.hql分页查询

/*
	 * 投影查询
	 */
	@Test
	public void testHqlInPortion() {
		try {
			sessionFactory = HibernateUtil.getSessionFactory();
			session = sessionFactory.openSession();
			transaction = session.beginTransaction();
			String hql = "SELECT pid,pname FROM People";
			Query query = session.createQuery(hql);
			List<Object[]> list = query.list();
			for (Object[] objects : list) {
				System.out.println(objects[0]+"="+objects[1]);
			}
			transaction.commit();
		}catch (Exception e) {
			transaction.rollback();
			e.printStackTrace();
		}finally {
			session.close();
			sessionFactory.close();
		}
	}

7.投影查询,即对象部分属性查询

/*
	 * 投影查询
	 */
	@Test
	public void testHqlInPortion() {
		try {
			sessionFactory = HibernateUtil.getSessionFactory();
			session = sessionFactory.openSession();
			transaction = session.beginTransaction();
			String hql = "SELECT pid,pname FROM People";
			Query query = session.createQuery(hql);
			List<Object[]> list = query.list();
			for (Object[] objects : list) {
				System.out.println(objects[0]+"="+objects[1]);
			}
			transaction.commit();
		}catch (Exception e) {
			transaction.rollback();
			e.printStackTrace();
		}finally {
			session.close();
			sessionFactory.close();
		}
	}

8.hql查询记录数

/*
	 * 查询记录数
	 */
	@Test
	public void testHqlCount() {
		try {
			sessionFactory = HibernateUtil.getSessionFactory();
			session = sessionFactory.openSession();
			transaction = session.beginTransaction();
			String hql = "SELECT COUNT(pid) FROM People";
			Query query = session.createQuery(hql);
			Object object = query.uniqueResult();
			long l = (long)object;
			int count = (int)l;
			System.out.println("记录数:"+count);
			transaction.commit();
		}catch (Exception e) {
			transaction.rollback();
			e.printStackTrace();
		}finally {
			session.close();
			sessionFactory.close();
		}
	}

9.hibernate对sql的支持

/*
	 * 
	 */
	@Test
	public void testSql() {
		try {
			sessionFactory = HibernateUtil.getSessionFactory();
			session = sessionFactory.openSession();
			transaction = session.beginTransaction();
			String sql = "select * from t_people";
			SQLQuery sqlQuery = session.createSQLQuery(sql);
			sqlQuery.addEntity(People.class);
			List<People> list = sqlQuery.list();
			for (People person : list) {
				System.out.println(person.toString());
			}
			transaction.commit();
		}catch (Exception e) {
			transaction.rollback();
			e.printStackTrace();
		}finally {
			session.close();
			sessionFactory.close();
		}
	}

这一期的查询暂时先到这,如有什么疑问请联系作者

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值