pangxia75 发表于 2016-11-28 06:10:04

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

原文出处:http://wangjie2013.iyunv.com/blog/1996151
上一章Spring集成MyBatis进行项目开发(一)已经介绍了spring和mybatis整合的配置,接下来是一个项目里面的部分代码:
    Application.java是下面会用到的一个实体bean:
 
Java代码  


[*]public class Application {  
[*]  
[*]    public static final int APP_DISABLE = 0;  
[*]    public static final int APP_ENABLE = 1;  
[*]    private Integer id;  
[*]    private String appAccount;//每个app对应一个账户标识;对应生成的数据表  
[*]    private String appName;  
[*]    private String appICON;  
[*]    private String appDesc;  
[*]    private String appURL;  
[*]    private Date createTime;  
[*]    private int isDisable;//'是否前台显示:0显示,1不显示'   
[*]}  

    getter 和setter略。
 
 
    首先我们要编写一个与mapper.xml文件映射的接口文件,mybatis会将这个接口文件和对应的mapper文件中的sql语句关联,自动实现这个接口文件。在之后的开发中我们直接调用这个接口文件就可以了,因为内存中已经有接口相对应的实例了。
ApplicationsMapper.xml文件:
 
Xml代码  


[*]<?xml version="1.0" encoding="UTF-8" ?>   
[*]<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"   
[*]    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
[*]  
[*]<mapper namespace="com.pinche.statistic.mapper.ApplicationsMapper">  
[*]  
[*]    <insert id="add" parameterType="Application" useGeneratedKeys="true"  
[*]        keyProperty="id">  
[*]        INSERT INTO applications  
[*]        (appName,appAccount,appICON,appDesc,appURL,createTime)  
[*]        VALUES  
[*]        (#{appName},#{appAccount},#{appICON},#{appDesc},#{appURL},#{createTime})  
[*]    </insert>  
[*]  
[*]    <delete id="delete" parameterType="String">  
[*]        DELETE FROM applications WHERE  
[*]        appAccount = #{appAccount}  
[*]    </delete>  
[*]  
[*]    <update id="update" parameterType="Application">  
[*]        UPDATE applications  
[*]        <set>  
[*]            <if test=" appName != '' and appName != null ">  
[*]                appName = #{appName},  
[*]            </if>  
[*]            <if test=" appICON != '' and appICON != null ">  
[*]                appICON = #{appICON},  
[*]            </if>  
[*]            <if test=" appDesc != '' and appDesc != null ">  
[*]                appDesc = #{appDesc},  
[*]            </if>  
[*]            <if test=" appURL != '' and appURL != null ">  
[*]                appURL = #{appURL},  
[*]            </if>  
[*]            <if test=" isDisable != -1 ">  
[*]                isDisable = #{isDisable}  
[*]            </if>  
[*]        </set>  
[*]        WHERE appAccount = #{appAccount}  
[*]    </update>  
[*]  
[*]    <select id="findByAppAccount" resultType="Application"  
[*]        parameterType="String">  
[*]        select * from applications where appAccount =  
[*]        #{appAccount}  
[*]    </select>  
[*]  
[*]    <select id="findAll" resultType="Application">  
[*]        select * from applications  
[*]    </select>  
[*]</mapper>   

    对ApplicationsMapper.xml文件的配置必须要注意的是它的命名空间是必须的,而且是对应接口文件的全名!并且每个sql语句的id属性和接口文件中的方法名一致!!
 
 
    下面是ApplicationsMapper.java文件,也就是对应的接口文件:
 
Java代码  


[*]package com.pinche.statistic.mapper;  
[*]  
[*]import java.util.List;  
[*]  
[*]import com.pinche.statistic.domain.Application;  
[*]  
[*]public interface ApplicationsMapper {  
[*]  
[*]    void add(Application app);  
[*]  
[*]    void delete(String appAccount);  
[*]  
[*]    void update(Application app);  
[*]  
[*]    Application findByAppAccount(String appAccount);  
[*]  
[*]    List<Application> findAll();  
[*]}  

 
 
    通过以上的的配置,大家可以在test中测试一下自己的代码了:
Java代码  


[*]@Test  
[*]public void testCreateTable() {  
[*]    ApplicationContext aContext = new FileSystemXmlApplicationContext("src/main/webapp/WEB-INF/applicationContext.xml");  
[*]    ApplicationsMapper mapper = (ApplicationsMapper) aContext.getBean(ApplicationsMapper.class);  
[*]      
[*]    Application app = new Application();  
[*]    app.setAppAccount("androidApp");  
[*]      
[*]    mapper.add(app);  
[*]}  

 
    以上测试了add方法,其他的测试方法大家可以照着写一写。如果插入成功恭喜,你的环境已经搭好了。
 
 
    接下来是将继续这个样例系统的Dao层,service层和controller层。
   AppDao.java
 
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
 
 
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其实都是同一个。这样做更方便):
 
Java代码  


[*]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.getName();  
[*]                if (fieldname.startsWith("_")) {  
[*]                    String sfieldname = fieldname.substring(1);  
[*]                    Field sfield = this.getClass().getDeclaredField(sfieldname);  
[*]                    sfield.setAccessible(true);  
[*]                    sfield.set(this, fields.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),只需在这个容器中添加一个这样的声明:
 
Java代码  


[*]@Autowired  
[*]private DemoDao _demoDao;  
[*]public static DemoDao demoDao;  

 
 
    好了下面是Service层定义的接口:
   AppService.java
 
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的实现类:
 
Java代码  


[*]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:
 
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.getName();  
[*]                if (fieldname.startsWith("_")) {  
[*]                    String sfieldname = fieldname.substring(1);  
[*]                    Field sfield = this.getClass().getDeclaredField(sfieldname);  
[*]                    sfield.setAccessible(true);  
[*]                    sfield.set(this, fields.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,开发效率一级赞。
页: [1]
查看完整版本: (转)Spring集成MyBatis进行项目开发(二)