一、通用方法的抽取实现
由于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();用来返回单一的查询结果,务必确保查询结果唯一。

最新文章

  1. BPM实例分享——日期自动计算
  2. HoverTree项目已经实现分层
  3. Liunx-https-java.lang.NoClassDefFoundError: javax/crypto/SunJCE_b
  4. js中this的理解
  5. linux下C语言获取微秒级时间
  6. spark性能调优:资源优化
  7. PAT Ranking (排名)
  8. openwrt network interface(openwrt中的网络接口)
  9. androidHandler讲解
  10. My way to Python - Day02
  11. poj 1966 Cable TV Network 顶点连通度
  12. 好公司、行业、领导?应届生应根据什么选offer?
  13. ThinkServer TD340服务器安装操作系统[转]
  14. Numpy - 多维数组(上)
  15. OpenCV Python教程(1、图像的载入、显示和保存)
  16. inner join 与 left join 之间的区别
  17. 哎呀,我老大写Bug啦——记一次MessageQueue的优化
  18. Complex类的实现
  19. 关于SVD
  20. hdu4622(hash解法)

热门文章

  1. 偶然发现的一个地图网站mapbox
  2. POJ 2109
  3. Visual Studio 快捷键
  4. ExtJs之 Ext.JSON
  5. poj 3328(多起点多终点的最短路)
  6. js小技巧(二)
  7. Newtonsoft.Json.dll
  8. 关于WII光枪定位的设计(转)
  9. lintcode:带环链表
  10. python 详解re模块