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属性值,最后update(VO)
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;">
</td>
<td align="center"><%=UtilComm.trim(String.valueOf(mp.get("JSDH"))) %> </td>
<td align="center"><%=UtilComm.trim(String.valueOf(mp.get("JE"))) %> </td>
<td align="center"><%=UtilComm.trim(String.valueOf(mp.get("XINM"))) %> </td>
<td align="center"><%=UtilComm.trim(String.valueOf(mp.get("JSRXM"))) %> </td>
<td align="center"><%=UtilComm.trim(String.valueOf(mp.get("JSSJ"))) %> </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) 如果查询的是统计函数值,返回的类型按数字类型的最大范围处理(Long或Double)
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,需要手工转型
7、Criteria查询,具体没怎么用过
8、hibernate还支持分页查询,具体请参考百度。
- hibernate的session和数据库交互
- hibernate crud的两种方案对象和sql ---- session和sql与数据库交互
- HttpSession和Hibernate的session
- Hibernate的Session和transaction
- hibernate的sessionFactory和session
- Hibernate的SessionFactory和Session
- Hibernate Session 操作数据库的方法详解
- Hibernate Session 操作数据库的方法详解
- hibernate读取数据库里内容,session的get方法和load方法的区别
- Hibernate 中的session 的flush、reflush 和clear 方法 ,及数据库的隔离级别
- hibernate和spring整合之session、hibernateTemplate、Criteria对象对数据库的操作
- Hibernate中的Session和Transactaion的管理
- 关于Hibernate的Session和SessionFactory
- hibernate的session判断-openSession和getCurrentSession
- 关于Hibernate的Session和SessionFactory
- Hibernate中Session的get和load
- 浅谈hibernate的sessionFactory和session
- 浅谈hibernate的sessionFactory和session
- Stack头文件
- android中listview的一些样式设置
- opencv2对读书笔记——使用均值漂移算法查找物体
- http://www.douban.com/note/359568710/
- SSH整合之JAR包篇
- hibernate的session和数据库交互
- 黑马程序员 Java基础<二> 运算符
- 过滤器(Filter)和拦截器(Interceptor)的区别
- online-education
- ADF设置欢迎首页
- per_cpu变量用法
- 串口通信常用API
- Android开发ToggleButton控件的学习
- ARM Linux系统的时钟机制