BBS项目笔记之一:Spring+Hibernate实现Dao层
来源:互联网 发布:淘宝发货单 编辑:程序博客网 时间:2024/04/29 23:03
之前的项目都比较小, 这个是s2sh做的 . Spring和Hibernate整合过好些次了 ,这次看别人写的还是收获挺多的
一:单分出applicationContext-dao.xml 和 hibernate.cfg.xml
spring的配置文件里单分出applicationContext-dao来 ,里边只配置和Dao有关的配置
web.xml里记得加个配置就行了
<param-value>classpath:applicationContext-*.xml</param-value>
其中包括sessionFactory和事务配置
<!-- 配置sessionFactory --><bean id="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><property name="configLocation"><value>classpath:hibernate.cfg.xml</value></property></bean>
项目里并没有把hibernate的配置文件砍掉,把配置全放在spring配置里
里边除了4个连接属性
还配置了hibernate的映射文件,之前都是用annotation配置的,这次研究一下配置文件
二:mapping映射文件的配置
大致和annotation所反映出来的信息差不多,就是换了中写法,拿文章的映射文件为例
<hibernate-mapping package="com.hrl.model"><class name="Article" table="tb_article"><id name="articleId"><generator class="native" /></id><property name="title" type="string" length="255"/><property name="content" length="2048"/><property name="emitTime" /><property name="lastUpdateTime" /><property name="articleTypeName" length="255" /><many-to-one name="user" column="userId" class="User" cascade="none" fetch="join" /><many-to-one name="articleType" column="articleTypeId" class="ArticleType" cascade="none" fetch="join" /><set name="replies" inverse="true" cascade="all" order-by="replyTime desc"><key column="articleId" /><one-to-many class="Reply" /></set><set name="scans" inverse="true" cascade="all" order-by="scanTime desc"><key column="articleId" /><one-to-many class="Scan" /></set></class></hibernate-mapping>绝大多数也能看懂:
id是自增 , 然后全部字段都要写上 ,
join还是用来解决1+N
一对多和多对一就比annotation麻烦多了,
set name要写实体中对应的字段
cascade是级联 这个原来用过, inverse这个查了半天:
第一、概念,指定要不要当自己来维护关系。(其实根本不用去理解)
第二、在one-to-many的时候,设置inverse=“true” 当然是在 one这个地方设置
第三、在many-to-many的时候,随便在哪端先设置inverse=“true”,另一个地方设置inverse=“false”
第四、别问我:“那我不这么设置行不行,换个方法设置下看看”,取消念头,回到第二和第三条。
lazy对应fechType的lazy
三:Dao的实现
还是分为接口和实现两部分
接口中,他用了好多final 保证传输的数据不被更改 挺好
public void updateByQuery(final String queryString,final Object[] parameters);
实现中:还是继承HibernateDaoSupport用template
Dao的实现类技术含量很高,忍不住copy一份...这个抽象类是供具体的DaoImpl继承的,相当于一个工具类
Serializable... ids是Serializable[] ids的意思 ,里边还定义了QBC的底层操作,这个项目里用QBC做的分页
最后setParameterValue根据传参类型来赋值
public abstract class DefaultDaoImpl extends HibernateDaoSupport implementsIDefaultDao {protected int queryCount = 0;public void setQueryCount(int count) {this.queryCount = count;} /** * 保存数据 * @param object * @return */public Serializable save(Object object) {return getHibernateTemplate().save(object);} /** * 删除数据 * @param clazz * @param ids */public void delete(Class clazz, Serializable... ids) {for (Serializable id : ids) {Object obj = getHibernateTemplate().load(clazz, id);getHibernateTemplate().delete(obj);}} /** * 修改 */public void update(Object object) {getHibernateTemplate().update(object);}public void saveOrUpdate(Object object) {getHibernateTemplate().saveOrUpdate(object);} /** * 得到Criteria的对象,以方便进行QBC查询 * @param clazz * @return */public Criteria getCriteria(Class clazz){return this.getHibernateTemplate().getSessionFactory().getCurrentSession().createCriteria(clazz);}public void updateByQuery(final String queryString,final Object[] parameters) {getHibernateTemplate().execute(new HibernateCallback() {public Object doInHibernate(Session session) {Query query = session.createQuery(queryString);if (parameters != null) {for (int i = 0; i < parameters.length; i++) {query.setParameter(i, parameters[i]);}}query.executeUpdate();return null;}});}protected String setEscape(String str) {if (str.indexOf("%") >= 0) {str = str.replaceAll("%", "\\\\%");}if (str.indexOf("_") >= 0) {str = str.replaceAll("_", "\\\\_");}return str;}protected String setEscapeChar() {return " escape '\\'";}public void delete(Class clazz, Serializable id) {getHibernateTemplate().delete(load(clazz, id));}public Integer deleteAll(final Class clazz) {return (Integer) getHibernateTemplate().execute(new HibernateCallback() {public Object doInHibernate(Session session) {Query query = session.createQuery("delete "+ clazz.getName());return new Integer(query.executeUpdate());}});} /** * 查询实体的所有对象 */public List findAll(Class clazz) {return getHibernateTemplate().find("from " + clazz.getName());} /** * 通过主键,加载对象 */public Object load(Class clazz, Serializable id) {return getHibernateTemplate().load(clazz, id);}public Object get(Class clazz, Serializable id) {return getHibernateTemplate().get(clazz, id);}public List findByNamedQuery(final String queryName) {return getHibernateTemplate().findByNamedQuery(queryName);}public List findByNamedQuery(final String queryName, final Object parameter) {return getHibernateTemplate().findByNamedQuery(queryName, parameter);}public List findByNamedQuery(final String queryName,final Object[] parameters) {return getHibernateTemplate().findByNamedQuery(queryName, parameters);}public List find(final String queryString) {return getHibernateTemplate().find(queryString);}public List find(final String queryString, final Object[] parameters) {return getHibernateTemplate().find(queryString, parameters);}public Integer deleteByQuery(final String queryString,final Object[] parameters) {return (Integer) getHibernateTemplate().execute(new HibernateCallback() {public Object doInHibernate(Session session) {Query query = session.createQuery(queryString);if (parameters != null) {for (int i = 0; i < parameters.length; i++) {query.setParameter(i, parameters[i]);}}return new Integer(query.executeUpdate());}});}public List query(String hql, String firstResult, String maxResults) {Query query = this.getHibernateTemplate().getSessionFactory().getCurrentSession().createQuery(hql);query.setFirstResult(new Integer(firstResult).intValue());query.setMaxResults(new Integer(maxResults).intValue());return query.list();}public Object get(final String queryString, final Object[] parameters) {List list = getHibernateTemplate().find(queryString, parameters);if (list != null && !list.isEmpty()) {return list.get(0);}return null;}/** * Convenience method to set paramers in the query given based on the actual * object type in passed in as the value. You may need to add more * functionaly to this as desired (or not use this at all). * * @param query * the Query to set * @param position * the ordinal position of the current parameter within the query * @param value * the object to set as the parameter */protected void setParameterValue(Query query, int position, Object value) {if (null == value) {return;} else if (value instanceof Boolean) {query.setBoolean(position, ((Boolean) value).booleanValue());} else if (value instanceof String) {query.setString(position, (String) value);} else if (value instanceof Integer) {query.setInteger(position, ((Integer) value).intValue());} else if (value instanceof Long) {query.setLong(position, ((Long) value).longValue());} else if (value instanceof Float) {query.setFloat(position, ((Float) value).floatValue());} else if (value instanceof Double) {query.setDouble(position, ((Double) value).doubleValue());} else if (value instanceof BigDecimal) {query.setBigDecimal(position, (BigDecimal) value);} else if (value instanceof Byte) {query.setByte(position, ((Byte) value).byteValue());} else if (value instanceof Calendar) {query.setCalendar(position, (Calendar) value);} else if (value instanceof Character) {query.setCharacter(position, ((Character) value).charValue());} else if (value instanceof Timestamp) {query.setTimestamp(position, (Timestamp) value);} else if (value instanceof Date) {query.setDate(position, (Date) value);} else if (value instanceof Short) {query.setShort(position, ((Short) value).shortValue());}}/** * Convenience method to set paramers in the query given based on the actual * object type in passed in as the value. You may need to add more * functionaly to this as desired (or not use this at all). * * @param query * the Query to set * @param key * the key name * @param value * the object to set as the parameter */protected void setParameterValue(Query query, String key, Object value) {if (null == key || null == value) {return;} else if (value instanceof Boolean) {query.setBoolean(key, ((Boolean) value).booleanValue());} else if (value instanceof String) {query.setString(key, (String) value);} else if (value instanceof Integer) {query.setInteger(key, ((Integer) value).intValue());} else if (value instanceof Long) {query.setLong(key, ((Long) value).longValue());} else if (value instanceof Float) {query.setFloat(key, ((Float) value).floatValue());} else if (value instanceof Double) {query.setDouble(key, ((Double) value).doubleValue());} else if (value instanceof BigDecimal) {query.setBigDecimal(key, (BigDecimal) value);} else if (value instanceof Byte) {query.setByte(key, ((Byte) value).byteValue());} else if (value instanceof Calendar) {query.setCalendar(key, (Calendar) value);} else if (value instanceof Character) {query.setCharacter(key, ((Character) value).charValue());} else if (value instanceof Timestamp) {query.setTimestamp(key, (Timestamp) value);} else if (value instanceof Date) {query.setDate(key, (Date) value);} else if (value instanceof Short) {query.setShort(key, ((Short) value).shortValue());}}}
- BBS项目笔记之一:Spring+Hibernate实现Dao层
- 简单Blog项目笔记之一:Hibernate管理Dao层
- Spring+HIbernate通用层Dao和Service实现
- BBS项目笔记之八:hibernate底层查询的实现
- MyBatis学习笔记-Spring集成DAO层实现方式记录
- 基于Spring、Hibernate的通用DAO层与Service层的实现
- 基于Spring、Hibernate的通用DAO层与Service层的实现
- 基于Spring、Hibernate的通用DAO层与Service层的实现
- 基于Spring、Hibernate的通用DAO层与Service层的实现
- 基于Spring、Hibernate的通用DAO层与Service层的实现
- Spring+Hibernate DAO 持久层开发
- Struts2+Spring+Hibernate step by step 03 整合Spring之一(在DAO层验证用户名和密码)
- hibernate的dao层实现条件查询
- BBS项目笔记之五:BBS论坛首页的实现
- 完成SSH项目 -- 实现dao层
- Hibernate dao 层
- hibernate的dao层
- spring hibernate注解实现泛型dao
- with 表名 as 用法
- linux下搭建nginx服务
- VIM设置代码折叠
- JVM内存结构
- 通过串口(console)来管理linux主机
- BBS项目笔记之一:Spring+Hibernate实现Dao层
- 市价导入
- Linux bug 14258279: scheduling clock overflows in 208 days
- Unity C# Advanced CSharp Messenger
- 向android stagefright增加软解码库
- vim分割窗口
- 动态添加列
- 给webBrowser.DocumentText赋值不起作用
- 修改数据表