一、通用方法的抽取实现
由于hibernate中对增删改查的一切操作都是面向对象的,所以将增删改查抽取成通用方法,以满足不同的表的增删改查操作,简化jdbc代码。
具体例子如下:
  1. package cn.itcast.hibernate;
  2. import java.io.Serializable;
  3. import org.hibernate.Session;
  4. import org.hibernate.SessionFactory;
  5. import org.hibernate.Transaction;
  6. import org.hibernate.cfg.Configuration;
  7. /*
  8. * 想让初始化创建只执行一次
  9. * 方式1:单例模式
  10. * 方式2: 静态语句块等
  11. *
  12. * 由于只想让初始化执行一次,不想让其他类继承所以此类用final修饰,不想被其他类初始化所以默认构造用private修饰,由于在静态语句块中所以加static
  13. *
  14. *
  15. */
  16. public final class HIbernateUtil {
  17. private static SessionFactory sessionfactory;
  18. private HIbernateUtil(){
  19. }
  20. /**
  21. * 细节1:Configuration:是一个配置类
  22. * Configuration的对象会找hibernate.cfg.xml,完成hibernate的初始化
  23. *
  24. * 细节2:hibernate的配置文件有两种hibernate.cfg.xml和hibernate.properties
  25. * 两种存在一种即可,当然如果都存在的话,hibernate.cfg.xml中的配置信息会覆盖hibernate.properties的配置信息
  26. *
  27. * 细节3:初始化工作只尽量只初始化一次,耗时
  28. */
  29. static {
  30. Configuration cfg = new Configuration();
  31. cfg.configure();
  32. //cfg.configure("filename"); 可以通过filename来指定配置文件的位置和配置文件名(如果不在默认classpath的位置下)
  33. //所用的src下的文件都会经行编译,最后字节码文件在classpath下,bin是classpath下的一部分
  34. sessionfactory = cfg.buildSessionFactory();
  35. }
  36. /*
  37. * 创建出对象,通过getter方法方便外接使用
  38. *
  39. */
  40. public static SessionFactory getSessionfactory() {
  41. return sessionfactory;
  42. }
  43. /**
  44. * 此session包为org.hibernate.Session;
  45. * @return
  46. * 定义方法返回session,session你可以理解为jdbc的数据库连接
  47. */
  48. public static Session getSession(){
  49. return sessionfactory.openSession();
  50. }
  51. /**
  52. * 通用保存方法
  53. * @param entity
  54. */
  55. public static  void add(Object entity){
  56. Session s = null;
  57. Transaction tx = null;
  58. try {
  59. s=HIbernateUtil.getSession();
  60. tx = s.beginTransaction();
  61. s.save(entity);
  62. tx.commit();
  63. } finally {
  64. if(s!=null){
  65. s.close();
  66. }
  67. }
  68. }
  69. /**
  70. * 通用更新方法
  71. * @param entity
  72. */
  73. public static  void update(Object entity){
  74. Session s = null;
  75. Transaction tx = null;
  76. try {
  77. s=HIbernateUtil.getSession();
  78. tx = s.beginTransaction();
  79. s.update(entity);
  80. tx.commit();
  81. } finally {
  82. if(s!=null){
  83. s.close();
  84. }
  85. }
  86. }
  87. /**
  88. * 通用删除方法
  89. * @param entity
  90. */
  91. public static  void delete(Object entity){
  92. Session s = null;
  93. Transaction tx = null;
  94. try {
  95. s=HIbernateUtil.getSession();
  96. tx = s.beginTransaction();
  97. s.delete(entity);
  98. tx.commit();
  99. } finally {
  100. if(s!=null){
  101. s.close();
  102. }
  103. }
  104. }
  105. /**
  106. * 通用根据ID查询方法
  107. * @param entity
  108. */
  109. public static  Object get(Class clazz,Serializable id){
  110. Session s = null;
  111. try {
  112. s=HIbernateUtil.getSession();
  113. Object obj = s.get(clazz, id);
  114. return obj;
  115. } finally {
  116. if(s!=null){
  117. s.close();
  118. }
  119. }
  120. }
  121. }

二、HQL(Hibernate Query Language)

面向对象的查询语句,与sql不同,HQL中的对象名是区分大小写的(除了java类和属性其他部分不区分大小写);HQL中查的是对象而不是和表,并且支持多态;
HQL主要通过Query来操作,QUery的创建方式:
Query q = session.createQuery(hql);
from Person
from User user where user.name = :name
from User user where user.name = :name and user.birthday <:birthday
 
 
sql查的是表,HQL查的是对象!
hibernate一切都是从对象出发,hql就是按照对象来查而不是表
  1. package cn.itcast.hibernate;
  2. import java.util.Date;
  3. import java.util.List;
  4. import org.hibernate.Query;
  5. import org.hibernate.Session;
  6. import cn.itcast.hibernate.domain.User;
  7. public class QueryTest {
  8. /**
  9. * 使用HQL根据name查询方法
  10. * @param entity
  11. */
  12. public static void Query(String name){
  13. Session s = null;
  14. try {
  15. s=HIbernateUtil.getSession();
  16. //HQL:
  17. //这里的from后面跟的不是表名,而是对象名(类名)
  18. String hql = "from User as user where user.name=?"; //from Object 支持多态度
  19. Query query = s.createQuery(hql);
  20. query.setString(0, name);
  21. List<User> list=query.list(); //executQuery();
  22. for(User user:list){
  23. System.out.print(user.getName());
  24. }
  25. //如果确定数据最多只有一条,可以使用一下的方法简化代码
  26. User u= (User)query.uniqueResult();
  27. System.out.print("只有一条数据"+u.getName());
  28. } finally {
  29. if(s!=null){
  30. s.close();
  31. }
  32. }
  33. }
  34. /**
  35. * @param args
  36. */
  37. public static void main(String[] args) {
  38. User user = new User();
  39. user.setName("name");
  40. user.setBirthday(new Date());
  41. HIbernateUtil.add(user);
  42. Query(user.getName());
  43. }
  44. }

String hql = "from Users as users where users.name = ?";切记用对象不要用表名

注意这句 users是Users的别名,

User是类名,不能直接使用User.name(不能通过类来访问,就好像你不能通过类名去访问实例变量一样。 
通常会用别名的方式解决,比如 
from Users as users where users.name = ?(别名就好像是test类的一个对象,通过对象就可以访问实例变量)

当然,仅对一个类进行操作,也可以不借助于别名: 
from Users where name = 'sdf'

还可以用query.uniqueResult();用来返回单一的查询结果,务必确保查询结果唯一。

hibernate学习笔记4---HQL、通用方法的抽取实现的更多相关文章

  1. Hibernate学习笔记(十) — HQL查询

    一.HQL的一对多查询 班级(1)->(多)学生 /** * 实现Classes与Student的内连接 * * SELECT c.*,s.* * from classes c INNER JO ...

  2. Hibernate学习笔记-Hibernate HQL查询

    Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...

  3. Hibernate学习笔记(二)

    2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...

  4. Hibernate学习笔记(一)

    2016/4/18 19:58:58 Hibernate学习笔记(一) 1.Hibernate框架的概述: 就是一个持久层的ORM框架. ORM:对象关系映射.将Java中实体对象与关系型数据库中表建 ...

  5. J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate())

    J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate())   当我们使用Hibernate进行数据的CRUD操作时,利用模版进行操作不失为一种方法. ...

  6. Hibernate 学习笔记一

    Hibernate 学习笔记一 今天学习了hibernate的一点入门知识,主要是配置domain对象和表的关系映射,hibernate的一些常用的配置,以及对应的一个向数据库插入数据的小例子.期间碰 ...

  7. 【python学习笔记】9.魔法方法、属性和迭代器

    [python学习笔记]9.魔法方法.属性和迭代器 魔法方法:xx, 收尾各有两个下划线的方法 __init__(self): 构造方法,创建对象时候自动执行,可以为其增加参数, 父类构造方法不会被自 ...

  8. Java8学习笔记(八)--方法引入的补充

    在Java8学习笔记(三)--方法引入中,简要总结了方法引入时的使用规则,但不够完善.这里补充下几种情况: 从形参到实例方法的实参 示例 public class Example { static L ...

  9. [原创]java WEB学习笔记90:Hibernate学习之路-- -HQL检索方式,分页查询,命名查询语句,投影查询,报表查询

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

随机推荐

  1. std::vector<Channel2*> m_allChannels;容器,以及如何根据channelid的意义

    std::vector<Channel2*> m_allChannels;容器,以及如何根据channelid的意义 这个容器保存了所有客户端连接的channel Channel2* Li ...

  2. 浅谈ASP.NET报表控件

    OWC似乎使用者居多,但看见有网友在帖中抱怨OWC在使用时需要许可证书,于是将其排除,我可不想BOSS在看报表时弹出一个“没有许可证书”的窗口. 接着找到了ComponentOne的Web chart ...

  3. 全自动化的 Android 编译管线

    [编者按]Nicolas Frankel 是 hybris 的高级顾问, 在Java / J2EE 领域拥有超过10年的管理经验,本文阐述了他在使用自动化工序去构建 Android 应用程序遇到的一些 ...

  4. iOS打电话,发短信,发邮件,打开网址

    //调用自带mail [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://admin@hzl ...

  5. POJ 2533 Longest Ordered Subsequence

    题目描述:LIS(Longest Increasing Subsequence)模板题 分析:O(n^2)的方法 状态表示:d[i]表示以i结尾的最长上升子序列长度 转移方程:d[i]=max{ 1, ...

  6. ExtJs之Field.Trigger和Field.Spinner

    作文本框功能的. <!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta h ...

  7. (0)图像处理opengl 写在前面的话

    项目2,终于要开始了 很多波折,都不想说了 开始吧 以下内容参考网上资料 OpenGL(Open Graphics Library)是一个跨编程语言.跨平台的专业图形程序接口. OpenGL是SGI公 ...

  8. WinDbg调试流程的学习及对TP反调试的探索

    基础知识推荐阅读<软件调试>的第十八章 内核调试引擎 我在里直接总结一下内核调试引擎的几个关键标志位,也是TP进行反调试检测的关键位. KdPitchDebugger : Boolean ...

  9. 03 - Oracle文件概述

    构成Oracle数据库的8种文件类型. 可以把这些文件分成以下几类. Instance相关 参数文件 parameter, initOra file, spfile 跟踪文件 trace file 警 ...

  10. loadrunner之Paramater在负载测试中的数据生成规则

    前段时间在做性能测试的时候,基于业务的需求,使用到了Unique Number的参数类型. 脚本的业务是注册以alien开头,后面接数字的用户帐号,填写相关帐号信息.提交企业信息进行审核. 其中用户帐 ...