hibernate的session和数据库交互

来源:互联网 发布:淘宝造生活怎么报名 编辑:程序博客网 时间:2024/05/17 17:57

1、  根据主键查询:get()load()get方法和load方法都是按主键查询,但当没有查询到数据时,get方法返回null,而load提示错误。

public News findById(Object id)throws Exception {

        // get方法就是根据主键查询,返回的是一个对象,需要转换,id是一个主键值

        return (News) HibernateSessionFactory.getSession().get(News.class,

                (Serializable) id);

    }

2、保存对象,save(),多个就循环调用

publicboolean doCreate(News vo)throws Exception {

        HibernateSessionFactory.getSession().save(vo);

        returntrue;

    }

3、  修改对象,update(),修改一个对象

①、全部获取原有的属性更改

publicboolean doUpdate(News vo)throws Exception {

        //修改所有字段值

        HibernateSessionFactory.getSession().update(vo);

        //也可以使用HQL,使用HQL可以自行定义修改哪个字段

        returntrue;

    }

②、修改某一或多个字段的值,先根据get()来获取这个对象,或者其他的联合主键的hql获得对象,然后对象.set属性值,最后updateVO

Admin admin=(User)session.get(Admin.class, id);
       
admin.setStatus(status);

      session.update(admin)

③、修改某一或多个个字段的值,直接hql语句

Stringhql = "from Admin as admin set admin.status=status where admin.id=id";

query = session.createQuery(hql);

query.setString("status ", status );

query.setInteger("id", id)

query.executeUpdate();

 

注意此处是hql,所以都是对象和属性,而不是表和字段

也可以这样设置属性值

String hql = " from Admin as admin set admin.status=? where admin.id=? ";

        Query query = HibernateSessionFactory.getSession().createQuery(hql);

        query.setString(0,具体的值);

        query.setInteger(1, (Integer) id);

query.executeUpdate();

 

④、通过sql来修改,具体怎么设置参数不清楚,但可以拼接设置参数

String sql="update Table set field = 'test'"

Session session = HibernateSessionFactory.getSession();

session.createSQLQuery(sql).executeUpdate();

ts.commit();

4、  删除对象

①、删除一个对象

publicboolean doRemove(Object id)throws Exception {

        //代码简单,但性能低

       

        //建议使用HQL形式,一定注意,出现的是类名而不是表名

        String hql = "DELETE FROM News AS n WHERE n.id = ?";

        Query query = HibernateSessionFactory.getSession().createQuery(hql);

        //一定注意,参数下标从0开始

        query.setInteger(0, (Integer) id);

        if (query.executeUpdate() > 0) {

            returntrue;

        }

        returnfalse;

    }

 

②、直接delete(VO),但效率低

HibernateSessionFactory.getSession().delete(this.findById(id));

delete 里面是根据get()查询得到一个对象

③、可以用sql,参见3修改的④

5、查询记录数,使用hql,此处的hql需要加SELECT

publicint getCount(String kw)throws Exception {

        String hql = "SELECT count(n) FROM News AS n WHERE n.keyword LIKE ?" ;

        Query query = HibernateSessionFactory.getSession().createQuery(hql);

        query.setString(0, "%" + kw + "%");

        //Hibernate中,返回的数字类型固定按最大范围处理,因此count()函数返回的结果是Long类型

        //需要手工拆箱转换为int类型。

        intcount = ((Long) query.uniqueResult()).intValue();

        returncount;

    }

5、   查询多条记录

①、使用hql

public List<News> findAll(String kw)throws Exception {

        String hql = "FROM News AS n WHERE n.keyword LIKE ?";

        Query query = HibernateSessionFactory.getSession().createQuery(hql);

        query.setString(0, "%" + kw + "%");

        returnquery.list();

    }

 

②、使用sql,用以处理复杂的查询

String sql =" select * from XT_JSQX as jsqx where jsqx.JSDM='"+jsdm+"' and not exists (select 1 from XT_YHQX as yhqx where yhqx.YHDM='"+yhdm+"' and yhqx.MOUK=jsqx.MOUK and yhqx.GNEN=jsqx.GNEN)";

       SQLQuery sqlquery = session.createSQLQuery(sql);

       Query query =sqlquery.addEntity(XtJsqx.class);

       return query.list();

 

如果查询的字段名称是不同的表SELECT t.name,t.age,m.deptno FROM person t,dept m

  public List<Map> selectBySql(final String sql, final Object[] params) {
  return getHibernateTemplate().executeFind(new HibernateCallback() {
   public Object doInHibernate(Session session)
     throws HibernateException, SQLException {
    Query query = session.createSQLQuery(sql);
    if (params != null) {
     for (int i = 0, len = params.length; i < len; i++) {
      query.setParameter(i, params[i]);
     }
    }
    query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
    return query.list();
   }
  });
 }

那么前台页面就可以直接循环了,

List<Map> list=selectBySql(SELECT JSDH,XXHH,JE,XINM,JSRXM,JSSJ FROM PJ_JB,null)

<%
         for(Map mp: list){
      %>
            <tr bgcolor="#DBD3C8">
              <td  align="center">
        <img title="查" src="<%= basePath%>images/c.png" alt="" onclick="doQuery('<%=UtilComm.trim(String.valueOf(mp.get("JSDH"))) %>','<%=UtilComm.trim(String.valueOf(mp.get("XXHH"))) %>')" width="15" height="15" style="cursor: pointer;">&nbsp;
              </td>
              <td  align="center"><%=UtilComm.trim(String.valueOf(mp.get("JSDH"))) %>&nbsp;</td>
              <td  align="center"><%=UtilComm.trim(String.valueOf(mp.get("JE"))) %>&nbsp;</td>
              <td  align="center"><%=UtilComm.trim(String.valueOf(mp.get("XINM"))) %>&nbsp;</td>
              <td  align="center"><%=UtilComm.trim(String.valueOf(mp.get("JSRXM"))) %>&nbsp;</td>
              <td  align="center"><%=UtilComm.trim(String.valueOf(mp.get("JSSJ"))) %>&nbsp;</td>
              </tr>
              <%
        }
        %>

 

注意,如果想取记录数可以直接获取list.size()获取

    可以通过一个结果转换类,依据HQL中为不同属性定义的别名,查找pojo中同名的属性,并自动设置到属性中。

 

String sql = "SELECT id,title,keyword FROM news " ;

        SQLQuery query = HibernateSessionFactory.getSession().createSQLQuery(sql);

        query.setResultTransformer(new AliasToBeanResultTransformer(News.class));

        return query.list();

Query查询

HQL支持修改,删除以及查询,但不支持添加功能。

修改和删除通过executeUpdate执行,而查询通过list()uniqueResult()方法来执行。

 

语法上首先注意,编写的都是类名和属性名,而不会出现表名或字段名。

修改和删除语句,语法与SQL一致。

但查询上有一些区别:

1)   使用HQL时,可以不加入SELECT关键字,表示查询全部字段,并将查询结果整合成为pojo对象。

2)   如果加入SELECT关键字,则需要按情况处理

a)          如果SELECT后只查询一个属性,则返回的类型为该属性的类型

b)         如果查询的是统计函数值,返回的类型按数字类型的最大范围处理(LongDouble

c)          如果有多个属性,则返回Object的数组,但由于Object数组不容易处理,因此建议使用AliasToBeanResultTransformer对象来进行转换,自动将结果中的Object数组转换为News对象

 

6、  hql查询多条记录的某几个属性,此时有SELECT关键字

    String hql = "SELECT n.id AS id,n.title AS title,n.keyword AS keyword FROM News AS n" ;

        Query query = HibernateSessionFactory.getSession().createQuery(hql);

        //可以通过一个结果转换类,依据HQL中为不同属性定义的别名,查找pojo中同名的属性,并自动设置到属性中。

        query.setResultTransformer(new AliasToBeanResultTransformer(News.class));

        return query.list();

 

 

所有的hql都是对象和属性,用的是createQuery,所有的sql是表名和字段,用的是createSQLQuery,hql不支持添加,

Session就是Connection,但多了一些CRUD的方法

         添加 save()

         修改 update()

         删除 delete():以上三个都要传入pojo对象

         查询 get():需要传入查询的类型以及主键值,返回结果对象

Query就是PreparedStatement

         设置参数 setXxxx():从0开始

         执行修改或删除 executeUpdate()不支持添加操作,因为HQL语句里没有添加的语法

         执行查询list():查询多条数据,返回List集合

         执行查询uniqueResult():查询单条数据,返回Object,需要手工转型

7Criteria查询,具体没怎么用过

8hibernate还支持分页查询,具体请参考百度。

0 0