⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bookloaddaoimpl.java

📁 本系统实现了从五个网站上搜索的图书进行整合后
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
package com.booksearch.dao;

import java.io.StringReader;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;

import org.apache.log4j.Logger;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.Token;
import org.apache.lucene.analysis.TokenStream;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.booksearch.orm.Book;


/**
 * Class:BookLoadDaoImpl
 * Description:  从数据库中获得满足条件的所有book实体对象和记录总数
 * extens:HibernateDaoSupport
 * implements:BookLoadDao
 * @author  feng guang
 * @since   11/20/08
 */
public class BookLoadDaoImpl extends HibernateDaoSupport implements BookLoadDao {
    
	
    private Analyzer writerAnalyzer;
    
	private static final Logger logger;
	
	static 
    {
        logger = Logger.getLogger(com.booksearch.dao.BookLoadDaoImpl.class);
    }
	
	public void setWriterAnalyzer(Analyzer writerAnalyzer) {
		this.writerAnalyzer = writerAnalyzer;
	}

	/**
	* Function:  loadBook
	* Description: 从数据库中获得满足条件的所有book实体对象
	* Calls:  no
	* Called By:  searchAction.execute()
	* @param bookName as String
	* @return ArrayList<Book>
	* @throws no
	*/
	public ArrayList<Book> loadBook(String keyword,String searchKind,int currPage,String rankKind) {
		
		 ArrayList<Book> list = null;
		 if("relavancy".equals(rankKind)){
			 
			 if("name".equals(searchKind)) list = this.loadBookByName(keyword, currPage);
			 else if("author".equals(searchKind))list = this.loadBookByAuthor(keyword, currPage);
			 else if("publisher".equals(searchKind))list = this.loadBookByPublisher(keyword, currPage);
			 else if("all".equals(searchKind)){
				 list = this.loadBookByName(keyword, currPage);
				 if(list.size()<10){
					 list.addAll(this.loadBookByAuthor(keyword, currPage)) ;
					 if(list.size()<10)
						 list.addAll(this.loadBookByPublisher(keyword, currPage)); 
				 }
			 }
		 }else{
			 list = this.loadBookByRank(keyword, searchKind, currPage, rankKind);
		 }
		 return list;
		        
	}
	/**
	* Function:  loadBookNum
	* Description: 从数据库中获得满足条件的记录总数
	* Calls:  no
	* Called By:  searchAction.execute()
	* @param bookName as String
	* @return long
	* @throws no
	*/
	public long loadBookNum(String keyword,String searchKind) {
		 //System.out.println("searchKind>>" + searchKind);
		 long recordNum = 0;
		 if("name".equals(searchKind))recordNum = this.loadBookNumByName(keyword);
		 else if("author".equals(searchKind))recordNum = this.loadBookNumByAuthor(keyword);
		 else if("publisher".equals(searchKind))recordNum = this.loadBookPublisherNum(keyword);
		 else if("all".equals(searchKind)){
              recordNum += this.loadBookNumByName(keyword);
              recordNum += this.loadBookNumByAuthor(keyword);
              recordNum += this.loadBookPublisherNum(keyword);
		 }
		 //System.out.println("recordNum>>" + recordNum);
		 return recordNum;
	}
	/**
	* Function:  loadAdvancedBook
	* Description: 从数据库中获得满足高级搜索条件的记录
	* Calls:      this.getSQL()
	* Called By:  AdvancedSearchAction.execute()
	* @param list as ArrayList<String>,currPage as int
	* @return ArrayList<Book>
	* @throws no
	*/
	public ArrayList<Book> loadAdvancedBook(String keyword,int currPage,String rankKind) {
		
		ArrayList<String> list = new ArrayList<String> ();
		StringTokenizer st = new StringTokenizer(keyword, "+");
		
		while (st.hasMoreElements()) {
			/*因为分词之后会有一个是空的,所以进行一下判断*/
			list.add(st.nextToken());
		}
//		
//		/*只包含书名时,按分类搜索中书名搜索进行*/
//		if("null".equals(list.get(1))&&"null".equals(list.get(2))
//				&&"null".equals(list.get(3))&&"null".equals(list.get(4))
//				&&"null".equals(list.get(5))&&"null".equals(list.get(6))
//				&&"null".equals(list.get(7))&&"null".equals(list.get(8))
//				&&"null".equals(list.get(9))&&!"null".equals(list.get(0))){
//			ArrayList<Book> listBook = this.loadBookByName(list.get(0).replace("20%", "+"), currPage);
//			return listBook;
//		}else if("null".equals(list.get(0))&&"null".equals(list.get(2))
//				&&"null".equals(list.get(3))&&"null".equals(list.get(4))
//				&&"null".equals(list.get(5))&&"null".equals(list.get(6))
//				&&"null".equals(list.get(7))&&"null".equals(list.get(8))
//				&&"null".equals(list.get(9))&&!"null".equals(list.get(1))){
//			ArrayList<Book> listBook = this.loadBookByAuthor(list.get(1).replace("20%", "+"), currPage);
//			return listBook;
//		}else if("null".equals(list.get(0))&&"null".equals(list.get(1))
//				&&"null".equals(list.get(2))&&"null".equals(list.get(4))
//				&&"null".equals(list.get(5))&&"null".equals(list.get(6))
//				&&"null".equals(list.get(7))&&"null".equals(list.get(8))
//				&&"null".equals(list.get(9))&&!"null".equals(list.get(3))){
//			ArrayList<Book> listBook = this.loadBookByPublisher(list.get(3).replace("20%", "+"), currPage);
//			return listBook;
//		}
        String tempRank = "";
		if("bookPublishTime".equals(rankKind))
			tempRank = " order by book.bookPublishTime desc ";
		else if("bookFixPrice".equals(rankKind))
			tempRank = " order by book.bookFixPrice asc ";	
        /*获得查询sql*/
	    String temp = this.getSQL(list);
		String sql = "select {book.*} from bookinfo book " + temp + tempRank;
		
		SQLQuery query = this.getSession().createSQLQuery(sql);
		query.addEntity("book", Book.class);
		/*设置分页*/
        query.setFirstResult((currPage-1)*10);
        query.setMaxResults(10);
		ArrayList<Book> listBook = (ArrayList<Book>) query.list();

//		Iterator it1 = listBook.iterator();
//		Book book1 = null;
//		while (it1.hasNext()) {
//			book1 = (Book) it1.next();
//			System.out.println("bookName"+book1.getBookName()+"TIme"+book1.getBookPublishTime()+"Prince"+book1.getBookFixPrice());
//		}

		return (ArrayList<Book>) listBook;

	}
	/**
	* Function:  loadAdvancedBookNum
	* Description: 从数据库中获得满足高级搜索条件的记录总数
	* Calls:  this.getSQL()
	* Called By:  AdvancedSearchAction.execute()
	* @param list as ArrayList<String>
	* @return long
	* @throws no
	*/
	public long loadAdvancedBookNum(String keyword) {
		
		ArrayList<String> list = new ArrayList<String> ();
		StringTokenizer st = new StringTokenizer(keyword, "+");
		
		while (st.hasMoreElements()) {
			/*因为分词之后会有一个是空的,所以进行一下判断*/
			list.add(st.nextToken());
		}
//		/*只包含书名时,按分类搜索中书名搜索进行*/
//		if("null".equals(list.get(1))&&"null".equals(list.get(2))
//				&&"null".equals(list.get(3))&&"null".equals(list.get(4))
//				&&"null".equals(list.get(5))&&"null".equals(list.get(6))
//				&&"null".equals(list.get(7))&&"null".equals(list.get(8))
//				&&"null".equals(list.get(9))&&!"null".equals(list.get(0))){
//			long num = this.loadBookNumByName(list.get(0).replace("20%", "+"));
//			return num;
//		}else if("null".equals(list.get(0))&&"null".equals(list.get(2))
//				&&"null".equals(list.get(3))&&"null".equals(list.get(4))
//				&&"null".equals(list.get(5))&&"null".equals(list.get(6))
//				&&"null".equals(list.get(7))&&"null".equals(list.get(8))
//				&&"null".equals(list.get(9))&&!"null".equals(list.get(1))){
//			long num = this.loadBookNumByAuthor(list.get(1).replace("20%", "+"));
//			return num;
//		}else if("null".equals(list.get(0))&&"null".equals(list.get(1))
//				&&"null".equals(list.get(2))&&"null".equals(list.get(4))
//				&&"null".equals(list.get(5))&&"null".equals(list.get(6))
//				&&"null".equals(list.get(7))&&"null".equals(list.get(8))
//				&&"null".equals(list.get(9))&&!"null".equals(list.get(3))){
//			long num = this.loadBookPublisherNum(list.get(3).replace("20%", "+"));
//			return num;
//		}

		/*获得查询sql*/
		String temp = this.getSQL(list);
		String sql = "select {book.*} from bookinfo book "+temp;
		SQLQuery query = this.getSession().createSQLQuery(sql);
		query.addEntity("book", Book.class);
		List temList = query.list();
		long num = temList.size();
		return num;
	}
	/**
	* Function:  loadBookByName
	* Description: 从数据库中获得按书名方式检索的所有记录
	* Calls:  no
	* Called By:  this.loadBook()
	* @param bookName as String,currPage as int
	* @return ArrayList<Book>
	* @throws no
	*/
	private ArrayList<Book> loadBookByName(String bookName,int currPage){
		
		ArrayList<Book> result = new ArrayList<Book>();
        ArrayList<Book> result1 = new ArrayList<Book>();
        ArrayList<Book> result2 = new ArrayList<Book>();
        ArrayList<Book> result3 = new ArrayList<Book>();
        ArrayList<Book> result4 = new ArrayList<Book>();
        
		final List<String> keywordArr = new ArrayList<String>();
		/*按" "和"+"进行分词处理,分成单独的一条条记录*/
		StringTokenizer st = new StringTokenizer(bookName, " ");
		
		while (st.hasMoreElements()) {

			keywordArr.add(st.nextToken());
		}
		//System.out.println("关键字个数:"+keywordArr.size());
		/*如果输入的关键字不是一个时的查询方式*/
		if(keywordArr.size()>1){

            /*多个关键字同时存在时*/
			String tem1 = "from Book as book where";	
			 
		     for(int i = 0;i<keywordArr.size();i++){
		        	
		        tem1 += " book.bookName like :bookname"+i+ " and"; 
            }
		    final String strHql1 = tem1.substring(0, tem1.length()-3);
		    /*处理分页*/
		    final int firstResult = (currPage-1)*10;
		    final int firstEndResult = 10;
	        result1 = (ArrayList<Book>) this .getHibernateTemplate().executeFind( new  HibernateCallback()  {
	              public  List doInHibernate(Session session){
	                 Query query = session.createQuery( strHql1);
	                 for(int j = 0;j<keywordArr.size();j++)
	                 query.setString("bookname"+j, "%"+keywordArr.get(j)+"%");
	                 query.setFirstResult(firstResult);
	                 query.setMaxResults(firstEndResult);
	                 return  query.list();
	             }
	        } );
//            System.out.println("result1:"+result1.size());
//	        for(int i = 0;i<result1.size();i++){
//	            System.out.println("result1>>"+result1.get(i).getBookName());  
//	        }
	       
	        /*多个关键字同时匹配不够十条时,进行不同时匹配查询*/
	        if(result1.size()<10){
	        	
	        	 /*完全匹配的记录总数*/
		    	long firstNum = 0;
				String firstHql = "select count(*) from Book as book where";	
					 
				for(int i = 0;i<keywordArr.size();i++){
				        	
					 firstHql += " book.bookName like ? and"; 
                }
				firstHql =firstHql.substring(0, firstHql.length()-3);
				String []temKey = new String[keywordArr.size()];
				for(int j = 0;j<keywordArr.size();j++)temKey[j] = "%" + keywordArr.get(j) + "%";
		        List firstList = this.getHibernateTemplate().find(firstHql, temKey);
		        if(null != firstList)
		        firstNum =  (Long)firstList.get(0);
		        //System.out.println("firstNum:"+firstNum);
				String tem2 = "from Book as tushu where (";	
				 
			    for(int i = 0;i<keywordArr.size();i++){
			        	
			        tem2 += " tushu.bookName like :namebook"+i+ " or"; 
                }
			    final String strHq2 = tem2.substring(0, tem2.length()-2) + ")and not exists ("+strHql1+"and tushu.id=book.id)";
			    /*处理分页*/
			    final int secondResult = (int) ((currPage-1)*10 - firstNum);
			    final int secondEndResult = 10-result1.size();
		        result2 = (ArrayList<Book>) this .getHibernateTemplate().executeFind( new  HibernateCallback()  {
		              public  List doInHibernate(Session session){
		                 Query query = session.createQuery( strHq2);
		                 for(int j = 0;j<keywordArr.size();j++)
		                     query.setString("namebook"+j, "%"+keywordArr.get(j)+"%");
		                 for(int k = 0;k<keywordArr.size();k++)
			                 query.setString("bookname"+k, "%"+keywordArr.get(k)+"%");
		                 query.setFirstResult(secondResult);
		                 query.setMaxResults(secondEndResult);
		                 return  query.list();
		             }
		       });
//	            System.out.println("result2:"+result2.size());
//		        for(int i = 0;i<result2.size();i++){
//		            System.out.println("result2>"+result2.get(i).getBookName());  
//		        } 				        
	       }  
	       /*如果关键字同时存在与不同时存在的匹配记录数之和不够当前显示,则对每个关键字分词后查询*/ 
	       if(result1.size() + result2.size() < 10){
	    	   
		    	long secondNum = 0;
				String secondHql = "select count(*) from Book as book where";	
					 
				for(int i = 0;i<keywordArr.size();i++){
				        	
					secondHql += " book.bookName like ? or"; 
                }
				secondHql =secondHql.substring(0, secondHql.length()-2);
				String []temKey = new String[keywordArr.size()];
				for(int j = 0;j<keywordArr.size();j++)temKey[j] = "%" + keywordArr.get(j) + "%";
		        List firstList = this.getHibernateTemplate().find(secondHql, temKey);
		        if(null != firstList)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -