最近太懒,没怎么学习,更新一点最近学习内容.
第1章.课程介绍
课程内容
- 了解HQL
- 准备查询
- 查询子句
查询子句
检索对象—from子句
选择—select子句
限制—where子句
排序—order by子句
学习目标
- 了解HQL定义以及HQL语句形式
- 掌握Query对象的使用
- 能够编写出符合数据查询要求的HQL语句
第2章.了解HQL
本章内容
1.HQL定义
2.HQL语句形式
3.初学HQL需要注意的问题
一 HQL定义
1.Hibernate Query Language,Hibernate查询语言
2.HQL是面向对象的查询语句
HQL:映射配置的持久化类及其属性
SQL:数据库表
3.HQL提供了丰富灵活的查询特性,hibernate官方推荐查询方式
二 HQL语句形式
select...from...where...group by...having...order by...
三 初学HQL需要注意的问题
- HQL是面向对象的查询语言,对Java类与属性大小敏感
HQL与SQL形式相似,本质不同
- HQL对关键字不区分大小写
select...from...where...group by...having...order by...
第3章.准备查询
本章内容
1.org.hibernate.Query接口
2. Query实例的创建
3.执行查询
一 Query接口简介
org.hibernate.Query接口
1.Query接口定义有执行查询的方法
2.Query接口支持方法链编程风格,使得程序代码更为简洁
二 Query实例创建
1.Session的createQuery()方法创建Query实例
2.createQuery方法包含一个HQL语句参数, cerateQuery(hql)
Query执行查询
1.Query接口的list()方法执行HQL查询
2.list()方法返回结果数据类型为java.util.List , List集合中存放符合查询条件的持久化对象
三 Query接口应用编程示例——数据库分析
字段名 | 字段描述 | 数据类型 |
ID | 主键 | int |
name | 商家名称 | varchar |
tel | 电话 | varchar |
address | 地址 | varchar |
wesite | 商家网站 | varchar |
star | 商家星级 | varchar |
business | 经营范围 | varchar |
商家表(Seller)
字段名 | 字段描述 | 数据类型 |
ID | 主键 | int |
name | 姓名 | varchar |
tel | 电话 | varchar |
address | 地址 | varchar |
| 电子邮箱 | varchar |
sex | 性别 | varchar |
description | 简介 | varchar |
age | 年龄 | int |
birthday | 生日 | date |
客户表(Customer)
字段名 | 字段描述 | 数据类型 |
ID | 主键 | int |
name | 商品名称 | varchar |
price | 价格 | double |
util | 计量单位 | varchar |
category | 商品分类 | varchar |
description | 商品简介 | varchar |
seller | 所属商家 | int |
商品表(Commodity)
字段名 | 字段描述 | 数据类型 |
ID | 主键 | int |
customer | 所属客户 | int |
tradedate | 交易日 | date |
status | 订单状态 | varchar |
amount | 订单金额 | double |
订单表(OrderForm)
字段名 | 字段描述 | 数据类型 |
ID | 主键 | int |
orderid | 所属订单 | int |
commodity | 订单商品 | int |
discount | 订单折扣 | double |
actprice | 成交价格 | double |
amount | 订单数量 | double |
订单明细表(OrderItem)
四 Query接口应用编程示例——代码实现
项目结构:
持久化类代码:略。
session工厂类代码:略
查询关键代码:
@Test
public void testFromClause(){
String hql = " from Seller s ";
Query query = session.createQuery(hql);
List<Seller> sellers = query.list();
for(Seller seller : sellers){
System.out.println("name:"+seller.getName());
}
}
@Before
public void setUp() throws Exception {
session = HibernateSessionFactory.getCurrentSession();
}
@After
public void tearDown() throws Exception {
session.close();
}
第4章.查询对象—from子句
1.from子句
2.from子句中持久化类的引用
3.别名的使用
一 from子句
- HQL语句最简形式
- from指定了HQL语句查询主体——持久化类及其属性
二 from子句中持久化类的引用
- 不需要引入持久化类的全限定名,直接引入类名
- auto-import(自动引入)缺省情况
三 别名的使用
- 为被查询类指定别名
- 在HQL 语句其他部分通过别名引用该类
- 别名命名习惯
如:from Seller
别名: seller
单字母:s
第5章 选择select子句
本章内容
1.以object[]形式返回选择的属性
2.以List形式返回选择的属性
3.以map形式返回选择的属性
4.以自定义类型返回选择的属性
5.获取独特的结果——distinct关键字
一 以object[]形式返回选择的属性
当返回结果为多个属性时
public void testSelectClauseObjectArray(){
String hql = " select s.name,s.tel,s.address,s.star from Seller s ";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
for(Object obj[] : list){
System.out.println("name:"+obj[0]);
System.out.println("tel:"+obj[1]);
System.out.println("address:"+obj[2]);
System.out.println("star:"+obj[3]);
}
}
当返回结果为一个属性时
@Test
public void testSelectClauseObjectArray(){
String hql = " select c.name from Customer c ";
Query query = session.createQuery(hql);
List<Object> list = query.list();
for(Object objs : list){
System.out.println("name:"+objs);
}
}
二 以List形式返回选择的属性
- select子句中使用new list指定
如:select new list(s.name,s.tel,s.address)from Seller s;
@Test
public void testSelectClauseList(){
String hql = " select new list(s.name,s.tel,s.address) from Seller s ";
Query query = session.createQuery(hql);
List<List> lists = query.list();
for(List list : lists){
System.out.println("name : "+list.get(0));
System.out.println("tel:"+list.get(1));
System.out.println("address:"+list.get(2));
}
}
三 以map形式返回
- select子句中使用new map 指定
- key值为索引值,字符串类型,默认为序号,还可以用别名获取
如:select new map(s.name,s.tel,s.address)from Seller s;
select new map(s.name as name,s.tel as tel,s.address as address)from Seller s;
select new map(s.name as name,s.tel as tel,s.address as address)from Seller s;
@Test
public void testSelectClauseMap(){
String hql = " select new map(s.name,s.tel,s.address) from Seller s ";
Query query =session.createQuery(hql);
List<Map> maps = query.list();
for(Map map : maps){
System.out.println("name:"+map.get("0"));
System.out.println("tel:"+map.get("1"));
System.out.println("address:"+map.get("2"));
}
}
四 以自定义类型返回选择的属性
如:select new seller(s.name,s.tel,s.address)from Seller s;
@Test
public void testSelectClauseSelf(){
String hql = " select new Seller(s.name,s.tel,s.address) from Seller s ";
Query query = session.createQuery(hql);
List<Seller> sellers = query.list();
for(Seller seller : sellers){
System.out.println("name: "+seller.getName());
System.out.println("tel:"+seller.getTel());
System.out.println("address:"+seller.getAddress());
}
}
五distinct关键字
- 使用distinct关键字去除查询结果中的重复元素
如:select distinct sex c.sex from Customer c;
@Test
public void testDistinct(){
String hql = "select distinct c.sex from Customer c ";
Query query = session.createQuery(hql);
List<Object> list = query.list();
for(Object obj : list){
System.out.println(obj);
}
}
第6章 限制——where子句
本章内容
1.比较运算
2.范围运算
3.字符串模式匹配
4.逻辑运算
5.集合运算
6.在HQL中使用+-×/运算符
7.查询单个对象(uniqueResult方法)
一 比较运算
1.=,<>,<,>,>=,<=
2.null值判断—is [not] null
@Test
public void testWhere1(){
String hql = " from Commodity c where c.price<=200 ";
Query query = session.createQuery(hql);
List<Commodity> commodities = query.list();
for(Commodity c : commodities){
System.out.println("name:"+c.getName());
System.out.println("price:"+c.getPrice());
}
}
二 null值判断运算
三 范围运算
1.[not] in (列表)
2.[not] between 值1 and 值2
@Test
public void testWhere2(){
String hql = " from Customer c where c.age not between 20 and 40 ";
Query query = session.createQuery(hql);
List<Customer> customers = query.list();
for(Customer c: customers){
System.out.println("name:"+c.getName());
System.out.println("age:"+c.getAge());
}
}
四 字符串模式匹配
- like关键字
- 通配符%,_
%:任意个字符
_:一个字符
@Test
public void testWhere3(){
String hql = " from Customer c where c.address like '%北京%'";
Query query = session.createQuery(hql);
List<Customer> customers = query.list();
for(Customer c : customers){
System.out.println("name:"+c.getName());
System.out.println("address :"+ c.getAddress());
}
}
五 逻辑运算
- and(逻辑与),or(逻辑或)
- not(逻辑非)
@Test
public void testWhere2(){
String hql = " from Commodity c where c.price between 1000 and 5000 and c.category like '%电脑%' or name like '%电子%' ";
Query query = session.createQuery(hql);
List<Commodity> commodities = query.list();
for(Commodity c : commodities){
System.out.println("name:"+c.getName());
System.out.println("category:"+c.getCategory());
System.out.println("price:"+c.getPrice());
}
}
六 集合运算
- is [not] empty 集合[不]为空,不包含任何元素
- member of 元素属于集合
@Test
public void testWhere1(){
String hql = " from Order o where o.orderItems is not empty ";
Query query = session.createQuery(hql);
List<Order> orders = query.list();
for(Order order : orders){
System.out.println(order.getCustomer().getName());
System.out.println(order.getAmount());
System.out.println(order.getTradeDate());
}
}
七 在HQL中使用+-×/运算符
- HQL语句中也可以使用+-×/四则运算
- 四则运算可以在where子句和select子句使用
@Test
public void testWhere4(){
String hql = " from Commodity c where c.price*5>3000 ";
Query query = session.createQuery(hql);
List<Commodity> commodities = query.list();
for(Commodity c : commodities){
System.out.println("name:"+c.getName());
System.out.println("price:"+c.getPrice()*5);
}
}
八 查询单个对象(uniqueResult方法)
1.Query接口的uniqueResult方法
2.where子句条件的设置
@Test
public void testWhere4(){
String hql = " from Customer c where c.age>20 ";
Query query = session.createQuery(hql);
Customer c = (Customer)query.uniqueResult();
System.out.println(c.getName());
}
第7章 排序—order by子句
本章内容
1.使用order by子句对查询结果排序
1)升序排序asc
2)降序排序desc
@Test
public void testOrderby(){
String hql = " from Commodity order by seller.id asc,price desc,name asc ";
Query query = session.createQuery(hql);
List<Commodity> commodities = query.list();
for(Commodity c : commodities){
System.out.println("name:"+c.getName());
System.out.println("price:"+c.getPrice());
}
}
课程总结
1.HQL语句形式
2.HQL语句大小写敏感,特别是持久化类及其属性的大小写
3.别名的使用
4.select子句使用自定义类返回选择属性,持久化类构造器处理