什么是hql
SQL:(Structured Query Language)结构化查询语言
HQL:(Hibernate Query Language) hibernate 查询语言
HQL查询的作用
Ø 能够查询出一个表中的所有数据及排序
Ø 能够使用where条件查询
Ø 使用select条件子查询
Ø 投影查询
Ø 聚集查询
Ø 分页查询
Ø 单记录查询
Ø 批量删除
Ø 批量更新
hibernate操作数据库几种方法:
1、SQL:写SQL语句,然后通过Hibernate把查询的数据赋予POJO
2、HQL:面向对象查询 (推荐用法)
3、Criteria:更加面向对象的查询方式
HQL(Hibernate query language)是一个面向对象的查询语言。
ü SQL:select * from sys_user; select和from是关键字,sys_user是表名
ü HQL:from User; from是关键字,User是类名
Hql语句执行的步骤
1、 创建Query对象
2、 给Hql语句参数赋值
3、 调用list或iterate方法执行查询
给Hql语句参数赋值的方法:
1:下标
public List listByTitle(String title){
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query query=session.createQuery("from News where title=?");
query.setString(0, title);
List list=query.list();
session.getTransaction().commit();
return list;
}
2:参数名
Hql语法
1、 hql语句除了类和属性外,其他单词不区分大小写
2、 查询表中所有的数据
public List list(){
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query query=session.createQuery("from News");
List list=query.list();
session.getTransaction().commit();
return list;
}
3、 条件查询
public List list(){
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query query=session.createQuery("from News where title='巴拿马'");
List list=query.list();
session.getTransaction().commit();
return list;
}
4、 投影查询(查询某几列)
public List getListTitle(){
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query query=session.createQuery("select title,content from News");
List list=query.list();
session.getTransaction().commit();
return list;
}
public static void main(String[] args) {
NewsTest nt=new NewsTest();
List list=nt.getListTitle();
for(int i=0;i<list.size();i++){
Object[] o=(Object[])list.get(i);
System.out.println(o[0]+"\t"+o[1]);
}
}
5、 聚集查询
public int count(){
int i=0;
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query query=session.createQuery("select count(*) from News");
i=(int)((Long)query.uniqueResult());
session.getTransaction().commit();
return i;
}
6、 模糊查询
a) like 模糊查询,% 匹配0—n个字符 _匹配一个字符
public List listByTitle(String title){
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query query=session.createQuery("from News where title like :title");
query.setParameter("title", "%"+title+"%");
List list=query.list();
session.getTransaction().commit();
return list;
}
7、 分页查询
//分页查询
//pageNumber当前页码号 pageSize每页显示条数
public List listByPageNumber(int PageNumber ,int pageSize){
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query query=session.createQuery("from News");
//设置起始位置下标 下标从0开始
query.setFirstResult((PageNumber-1)*pageSize);
//设置每页条数
query.setMaxResults(pageSize);
List list=query.list();
session.getTransaction().commit();
return list;
}
8、 单记录查询
使用uniqueResult来进行单记录查询 ,如果没有查询到数据返回null,如果查询出的数据条数大于1条,则抛出异常
public News getByQuery(String content){
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query query=session.createQuery("from News where content = ?");
News news=(News)query.uniqueResult();
session.getTransaction().commit();
return news;
}
9、 批量删除
public void deleteByTitle(String title){
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx=session.beginTransaction();
Query query=session.createQuery("delete from News where title=?");
query.setParameter(0, title);
try{
query.executeUpdate();
}catch(Exception e){
//事物回滚
tx.rollback();
}
tx.commit();
}
10、批量更新
//批量更新
public void updateByTitle(String title,String content){
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx=session.beginTransaction();
Query query=session.createQuery("update News set content=? where title=?");
query.setParameter(0, content);
query.setParameter(1, title);
try{
query.executeUpdate();
}catch(Exception e){
//事物回滚
tx.rollback();
}
tx.commit();
}
练习
1. 新建一张表雇员表,包含字段 :id、姓名、年龄、薪水(可通过hibernate映射建表)
create table News(
Id int(10),
name varchar(40),
age int(10),
Money int(10)
);
2. 批量新增20条数据
public void saveNews(News news) {
// 创建session对象
Session session = HibernateUtils.getSessionFactory()
.getCurrentSession();
// 开启事物
session.beginTransaction();
// 保存user
for (int i = 0; i < 9; i++) {
session.save(news);
}
// 提交事物
session.getTransaction().commit();
}
3. 查询一个表的所有信息
From News.
4. 查询年龄大于60岁的所有员工的信息
From news where age>60.
5. 查询年龄最大的员工信息和最小员工的信息
select max(age) ,min(age) from news.
6. 查询用户名包含5的所有员工的信息
From News where name like “%5%”.
7. 名字以0结尾的所有员工信息
From News where name like “%0”.
8. 查询名字以a开头的所有员工信息
From News where name like “a%”.
9. 查询所有用户的名字(不要其他信息)
Select name from News.
10. 查询所有用户的名字和主键id(不要其他信息)
Select name,id from News.
11. 查询年龄大于指定年龄的所有用户信息
From News where age>?.
12. 查询年龄大于指定年龄的所有用户信息(采用命名参数的方式给HQL语句传值)
Query query=session。createQuery(“from News where age>?”);
13. 查询所有雇员的平均年龄
Select avg(*) from News.
14. 查询最大最小年龄的平均值
Select avg(max(*),min(*)) from News.
15. 查询雇员的总数量(使用uniqueResult)
public News getByQuery(String content){
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query query=session.createQuery("select count(*) from News");
News news=(News)query.uniqueResult();
session.getTransaction().commit();
return news;
}
16. 查询所有雇员的最小、最大年龄和年龄的总和
Select count(max(age),min(age),age) from News.
17. 分页查询(查询雇员:从5开始,最多找出8个雇员详细信息)
/分页查询
//pageNumber当前页码号 pageSize每页显示条数
public List listByPageNumber(int PageNumber ,int pageSize){
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query query=session.createQuery("from News");
//设置起始位置下标 下标从0开始
query.setFirstResult((PageNumber-1)*pageSize);
//设置每页条数
query.setMaxResults(pageSize);
List list=query.list();
session.getTransaction().commit();
return list;
}
18. 删除所有年龄小于18岁的雇员
Delete from News where age<18.
19. 给所有雇员的年龄+1
Update News set age=age+1.
什么是hql
SQL:(Structured Query Language)结构化查询语言
HQL:(Hibernate Query Language) hibernate 查询语言
HQL查询的作用
Ø 能够查询出一个表中的所有数据及排序
Ø 能够使用where条件查询
Ø 使用select条件子查询
Ø 投影查询
Ø 聚集查询
Ø 分页查询
Ø 单记录查询
Ø 批量删除
Ø 批量更新
hibernate操作数据库几种方法:
1、SQL:写SQL语句,然后通过Hibernate把查询的数据赋予POJO
2、HQL:面向对象查询 (推荐用法)
3、Criteria:更加面向对象的查询方式
HQL(Hibernate query language)是一个面向对象的查询语言。
ü SQL:select * from sys_user; select和from是关键字,sys_user是表名
ü HQL:from User; from是关键字,User是类名
Hql语句执行的步骤
1、 创建Query对象
2、 给Hql语句参数赋值
3、 调用list或iterate方法执行查询
给Hql语句参数赋值的方法:
1:下标
public List listByTitle(String title){
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query query=session.createQuery("from News where title=?");
query.setString(0, title);
List list=query.list();
session.getTransaction().commit();
return list;
}
2:参数名
Hql语法
1、 hql语句除了类和属性外,其他单词不区分大小写
2、 查询表中所有的数据
public List list(){
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query query=session.createQuery("from News");
List list=query.list();
session.getTransaction().commit();
return list;
}
3、 条件查询
public List list(){
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query query=session.createQuery("from News where title='巴拿马'");
List list=query.list();
session.getTransaction().commit();
return list;
}
4、 投影查询(查询某几列)
public List getListTitle(){
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query query=session.createQuery("select title,content from News");
List list=query.list();
session.getTransaction().commit();
return list;
}
public static void main(String[] args) {
NewsTest nt=new NewsTest();
List list=nt.getListTitle();
for(int i=0;i<list.size();i++){
Object[] o=(Object[])list.get(i);
System.out.println(o[0]+"\t"+o[1]);
}
}
5、 聚集查询
public int count(){
int i=0;
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query query=session.createQuery("select count(*) from News");
i=(int)((Long)query.uniqueResult());
session.getTransaction().commit();
return i;
}
6、 模糊查询
a) like 模糊查询,% 匹配0—n个字符 _匹配一个字符
public List listByTitle(String title){
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query query=session.createQuery("from News where title like :title");
query.setParameter("title", "%"+title+"%");
List list=query.list();
session.getTransaction().commit();
return list;
}
7、 分页查询
//分页查询
//pageNumber当前页码号 pageSize每页显示条数
public List listByPageNumber(int PageNumber ,int pageSize){
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query query=session.createQuery("from News");
//设置起始位置下标 下标从0开始
query.setFirstResult((PageNumber-1)*pageSize);
//设置每页条数
query.setMaxResults(pageSize);
List list=query.list();
session.getTransaction().commit();
return list;
}
8、 单记录查询
使用uniqueResult来进行单记录查询 ,如果没有查询到数据返回null,如果查询出的数据条数大于1条,则抛出异常
public News getByQuery(String content){
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query query=session.createQuery("from News where content = ?");
News news=(News)query.uniqueResult();
session.getTransaction().commit();
return news;
}
9、 批量删除
public void deleteByTitle(String title){
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx=session.beginTransaction();
Query query=session.createQuery("delete from News where title=?");
query.setParameter(0, title);
try{
query.executeUpdate();
}catch(Exception e){
//事物回滚
tx.rollback();
}
tx.commit();
}
10、批量更新
//批量更新
public void updateByTitle(String title,String content){
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx=session.beginTransaction();
Query query=session.createQuery("update News set content=? where title=?");
query.setParameter(0, content);
query.setParameter(1, title);
try{
query.executeUpdate();
}catch(Exception e){
//事物回滚
tx.rollback();
}
tx.commit();
}
练习
1. 新建一张表雇员表,包含字段 :id、姓名、年龄、薪水(可通过hibernate映射建表)
create table News(
Id int(10),
name varchar(40),
age int(10),
Money int(10)
);
2. 批量新增20条数据
public void saveNews(News news) {
// 创建session对象
Session session = HibernateUtils.getSessionFactory()
.getCurrentSession();
// 开启事物
session.beginTransaction();
// 保存user
for (int i = 0; i < 9; i++) {
session.save(news);
}
// 提交事物
session.getTransaction().commit();
}
3. 查询一个表的所有信息
From News.
4. 查询年龄大于60岁的所有员工的信息
From news where age>60.
5. 查询年龄最大的员工信息和最小员工的信息
select max(age) ,min(age) from news.
6. 查询用户名包含5的所有员工的信息
From News where name like “%5%”.
7. 名字以0结尾的所有员工信息
From News where name like “%0”.
8. 查询名字以a开头的所有员工信息
From News where name like “a%”.
9. 查询所有用户的名字(不要其他信息)
Select name from News.
10. 查询所有用户的名字和主键id(不要其他信息)
Select name,id from News.
11. 查询年龄大于指定年龄的所有用户信息
From News where age>?.
12. 查询年龄大于指定年龄的所有用户信息(采用命名参数的方式给HQL语句传值)
Query query=session。createQuery(“from News where age>?”);
13. 查询所有雇员的平均年龄
Select avg(*) from News.
14. 查询最大最小年龄的平均值
Select avg(max(*),min(*)) from News.
15. 查询雇员的总数量(使用uniqueResult)
public News getByQuery(String content){
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query query=session.createQuery("select count(*) from News");
News news=(News)query.uniqueResult();
session.getTransaction().commit();
return news;
}
16. 查询所有雇员的最小、最大年龄和年龄的总和
Select count(max(age),min(age),age) from News.
17. 分页查询(查询雇员:从5开始,最多找出8个雇员详细信息)
/分页查询
//pageNumber当前页码号 pageSize每页显示条数
public List listByPageNumber(int PageNumber ,int pageSize){
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query query=session.createQuery("from News");
//设置起始位置下标 下标从0开始
query.setFirstResult((PageNumber-1)*pageSize);
//设置每页条数
query.setMaxResults(pageSize);
List list=query.list();
session.getTransaction().commit();
return list;
}
18. 删除所有年龄小于18岁的雇员
Delete from News where age<18.
19. 给所有雇员的年龄+1
Update News set age=age+1.