大家好,本人目前為上海張江男,這邊IT氛圍很好,本人在這邊生活了半年,感覺很不錯,哈哈。
下面是我自己總結的ssh2的註解,本人感覺入門還是可以的,所以就拿出手了,歡迎與大家交流,QQ:4218380 謝謝大家。
二話不說,直接上Spring.xml設定檔資訊。
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <!-- 註解配置,掃描com.niclo包下面的資訊 --> <context:annotation-config/> <context:component-scan base-package="com.niclo" /> <!-- 資料庫屬性檔案 --><beanclass="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="locations"><value>classpath:jdbc.properties</value></property></bean><!-- 資料庫配置資訊 --><bean id="dataSource" destroy-method="close"class="org.apache.commons.dbcp.BasicDataSource"><property name="driverClassName"value="${jdbc.driver}" /><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /></bean><!-- sessionFactory 配置資訊,這個必須滴 --><bean id="sessionFactory" destroy-method="destroy"class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"><property name="dataSource" ref="dataSource" /> <property name="packagesToScan" value="com.niclo.vo"></property><property name="hibernateProperties"><props><prop key="hibernate.dialect">${jdbc.dialect}</prop><prop key="hibernate.show_sql">true</prop><prop key="hibernate.hbm2ddl.auto">none</prop></props></property></bean></beans>
一個VO類,也有人說是PO,DTO,都可以這樣說,一個封裝類僅此而已。
package com.niclo.vo;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.Table;@Entity@Table(name="testVo")public class TestVo {public static final String ID = "id";public static final String TITLE = "title";public static final String TYPE = "type";public static final String NAME = "name";public static final String DESCRIPTION = "description";public static final String URL = "url";private Integer id;private String title;private String type;private String name;private String description; private String url;@Id@GeneratedValue(strategy=GenerationType.AUTO)public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getType() {return type;}public void setType(String type) {this.type = type;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}}
一個Dao介面,自訂的弱弱有點亂碼,但我相信犀利的會懂的。
package com.niclo.base;import java.io.Serializable;import java.util.List;import java.util.Map;import org.springframework.dao.DataAccessException;/** * BaseDao介面, 該介面可以被任何ssh/s2sh架構使用<br> * @author 北極光? * @QQ 4218380 * @version 0.8 $ Dec 07, 2010 $ 19:40:40 PM $ * */public interface BaseDao {//void setConnection(String dbName);/** * 統計行數 * * @param clazz * �?參數為Class肯定比物件查詢效率高 �?��被統計的執行個體 */int count(Class clazz);/** * 查詢�?��對象 * 持久化指定的執行個體 * @param clazz * 被載入的�? * @param id * 被序列化類別id */<T> T findById(Class clazz,Serializable id);/** * 儲存�?��對象 * 持久化指定的執行個體 * @param entity * �?��被持久化的實�? */void save (Object entity);/** * 儲存�?��對象, 該方法與save方法的區別是: 假設Hibernate有一個saveWithGeneratorId()方法, * 該方法負責向資料庫插入數�?在不�?��事務的情況下: save方法會去調用該方�? 進行對象的保�? 然後由資料庫進行復原 * persist()方法則不會去調用該方�? * entity * 持久化指定的執行個體 * @param entity * �?��被持久化的實�? *@ */void persist(Object entity);/** * 這個叫果斷刪除一個對象不解釋 * 刪除�?��對象 * @param entity * 要刪除的對象 */void delete(Object entity); /** * 使用namedQuery 執行刪除... * * @param namedQuery * HQL語句名稱 * @param values * 值列�? * @return * @throws DataAccessException */ Integer deleteByNamedQuery (String namedQuery , Object ... values) throws DataAccessException; /** * 使用HQL刪除資料 * @param HQL * HQL語句 * @param valueMap * 存放值的Map * @return * 刪除後的數量 * @throws DataAccessException */ Integer deleteByHQLQuery(String HQL, Map<String, Object> valueMap)throws DataAccessException;/** * 這個叫修改一個對象不解釋 * 修改�?��對象 * @param entity * 要刪除的對象 */void update(Object entity); /** * 使用namedQuery 執行更新... * * @param namedQuery * HQL語句名稱 * @param values * 值列�? * @return * @throws DataAccessException */ Integer updateByNamedQuery (String namedQuery , Object ... values) throws DataAccessException; /** * 使用HQL更新資料 * @param HQL * HQL語句 * @param valueMap * 存放值的Map * @return * 更新或後的數�? * @throws DataAccessException */ Integer updateByHQLQuery(String HQL, Map<String, Object> valueMap)throws DataAccessException;/** * 儲存或�?更新�?��對象 * 持久化指定的執行個體 * @param entity �?��被持久化的實�? */void saveOrUpdate (Object entity); /** * 使用get方法載入對象 * @param <T> * 類型資訊 T * @param entityClass * 要載入的�? * @param id * 要載入的id * @return * 如果未找�? 則返回null. * @throws DataAccessException */ <T> T get(Class<T> entityClass, Serializable id); /** * 使用namedQuery查詢全部資料, 分頁查詢 * @param <T> * @param namedQuery * @param beginResult * @param maxResult * @param values * @return * @throws DataAccessException */ <T> List<T> findByNamedQuery(String namedQuery, int beginResult, int maxResult, Object ... values)throws DataAccessException; /** * 使用namedQuery查詢全部資料, 分頁查詢 * @param <T> * @param namedQuery * @param cacheName * 如果不指定緩衝名�? 則表示不緩衝 * @param values * @return * @throws DataAccessException */ <T> List<T> findByNamedQuery(String namedQuery, String cacheName, Object ... values)throws DataAccessException; /** * 使用namedQuery查詢單個對象 * * @param <T> * @param namedQuery 支援去xxx.hbm.xml檔案找HQL語句哦, * 不過我都放在NamedQueryConstants常量類裡面了,所以直接NamedQueryConstants.xxxx就可以啦 * @param values * @return * @throws DataAccessException */ <T> T getByNamedQuery (String namedQuery , Object ... values) throws DataAccessException; /** * 根據條件尋找對象, 並是否緩�? * @param <T> * @param HQL * @param valueMap * @param cacheName * 如果不指定緩衝名�? 則表示不緩衝 * @return * @throws DataAccessException */ <T> List<T> findByHQLQuery(String HQL, Map<String, Object> valueMap, String cacheName)throws DataAccessException; /** * 使用HQL從資料庫尋找資料, 支援分頁查詢 * @param HQL * HQL語句, HQL語句�?��使用具名引數的形�? * @param valueMap * �?��Map, key 為命名參�? * @param firstResult * �?��行數 * @param maxResult * �?��行數 * @return * @throws DataAccessException */ <T> List<T> findByHQLQuery(String HQL, Map<String, Object> valueMap, int firstResult, int maxResult)throws DataAccessException; /** * 該方法從資料庫中�?��單個對象, 支援動�?執行個體化結�? * @param <T> * @param HQL * @param valueMap * @return * @throws DataAccessException */ <T> T getByHQLQuery(String HQL, Map<String, Object> valueMap) throws DataAccessException; /** * 該方法從資料庫中�?��單個對象, 支援動�?執行個體化結�? * @param <T> * @param HQL * @param valueMap * @return * @throws DataAccessException */ <T> List<T> findByExample(String exampleName, Object exampleEntity,int firstResult,int maxResults); }
DaoImpl實作類別,sessionFactory也在裡面哦,用到了hibernateTemplate , 唯寫一個實現方法,因為太多了。
/** * BaseDao為Dao基類, 該類可以被任意模組的DaoImpl類繼承使�?br> * @author 餘曉�? * @QQ 4218380 * @version 0.1 $ May 11, 2011 $ 13:40:40 PM $ * */@Component("dao")public class BaseDaoImpl implements BaseDao{public HibernateTemplate hibernateTemplate;@Resource(name="sessionFactory")public void setSessionFactory(SessionFactory sessionFactory) {hibernateTemplate = new HibernateTemplate(sessionFactory);}public <T> T findById(Class entityClass, Serializable id) {return (T) hibernateTemplate.get(entityClass, id);}}
Service介面,只定義一個方法吧。
public interface BaseService {/** * 統計行數 * * @param clazz * 參數為Class肯定比物件查詢效率高 �?��被統計的執行個體 */int count(Class clazz);/** * 查詢�?��對象 * 持久化指定的執行個體 * @param clazz * 被載入的�? * @param id * 被序列化類別id */<T> T findById(Class entityClass,Serializable id);/** * 儲存�?��對象 * 持久化指定的執行個體 * @param entity �?��被持久化的實�? */boolean save (Object entity);}
BaseServiceImpl實作類別,這裡關係到怎麼調用Dao ,其實很棒簡單,就是@Resource 一下,但是dao 是跟你在BaseDaoImpl的Component("dao")的dao名字一樣的哦,
同理其他類要引用此BaseServiceImpl就可以 private @Resource BaseServiceImpl service; 這樣就可以了,至於為什麼因為spring.xml裡面配置了,謝謝。
@Component("service")public class BaseServiceImpl implements BaseService{private @Resource BaseDao dao;public int count(Class entity) {returndao.count(entity);}public <T> T findById(Class entityClass, Serializable id) {return dao.findById(entityClass, id);}public boolean delete(Object entity) {boolean flag = false;try {dao.delete(entity);flag = true;} catch (DataAccessException e) {throw e;}return flag;}}
接下來是Struts2的Action怎麼引用Service 與 怎麼用Struts2的註解了。
package com.niclo.action;import java.util.List;import javax.annotation.Resource;import org.apache.struts2.convention.annotation.Action;import org.apache.struts2.convention.annotation.Result;import com.niclo.base.BaseService;import com.niclo.vo.TestVo;public class UserAction {private static final String SUCCESS = "(@.@)..?";private static final String INPUT = "(^.^)..!";private @Resource BaseService service;private List<TestVo> list;@Action(value="test")public void test(){TestVo vo =service.findById(TestVo.class, 1);System.out.println(vo.getName()+"test..");}@Action(value = "searchAction", results = { @Result(name = SUCCESS,location="/result.jsp"), @Result(name = INPUT,location="/lucene.jsp") })public String searchAction(){//這裡service的方法要自己去寫點了。//list = service.調用查詢分頁,詳見該Dome的原始碼return SUCCESS;}public List<TestVo> getList() {return list;}public void setList(List<TestVo> list) {this.list = list;}}
好坤坤了,今天去浦江吹了一天風,最後一個FillMap協助類,此類是專解析HQL滴。
package com.niclo.util;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.regex.Matcher;import java.util.regex.Pattern;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;public final class FillMap {private static final Log log = LogFactory.getLog(FillMap.class);private FillMap(){}/** * 根據指定的HQL查詢條件和�?列表填充Map * @param factory * 查詢的HQL條件 * @param obj * 值列�? * @return * 封裝入Map後的�? */public static Map<String, Object> fillValue(String HQL, Object ... obj){Map<String, Object> valueMap = new HashMap<String, Object>(4);Pattern pattern = Pattern.compile("[:][a-zA-Z0-9]+");Matcher matcher = pattern.matcher(HQL);String findGroup = null;for(int i = 0; i < obj.length; i++){if(matcher.find()){findGroup = matcher.group();valueMap.put(findGroup.substring(1, findGroup.length()), obj[i]);}}pattern = null;matcher = null;if(log.isInfoEnabled()){log.info("〓�?〓�?〓�?〓�?〓�?〓�?〓�?〓�?〓�? GET THE HQL IS 〓�?〓�?〓�?〓�?〓�?〓�?〓�?〓�?〓�? \n " +HQL + "\n fill the named parameter key / value is \n" + valueMap);}return valueMap;}@SuppressWarnings("unchecked")public static void main(String[] args) { List list = new ArrayList(); list.add(0); list.add(-99); list.add(1); list.add(2); System.out.println( fillValue("abc =:anc, dy=:dd, xx =:xx,yy=:yy", list.toArray()));}}
我把自己寫好的例子已經上傳到了CSDN裡面,可以直接下載的,搞例子包括ssh2註解 Lucene 全文檢索索引與WebService 。
技術是拿來分享與討論是最快樂的事情,因為只有人與人溝通才是最快樂的,與電腦只是為了讓生活更美好。