开发网页游戏过程记录10-数据库具体增删改查实现

在开发过程中自然会想到使用三层模型,粗略的可分为数据操作dao层,视图显示view层,请求数据和响应请求返回的数据通过action和service即controller层来处理,以后还可能会对这三层进行细致的划分。这篇文章主要是关于dao层的,dao层在操作数据库数据的时候,我们还是采用面向接口的方式来实现,dao方法定义在接口中,dao操作的具体实现在daoImpl中。在实现过程中自然少不了sql语句,对于数据库的拼装是值得注意的,如下:

public T gettByIdAndCode(Long id, String code, Boolean isUsed) { StringBuffer hql = new StringBuffer(); hql.append("from table t where t.id = ? and t.code= ? "); if(isUsed) { hql.append(" and t.status = 0 "); } else { hql.append(" and t.status = -1 "); } final Object[] params = new Object[] { id, code }; List<T> list = this.find(hql.toString(), params, T.class); if(list != null && !list.isEmpty()) { return list.get(0); } return null;}在这段代码中的find方法是上文中的DaoSupport中定义的:

public <T> List<T> find(final String hql, final Object params[], Class<T> clazz, final boolean... readOnly) { return (List<T>) find(hql, params, readOnly); }public List<?> find(final String hql, final Object params[], final boolean... readOnly) { return (List<?>) this.getDaoTemplate().executeFind( new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { Query q = session.createQuery(hql); setParameter(q, null, params); setReadOnly(q, readOnly); return q.list(); } }); }上面的setParameter方法:

protected void setParameter(Query q, String[] names, Object[] params) { if (names != null) { for (int i = 0; i < names.length; i++) { applyNamedParameterToQuery(q, names[i], params[i]); } } else { if (params != null) { for (int i = 0; i < params.length; i++) { q.setParameter(i, params[i]); } } } }applyNamedParameterToQuery方法(主要还是使用Query对象的setParameter方法来实现的,只不过封装了多种形式):

protected void applyNamedParameterToQuery(Query queryObject, String paramName, Object value) throws HibernateException { if (value instanceof Collection) { queryObject.setParameterList(paramName, (Collection<?>) value); } else if (value instanceof Object[]) { queryObject.setParameterList(paramName, (Object[]) value); } else { queryObject.setParameter(paramName, value); } }上面的方法都可以作为工具类提供的方法,以后操作数据库数据时就只需调用这些方法即可。
在DaoImpl中update数据时需要对对象的二级缓存进行evict,然后再调用saveOrUpdate()方法。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值