发表于: 2017-11-12 17:31:41
1 879
一.今天完成的主要事情
1.继续学习Hibernate的相关知识
主要学习了Hibernate的HQL查询语句和QBC查询方式
HQL查询是一种类SQL查询,也是Hibernate官方推荐的查询方式,这种查询方式要求要对SQL语句比较熟悉
一个完整的的HQL查询语句包括select/update/delete...from...where...group by...order by desc/asc
from后面跟具体的类名,where后面可以跟各种sql表达式,HQL查询都是支持的
而且HQL支持更新/删除时直接操作,而不是先查询,再操作
比如:update User user set user.age=20 where user.age = 18,delete也是一样的
这样,提高了update和delete的性能,也避免了脏读的风险
2.在demo中实现用HQL执行更为复杂的操作
代码如下:
//根据page,size查询IdList
public List<Long> queryUserIdsList(Integer page, Integer size) {
Session session = sessionFactory.openSession();
Query query = session.createQuery("select user.id from com.ptteng.hibernate.spring.demo.model.User user");
//设置查询的结果集长度
query.setFirstResult(page);
query.setMaxResults(size);
List<Long> list = query.list();
session.close();
return list;
}
//根据IdList批量查询对象List
public List<User> queryUserListByIds(List<Long> userIds) {
Session session = sessionFactory.openSession();
//创建sql,参数名绑定
String sql = "select * from demo where id in (:id)";
Map<String, List<Long>> map = new HashMap<String, List<Long>>();
map.put("id", userIds);
SQLQuery sqlQuery = session.createSQLQuery(sql).addEntity(User.class);
if (map != null && map.size() > 0) {
for (Map.Entry<String, List<Long>> entry : map.entrySet()) {
sqlQuery.setParameterList(entry.getKey(), entry.getValue());
}
}
return sqlQuery.list();
}
//根据cellphone字段获取IdList(条件查询)
public List<Long> getUserIdsByCellphone(String cellphone, Integer page, Integer size) {
Session session = sessionFactory.openSession();
String hql = "select id from com.ptteng.hibernate.spring.demo.model.User where cellphone=?";
Query query = session.createQuery(hql);
//参数绑定,参数位置绑定
query.setParameter(0, cellphone);
query.setFirstResult(page);
query.setMaxResults(size);
return query.list();
}
//根据cellphone字段获取IdList,并且根据username倒序排序(条件查询带排序)
public List<Long> getUserIdsByCellphoneAndOrderByUsername(String cellphone, Integer page, Integer size, String way) {
Session session = sessionFactory.openSession();
if (!way.equals("desc") && !way.equals("asc")){
return null;
}
String hql = "select id from com.ptteng.hibernate.spring.demo.model.User where cellphone=? order by username " + way;
Query query = session.createQuery(hql);
//参数位置绑定
query.setParameter(0, cellphone);
query.setFirstResult(page);
query.setMaxResults(size);
return query.list();
}
//查询List中若干字段
public List<Object[]> queryUserPartFieldList(List<String> parameters) {
Session session = sessionFactory.openSession();
String hql = "select ";
for (int i = 0; i < parameters.size(); i++) {
hql += parameters.get(i);
if (i != parameters.size() - 1) {
hql += ",";
}
}
hql += " from com.ptteng.hibernate.spring.demo.model.User";
List<Object[]> list = session.createQuery(hql).list();
session.close();
return list;
}
HQL的参数绑定有多种方式:
第一,参数名绑定, 如(from User where username=:name), 设置参数时为query.setString(name, "zhangsan");
第二,参数位置绑定, 如(from User where username=? and cllphone=?),
设置参数时为query.setParameter(0, "zhangsan");query.setParameter(1, "13500000000");
第三,setParameter()方法,绑定任意类型的参数
如(from User where username=:name and cellphone=?)
设置参数为query.setParameter("username", name, Hibernate.STRING);
第四,setProperties()方法,绑定命名参数和对象属性
3.QBC查询方式
QBC是标准化查询方式,这种查询方式不用写任意一条sql语句就可以查询出数据,是完完全全的面向对象的思想实现.
它的优点是不用对sql语句有太多的了解,取点是比较繁琐,因为所有的参数都要通过参数拼装的方式拼接起来
所以,一般情况下,我们还是使用HQL方式查询
这种方式有两点好处,一是方便优化数据库性能,二是防止了sql注入
二.明天计划完成的事情
Hibernate到此一些基础的内容就算学完了,明天开始研究Struts2框架,等后续将这些框架的基础用法都掌握之后,再对这些框架进行深入的进一步的学习
三.遇到的问题
暂无
四.收获
以上
五.项目进度情况
现在后台已经完全写好了,就剩下前台的请求,应该快了吧
评论