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