(转)Spring集成MyBatis进行项目开发(三)

Dullonjiang 2013-12-27

 Spring集成MyBatis进行项目开发(一)

     Spring集成MyBatis进行项目开发(二)

    上两章进行了相关环境的配置和测试,接下来是将继续这个样例系统的Dao层,service层和controller层。

    AppDao.java

package com.pinche.statistic.dao;  
  
import java.util.List;  
  
import com.pinche.statistic.domain.Application;  
  
public interface AppDao {  
    boolean add(Application app);  
  
    boolean delete(String appAccount);  
  
    boolean update(Application app);  
  
    Application findByAppAccount(String appAccount);  
      
    List<Application> findAll();  
}  

 AppDaoImpl.java

package com.pinche.statistic.dao.impl;  
  
import java.util.List;  
  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.dao.DataAccessException;  
import org.springframework.stereotype.Repository;  
  
import com.pinche.statistic.dao.AppDao;  
import com.pinche.statistic.domain.Application;  
import com.pinche.statistic.mapper.ApplicationsMapper;  
  
@Repository  
public class AppDaoImpl implements AppDao {  
  
    @Autowired  
    private ApplicationsMapper mapper;  
      
    @Override  
    public boolean add(Application app) {  
        try {  
            mapper.add(app);  
            return true;  
        } catch (DataAccessException e) {  
            e.printStackTrace();  
        }  
        return false;  
    }  
  
    @Override  
    public boolean delete(String appAccount) {  
        try {  
            mapper.delete(appAccount);  
            return true;  
        } catch (DataAccessException e) {  
            e.printStackTrace();  
        }  
        return false;  
    }  
  
    @Override  
    public boolean update(Application app) {  
        try {  
            mapper.update(app);  
            return true;  
        } catch (DataAccessException e) {  
            e.printStackTrace();  
        }  
        return false;  
    }  
  
    @Override  
    public Application findByAppAccount(String appAccount) {  
        try {  
            Application findByAppAccount = mapper.findByAppAccount(appAccount);  
            return findByAppAccount;  
        } catch (DataAccessException e) {  
            e.printStackTrace();  
        }  
        return null;  
    }  
  
    @Override  
    public List<Application> findAll() {  
        try {  
            return mapper.findAll();  
        } catch (DataAccessException e) {  
            e.printStackTrace();  
        }  
        return null;  
    }  
}  

    自行设计的DAO层对象容器(在DAO对象很多时,如果在service层要调用对应的DAO还得手动注入,通过引用这个DAO层对象容器,可以实现在需要使用DAO时迅速找需要的DAO,省去了繁杂的手动注入,而且spring默认的bean都是单例的,无论在何处注入一个实体bean其实都是同一个。这样做更方便):

package com.pinche.statistic.dao;  
  
import java.lang.reflect.Field;  
  
import javax.annotation.PostConstruct;  
  
import org.slf4j.Logger;  
import org.slf4j.LoggerFactory;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.stereotype.Repository;  
  
@Repository  
public class BaseDAL {  
  
    private static final Logger logger = LoggerFactory.getLogger(BaseDAL.class);  
      
    @Autowired  
    private AppDao _appDao;  
    public static AppDao appDao;  
  
    @Autowired  
    private MetaDataDao _metaDataDao;  
    public static MetaDataDao metaDataDao;  
  
    @Autowired  
    private DDLManager _DDLManager;  
    public static DDLManager DDLManager;  
      
    @Autowired  
    private AnalyzeDao _analyzeDao;  
    public static AnalyzeDao analyzeDao;  
      
    @Autowired  
    private DialstatisticsDao _dialstatisticsDao;  
    public static DialstatisticsDao dialstatisticsDao;  
  
    @PostConstruct  
    public void init() {  
        long start = System.currentTimeMillis();  
        logger.debug("start init BaseDAL ...");  
        try {  
  
            Field[] fields = this.getClass().getDeclaredFields();  
  
            for (int i = 0; i < fields.length; i++) {  
                String fieldname = fields[i].getName();  
                if (fieldname.startsWith("_")) {  
                    String sfieldname = fieldname.substring(1);  
                    Field sfield = this.getClass().getDeclaredField(sfieldname);  
                    sfield.setAccessible(true);  
                    sfield.set(this, fields[i].get(this));  
                }  
            }  
            logger.debug("init BaseDAL OVER, consume = {}ms",  
                    System.currentTimeMillis() - start);  
        } catch (IllegalArgumentException e) {  
            e.printStackTrace();  
        } catch (NoSuchFieldException e) {  
            e.printStackTrace();  
        } catch (SecurityException e) {  
            e.printStackTrace();  
        } catch (IllegalAccessException e) {  
            e.printStackTrace();  
        }  
    }  
}  

如果使用了以上的层管理容器,如果要在容器中添加一个DAO(例如:DemoDao),只需在这个容器中添加一个这样的声明:

@Autowired  
private DemoDao _demoDao;  
public static DemoDao demoDao;  

    好了下面是service层定义的接口:

    AppService.java

package com.pinche.statistic.service;  
  
import java.util.List;  
  
import com.pinche.statistic.domain.Application;  
  
/** 
 * @author JACKWANG 
 * @since Dec 23, 2013 
 */  
public interface AppService {  
      
    Application find(String appAccount);  
      
    boolean update(Application app);  
      
    boolean setDisable(String appAccount);  
      
    boolean setEnable(String appAccount);  
      
    List<Application> findAll();  
      
}  

    AppServiceImpl.java : AppService的实现类:

package com.pinche.statistic.service.impl;  
  
import java.util.List;  
  
import org.slf4j.Logger;  
import org.slf4j.LoggerFactory;  
import org.springframework.stereotype.Service;  
  
import com.pinche.statistic.dao.BaseDAL;  
import com.pinche.statistic.domain.Application;  
import com.pinche.statistic.service.AppService;  
import com.pinche.statistic.utils.SystemUtils;  
  
/** 
 * @author JACKWANG 
 * @since Dec 23, 2013 
 */  
@Service  
public class AppServiceImpl implements AppService {  
  
    private static final Logger logger = LoggerFactory  
            .getLogger(AppServiceImpl.class);  
  
    @Override  
    public Application find(String appAccount) {  
        return BaseDAL.appDao.findByAppAccount(appAccount);  
    }  
  
      
    @Override  
    public boolean update(Application app) {  
        String appAccount = app.getAppAccount();  
        if (appAccount == null && "".equals(appAccount)) {  
            return true;  
        }  
        return BaseDAL.appDao.update(app);  
    }  
  
    @Override  
    public boolean setDisable(String appAccount) {  
        Application app = new Application();  
        app.setAppAccount(appAccount);  
        app.setIsDisable(Application.APP_DISABLE);  
        return BaseDAL.appDao.update(app);  
    }  
  
    @Override  
    public boolean setEnable(String appAccount) {  
        Application app = new Application();  
        app.setAppAccount(appAccount);  
        app.setIsDisable(Application.APP_ENABLE);  
        return BaseDAL.appDao.update(app);  
    }  
  
    @Override  
    public List<Application> findAll() {  
        return BaseDAL.appDao.findAll();  
    }  
}  

   哈哈,使用层对象管理容器是不是很方便。通过一个引用就能获得所有的DAO支持。所以我在service层也构建了一个service层对象管理容器BaseBLL:

BaseBLL.java:

package com.pinche.statistic.service;  
  
import java.lang.reflect.Field;  
  
import javax.annotation.PostConstruct;  
  
import org.slf4j.Logger;  
import org.slf4j.LoggerFactory;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.stereotype.Service;  
  
/** 
 * @author JACKWANG 
 * @since Dec 23, 2013 
 */  
@Service  
public class BaseBLL {  
      
    private static final Logger logger = LoggerFactory.getLogger(BaseBLL.class);  
      
    @Autowired  
    private AnalyzeService _analyzeService;  
    public static AnalyzeService analyzeService;  
  
    @Autowired  
    private AppService _appService;  
    public static AppService appService;  
  
    @Autowired  
    private MetaDataService _metaDataService;  
    public static MetaDataService metaDataService;  
  
    @PostConstruct  
    public void init() {  
        long start = System.currentTimeMillis();  
        logger.debug("start init BaseBLL ...");  
        try {  
  
            Field[] fields = this.getClass().getDeclaredFields();  
  
            for (int i = 0; i < fields.length; i++) {  
                String fieldname = fields[i].getName();  
                if (fieldname.startsWith("_")) {  
                    String sfieldname = fieldname.substring(1);  
                    Field sfield = this.getClass().getDeclaredField(sfieldname);  
                    sfield.setAccessible(true);  
                    sfield.set(this, fields[i].get(this));  
                }  
            }  
            logger.debug("init BaseBLL OVER, consume = {}ms",  
                    System.currentTimeMillis() - start);  
        } catch (IllegalArgumentException e) {  
            e.printStackTrace();  
        } catch (NoSuchFieldException e) {  
            e.printStackTrace();  
        } catch (SecurityException e) {  
            e.printStackTrace();  
        } catch (IllegalAccessException e) {  
            e.printStackTrace();  
        }  
    }  
  
}  

   

    好了下面应该是controller层的编写了,但是由于笔者以上的代码只是摘录了系统中的部分,而在controller中涉及到其他的内容,如果直接摘录可能和以上的代码衔接不上。所以这里就不进行了controller层的具体介绍了。本系统controller层使用的是SpringMVC,开发效率一级赞。

相关推荐