一、通用方法的抽取实现
由于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. 项目分析(PLUG)

    plug过程 .INIT_PLUG #define INIT_PLUG Plug::InitPlug g_InitPlug(true); //共享内存数据结构 struct PlugShareMemo ...

  2. Java多线程程序设计详细解析

    一.理解多线程 多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立. 线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线 ...

  3. 小圣求职记B:总集篇

    1. 搜狐sohu 搜狐在正式招聘前邀请了部分应聘者到武汉研发中心开座谈会(因此简历尽量早投,机会多些),有研发的也有产品的,40人左右,座谈会期间介绍了搜狐汽车.北京研发中心.武汉研发中心和搜狐媒体 ...

  4. 安装WINCC6.0的步骤

    安装WINCC6.0/6.2的步骤 (XP不能是HOME版的!!!) 1.    首先安装SQL FOR WINCC6.0/6.2这个软件(如果你的系统已安装此软件相关版本可能提示安装失败请卸载后再重 ...

  5. http status 汇总

    http status 汇总 常见HTTP状态码 200 OK 301 Moved Permanently 302 Found 304 Not Modified 307 Temporary Redir ...

  6. POJ 2591 1338 2545 2247(数列递归衍生问题,思路挺妙)

    四道题的难度: 2591<1338<2545<2247 POJ 2591 Set Definition: 这是从discuss里看来的,写的挺好,直接copy,根据我的代码稍有改动( ...

  7. Activity学习(二)——生命周期

    一.什么是Activity? 简单的说:Activity就是布满整个窗口或者悬浮于其他窗口上的交互界面.在一个应用程序中通常由多个Activity构成,都会在Manifest.xml中指定一个主的Ac ...

  8. poj 2449(A*求第K短路)

    题目链接:http://poj.org/problem?id=2449 思路:我们可以定义g[x]为源点到当前点的距离,h[x]为当前点到目标节点的最短距离,显然有h[x]<=h*[x](h*[ ...

  9. Linux静态库和动态库

    Linux 工具 ❑ GCC: The GNU Compiler Collection, containing the GNU C compiler❑ G++: A C++ compiler, inc ...

  10. Log4net学习

    转自:http://www.cnblogs.com/sirkevin/archive/2012/06/13/2548449.html Log4net简介根据日志类别保存到不同的文件,并按照日期生成不同 ...