`
2277259257
  • 浏览: 515357 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Hibernate------增删改查-----1

 
阅读更多

Hibernate的应用步骤:

1、导入.jar包

2、创建  entryBean <===bean.hbm.xml===>bean表     + hibernate.cfg.xml配置文件

3、写DAO数据操作类(类似下面的)

 

Hibernate框架实例化方法:

通过写实例化代码(非通过web.xml配置,通过web容器实例化)

public class HibernateUtils {
 private static Configuration conf;
 private static SessionFactory factory;
 // conf 对象只要加载一次就可以了,如果放入 openSession 方法中效率会降低
 static {
  conf = new Configuration();//调用 Hibernate 的 API,用于装载 Hibernate 配置文件
  conf.configure();//在类路径中装载默认的配置文件 hibernate.cfg.xml,如果配置文件关联了映射文件,同时也装载了映射信息
//  conf.configure(new File("hibernate.cfg.xml"));//如果装载指定的配置文件
  factory = conf.buildSessionFactory();//创建 SessionFactory
 }

 public static Session openSession() {
  return factory.openSession();//创建 Session(Hibernate 提供的访问接口)
 }
}

 

 

1:Hibernate的insert操作

        Session session = HibernateSessionFactory.getSession();

       

        News news = new News();

        news.setContent("my content");

        news.setTitle("my title");

        news.setDate("my date"); //news是VO

       

        Transaction trans = session.beginTransaction();

        session.save(news); //news是PO

        trans.commit();     //任何有关数据库更新的操作都是commit后进数据库的

        HibernateSessionFactory.closeSession();

 

2:Hibernate的update操作

        Session session = HibernateSessionFactory.getSession();

 

        News news = new News();

        news.setId(103);  //id不可少,Hibernate只通过id来查找数据库

        news.setContent("update content");

        news.setTitle("update title");

       

        Transaction trans = session.beginTransaction();

        session.update(news);

        trans.commit();

        HibernateSessionFactory.closeSession();

 

注意这里我们更新数据不想对date进行更新,所以没写 setDate ,但Hibernate会认为我们是想把date设置为null,

所以如果要更新表中一些字段,最好用下面的方法

 

        Session session = HibernateSessionFactory.getSession();

 

        Transaction trans = session.beginTransaction();

        News news = (News)session.get(News.class, 103);  //*****(1)

        news.setDate("update date");  //*****(2)

        session.save(news);  //*****(3)

        trans.commit();

        HibernateSessionFactory.closeSession();

 

这里其实对数据库进行了两次操作,(1)时从数据库中把相应纪录查找出来,这里news是一个PO,

(2)对PO进行date的更新,其他数据没变,然后(3)保存,由于(1)查出的数据就有title,content,所以保存时候title和content都不会是null。

 

3:Hibernate的delete操作

   void  delete( int id)  {

        Session session = HibernateSessionFactory.getSession();

 

        Transaction trans = session.beginTransaction();

//        News news = new News();

//        news.setId(8);  //用下面那句效果一样,只是多了句select

        News news = (News)session.get(News.class, id);

        session.delete(news);

        trans.commit();

        HibernateSessionFactory.closeSession();

   }

注意,只能通过id来删除数据,不能通过title或content来删除,会报缺少标示符错误。

 

使用hql来删除(可作批量删除)

        Session session = HibernateSessionFactory.getSession();

        String hql = "delete Billdetail where name>'detailName1'";

        Query query = session.createQuery(hql);

        int ref = query.executeUpdate();

        session.beginTransaction().commit();

        System.out.println("delete dates=>"+ref); //操作条数

 

        session.close();

 

 

4:Hibernate的select操作    (查询返回的都是一个List集合),如:findById()

 

Hibernate的select操作非常丰富,这里写常用的:

 

1.criteria对象化查询 (适用情况:面向对象操作,革新了数据库操作方式,易读。缺点:适用面较HQL有限)

     try{

        Session session = HibernateSessionFactory.getSession();

 

        Criteria c = session.createCriteria(News.class);//News是类,所以N大写

        c.add(Expression.lt("date", "date5"));

        c.add(Expression.between("date", "date1", "date8"));

        c.addOrder(Order.desc("date"));

        c.add(Restrictions.eq("aname",name));//eq是等于,gt是大于,lt是小于,or是或
        c.add(Restrictions.eq("apassword", password));

 

        List<News> list = c.list();

        for(int i=0;i<list.size();i++) {

            System.out.println(list.get(i).getId()+":"+list.get(i).getDate());

        }

      }finally{
          
if(session !=null)   session .close();
     }

        HibernateSessionFactory.closeSession();

 

比较符合面向对象的概念,因为库表和JAVA类已经作了映射关系,注意Hibernate的所有操作都是针对JAVA类的,而不是库表,所以要区分大小写。上面的查询相当于sql是:

select * from news where date < 'date5' and date BETWEEN 'date1' and 'date8' ORDER by date desc;

 

2.HQL查询  (hibernate自己的查询语言,和SQL语法接近,具有跨数据库的优点,仅适用于Hibernate框架)

 try{
    Session s
=HibernateUtil.getSession();
   
   
//from后面是对象,不是表名
   String hql="from Admin as admin where admin.aname=:name";//使用命名参数,推荐使用,易读。
   Query query=s.createQuery(hql);
   query.setString(
"name", name); 
    List
<Admin> list=query.list();

 

/*

   String hql = "from Test where id = "+id;  String hql = "select user from Test as user where user.name like:name";
   session = sessionFactory.openSession();
   Query query = session.createQuery(hql);
   //query.setInteger("id",id.intValue());       query.setString("name","%"+name+"%"); 
   list = query.list();
 */
    
for(Admin admin:list){
    System.out.println(admin.getAname());
   }
  }
finally{
   
if(s!=null)
   s.close();
  }

 

HQL是Hibernate主推的查询方式,HQL中from后面的是JAVA类名,不是库表名,如果查询全字段 "select *" 可以省略不写

 

当不是查询全字段,或者是从两张表中联合查询数据时,返回的是一个数组

        Session session = HibernateSessionFactory.getSession();

 

        Query query = session.createQuery("select n.id,n.title,u.username from News as n,User u");

        List list = query.list();//这里每一行都是一个1维数组

        for(int i=0;i<list.size();i++)

        {

            Object []o = (Object[])list.get(i);  //转型为数组

            int id = (Integer)o[0];  //和select中顺序的类型相对应,可以是类

            String title = (String)o[1];

            String username = (String)o[2];

            System.out.println("id:"+id+" , "+"title"+title+" , "+username);

        }

        HibernateSessionFactory.closeSession();

 

查询结果集的大小(和Hibernate2中稍微有点不同)

(Integer)session.createQuery("select count(*) from User").iterate().next();

 

 

3.SqlQuery查询  (适用:不熟悉HQL,不打算转数据库平台的朋友,万能方法   缺点:破坏跨平台不易维护不面向对象)

     

  List sql() {
   Session s 
= HibernateUtil.getSession();


  Query q = s.createSQLQuery("select * from News").addEntity(User.News
);
  List
<News> list = q.list();
  s.close();
   return
 list;
 }

addEntity 不能忘记,这种查询方式是把查询好的结果放到一个实体中,再遍历操作,不推荐使用。

 

SqlQuery查询一些字段时候用addScalar:

SQLQuery query = session.createSQLQuery("select id,title from News");

        query.addScalar("id", Hibernate.INTEGER);  //注册字段类型,同下

        query.addScalar("title",new org.hibernate.type.StringType());

        List list = query.list();

        for(int i=0;i<list.size();i++)

        {

            Object[] o = (Object[])list.get(i);

            int id = (Integer)o[0];

            String title = (String)o[1];

            System.out.println("id:"+id+" , title:"+title);

        }

 

javabean的属性可以作为命名的查询参数(HQL)

        Session session = HibernateSessionFactory.getSession();

        Transaction trans = session.beginTransaction()

 

        Query query = session.createQuery("from room in class Room where room.name=:a")

        query.setParameter("a", "room1");  //和prepareStatement相似

      

//     Room room1 = new Room(); 

//     room1.setName("room1");    

//     Query query = session.createQuery("from room in class Room where room.name=:name"); 

                                       //如果用javabean设置参数来查询,=:name的name一定和Room中对应

//     query.setProperties(room1);

       

        List<Room> list = query.list();

        for(int i=0;i<list.size();i++)

        {

            System.out.println(list.get(i).getName()+":"+list.get(i).getDescription());

        }

       

        trans.commit();

        HibernateSessionFactory.closeSession()

 

 4.动态分离查询DetachedCriteria  (适用:面向对象操作,分离业务与底层不需要字段属性摄入到Dao实现层。  缺点:适用面较HQL有限)

 static List dc(DetachedCriteria dc) {

  Session s 
= HibernateUtil.getSession();
  Criteria c 
= dc.getExecutableCriteria(s);
  List rs 
= c.list();
  s.close();
  
return rs;
 }

DetachedCriteria dc = DetachedCriteria.forClass(User.class);
  
int id = 1;
  
if (id != 0)
   dc.add(Restrictions.eq(
"id", id));
  Date age 
= new Date();
  
if (age != null)
   dc.add(Restrictions.le(
"birthday", age));
  List users 
= dc(dc);
  System.out.println(
"离线查询返回结果:" + users);

 

 5.例子查询

 static List example(User user) {
  Session s 
= HibernateUtil.getSession();
  List
<User> users = s.createCriteria(User.class).add(
    Example.create(user)).list();
  
// List<User>
  
// users2=s.createCriteria(User.class).add((Example.create(user)).ignoreCase())
  
// .createCriteria("child").add((Example.create(user))).list();
  return users;
 }


6.命名查询  (适用:万能方法,有点像ibatis轻量级框架的操作,方便维护。  缺点:不面向对象,基于hql和sql有一定缺陷)

 List namedQuery(int id) {
  Session s 
= HibernateUtil.getSession();


  Query q 
= s.getNamedQuery("getUserById");
  q.setInteger(
"id", id);
  
return q.list();
 }

 

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>

<hibernate-mapping>
    
<class name="com.sy.vo.User" table="user" catalog="news">
    
 

    
</class>
    
<!-- 命名查询:定义查询条件 -->
    
<query name="getUserById">
     
<![CDATA[from User where id=:id]]>
    
</query>
    
<!-- 命名查询中使用sql,不推荐使用,影响跨数据库
    <sql-query name="getUserById2">
     <![CDATA[select * from User where ]]>
    </sql-query> 
-->
</hibernate-mapping>

 

 

 

 

 

 

 




 

分享到:
评论

相关推荐

    hibernate-core-5.0.11.Final.jar

    2. **操作Session**:在Session中执行增删改查操作,注意使用try-with-resources语句确保资源关闭。 3. **事务管理**:使用Session的`beginTransaction()`、`commit()`和`rollback()`方法进行事务控制。 4. **查询...

    hibernate-5.2.15. 最新jar包

    1. **对象关系映射**:Hibernate通过XML配置文件或注解将Java类与数据库表进行映射,使得数据库操作可以通过对象的增删改查方法实现,无需编写SQL语句。 2. **Session接口**:作为主要的持久化层接口,Session提供...

    最新 hibernate-release-4.2.13.Final.tgz

    3. CRUD操作:掌握如何通过Hibernate进行增删改查的基本操作。 4. 查询语言:理解HQL(Hibernate Query Language)和Criteria API,以及它们与SQL的关系和优势。 三、参考文档 文档是学习任何技术的重要资源。...

    hibernate-release-5.0.7 全包

    在实际开发中,这些组件共同协作,使得开发者可以通过简单的Java代码完成复杂的数据库操作,如增删改查、事务处理、查询优化等。例如,通过@Entity注解定义实体类,@Table指定对应的数据库表,@Id标识主键,然后使用...

    hibernate-release-5.2.2.Final

    它定义了Session接口,是应用程序与Hibernate交互的主要入口,提供了对持久化对象的增删改查操作。 2. **hibernate-entitymanager.jar**:提供了JPA(Java Persistence API)的实现,使得符合JPA规范的应用程序可以...

    Struts2+Hibernate的增删改查

    在"Struts2+Hibernate的增删改查"项目中,我们主要关注以下几个关键知识点: 1. **Struts2框架**:Struts2是一个基于MVC设计模式的Action驱动的Web应用框架,它提供了请求分发、拦截器链、结果视图管理等功能。在这...

    hibernate-release-4.2.2.Final

    4. 执行CRUD操作:利用Session接口进行增删改查操作,SessionFactory创建Session实例,Session与数据库交互。 5. 使用Transaction管理事务:在多条操作之间使用Transaction确保数据一致性。 三、JAR包详解 在...

    hibernate增删改查

    在Java开发中,Hibernate 提供了一种便捷的方式来执行数据库的增删改查(CRUD)操作,使得程序员无需编写大量的JDBC代码,而是通过对象的方式进行数据库交互。 在“hibernate的增删改查代码”中,我们通常会涉及...

    Hibernate+struts 增删改查

    总结起来,"Hibernate+Struts 增删改查"涉及的主要知识点包括Hibernate的对象关系映射、持久化、会话管理、查询API以及Struts的MVC架构、Action、ActionForm、配置文件、拦截器和结果映射。这两个框架的结合,使得在...

    hibernate-annotation-helloword

    `Session`对象是与数据库进行交互的接口,它提供了增删改查(CRUD)操作。 在`helloworld-annotation`目录下,可能会包含以下关键文件: - `pom.xml`或`build.gradle`:构建文件,包含了项目的依赖管理。 - `...

    hibernate-distribution-3.6.0.Final-dist

    5. **操作数据**:通过Session实例进行数据的增删改查,使用Transaction管理事务。 总的来说,**hibernate-distribution-3.6.0.Final-dist**为Java开发者提供了一个强大的工具,使他们能够更加高效地处理数据库操作...

    hibernate-3.2(1)hibernate-3.2(1)

    - **使用Session操作数据**:通过SessionFactory获取Session,执行增删改查操作,同时管理事务。 - **查询优化**:合理使用HQL和Criteria避免N+1查询问题,利用缓存提高查询效率。 - **异常处理**:处理Hibernate...

    struts2和hibernate结合增删改查

    通过以上步骤,我们就可以实现一个基本的基于Struts2和Hibernate的增删改查应用。这种整合使得开发者可以专注于业务逻辑,而无需过多关注底层的数据库操作,提高了开发效率和代码的可维护性。然而,实际项目中可能还...

    hibernate-release-4.3.0.Beta2

    例如,使用Hibernate进行增删改查操作,只需简单调用实体对象的方法,大大提高了开发效率。 总结,Hibernate 4.3.0.Beta2版本以其强大的ORM功能和优化的性能,成为Java开发者的得力工具。通过深入理解并熟练运用其...

    struts+hibernate+mysql做的增删改查小例子

    在这个"struts+hibernate+mysql做的增删改查小例子"中,我们将深入探讨这三个技术如何协同工作来实现数据的CRUD(Create、Read、Update、Delete)操作。 首先,Struts是一个基于MVC设计模式的Java框架,它主要用于...

    hibernate增删改查小例子

    【hibernate增删改查小例子】是一个基础的教程,旨在帮助初学者理解如何使用Hibernate框架进行数据库操作。Hibernate是Java开发中的一个强大的对象关系映射(ORM)框架,它简化了数据库交互,使开发者可以更专注于...

    hibernate-release-5.0.7.Final.zip官方

    - **增删改查**:通过 Session 对象执行 CRUD 操作。 ```java Session session = HibernateUtil.getSessionFactory().openSession(); Transaction tx = null; try { tx = session.beginTransaction(); User ...

    struts+Hibernate+MySQL简单的增删改查例子

    在这个“struts+Hibernate+MySQL简单的增删改查例子”中,我们将探讨如何利用这些技术来实现一个基本的数据管理应用。 首先,Struts是一个基于MVC(Model-View-Controller)设计模式的Java Web框架。它负责处理HTTP...

    myeclipse+mysql+hibernate+struts2增删改查

    在IT行业中,构建一个完整的Web应用常常涉及到多个技术的整合,本项目就是一个很好的例子,它采用了"Myeclipse+MySQL+Hibernate+Struts2"的技术栈来实现数据的增删改查功能。这是一个典型的企业级应用架构,适用于...

Global site tag (gtag.js) - Google Analytics