HIbernate入门3

Hibernate入门3

今天就来给大家讲讲,单表的查询,可能大家这里会有个疑问,为什么不和增删改放在一起,那是因为,增删改都是一个样子,查询比较多,查询的方式也比较多。所以把查询单独拿到一篇文章来说了

首先我们来讲讲根据主键的查询,我们要讲的是load和get

load和get只能拿来根据主键查询
看下面的代码

一、Get和Load查询

load

	public static void loadUser() {
		// 创建session对象
		Session session = factory.openSession();

		// 开启事务
		Transaction transaction = session.beginTransaction();

		try {

			User user = (User) session.load(User.class, "2c9082b66e4589bd016e4589be7f0000");

			System.out.println(user);

			// 事务提交
			transaction.commit();
		} catch (Exception e) {
			// 事务回滚
			transaction.rollback();
			e.printStackTrace();
		} finally {
			// 判断session对象是否为空 是否连接着数据库
			if (session != null) {
				if (session.isConnected()) {
					session.close();
				}
			}
		}
	}

get

public static void getUser() {
		// 创建session对象
		Session session = factory.openSession();

		// 开启事务
		Transaction transaction = session.beginTransaction();

		try {

			User user = (User) session.get(User.class, "2c9082b66e4589bd016e4589be7f0000");

			System.out.println(user);

			// 事务提交
			transaction.commit();
		} catch (Exception e) {
			// 事务回滚
			transaction.rollback();
			e.printStackTrace();
		} finally {
			// 判断session对象是否为空 是否连接着数据库
			if (session != null) {
				if (session.isConnected()) {
					session.close();
				}
			}
		}
	}

通过以上的代码我们可以看出这两个方法的参数都是如出一辙的
这时我们就会有个疑问,为什么参数一样和结果一样那为什么还要有两种啊

答案很明显,它们有区别的
我们来看看它们的区别

Get和Load区别

1.返回值
1.1.如果主键不存在,Get会返回一个Null
1.2.如果主键不存在,Load会给我们抛出一个ObjectNotFoundException异常
org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.test.domain.User#9]
	at org.hibernate.internal.SessionFactoryImpl$1$1.handleEntityNotFound(SessionFactoryImpl.java:247)
	at org.hibernate.proxy.AbstractLazyInitializer.checkTargetState(AbstractLazyInitializer.java:262)
	at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:176)
	at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:286)
	at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)
	at com.test.domain.User_$$_jvst3e6_0.toString(User_$$_jvst3e6_0.java)
	at java.lang.String.valueOf(String.java:2994)
	at java.io.PrintStream.println(PrintStream.java:821)
	at com.test.SessionTest.loadUser(SessionTest.java:141)
	at com.test.SessionTest.main(SessionTest.java:31)
2.加载机制
2.1.Get会直接执行我们的SQL语句
2.2.Load是Lazy(懒)加载,会到我们真正使用的时候才会执行SQL语句

懒加载:拿生活中的例子来说,等到肚子饿的时候,才会去找吃的,可能有些不恰当,但大家简单理解一下就可以了

二、Query接口查询

前面简单的说了,根据主键的查询,我们就来说说查询所有,与常见的分页查询

查询所有

	public static void queryUser() {
		// 创建session对象
		Session session = factory.openSession();

		// 开启事务
		Transaction transaction = session.beginTransaction();

		try {
			//根据session对象获取一个Query对象
			Query query = session.createQuery("from User");

			@SuppressWarnings("unchecked")
			List<User> userList = query.list();

			for (User user : userList) {
				System.out.println(user);
			}

			// 事务提交
			transaction.commit();
		} catch (Exception e) {
			// 事务回滚
			transaction.rollback();
			e.printStackTrace();
		} finally {
			// 判断session对象是否为空 是否连接着数据库
			if (session != null) {
				if (session.isConnected()) {
					session.close();
				}
			}
		}
	}
注意的地方:session.createQuery(“from User”);

这个地方里的并非SQL语句,而是Hibernate的专属语句HQL语句
其实和SQL语句有一些相同的地方的
SQL语句例子:select * from 表名
HQL语句例子:from 实体类名
这里大家千万要记得是实体类名字,不要搞错了

然后根据你查寻的数据的数量,决定返回的类型,就好比查询所有
我们这里就用了List集合 query.list();

分页查询

下面就讲讲分页查询,其实也不太难,看一下下面的代码

	public static void queryUser2() {
		// 创建session对象
		Session session = factory.openSession();

		// 开启事务
		Transaction transaction = session.beginTransaction();

		try {

			Query query = session.createQuery("from User");
			// 开始位置 0是第一个
			query.setFirstResult(0);
			// 显示多少条数据
			query.setMaxResults(2);

			@SuppressWarnings("unchecked")
			List<User> userList = query.list();

			for (User user : userList) {
				System.out.println(user);
			}

			// 事务提交
			transaction.commit();
		} catch (Exception e) {
			// 事务回滚
			transaction.rollback();
			e.printStackTrace();
		} finally {
			// 判断session对象是否为空 是否连接着数据库
			if (session != null) {
				if (session.isConnected()) {
					session.close();
				}
			}
		}
	}

上面的执行后的SQL语句就是

select * from user limit 0,2

好啦,这就是今天的所有内容,有什么疑问的可以在评论提出
觉得这篇文章有帮助的朋友,可以点个赞,你的支持,就是我写的动力,谢谢大家!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值