(菜鳥來動手-第四天)SSM整合之BaseService,BaseDao

前面已經實現了SSM的整合, 但是在實際開發中,很多模塊都會有增刪改查操作.將這些共用操作抽取個公用的出來,能少很多事.

1.實現baseDao

2.實現baseService

3.具體模塊實現

4.測試


1.實現baseDao

mybatis中,實現sql都是用namespace+上sql的id, 而namespace一般都是用model的路徑+名稱.

所以baseDao的重點就是找到需要調用的sql的id.也就是找到調用的model.

這裏就要用到泛型和發射來獲得.


1) 先定義baseDao,定義2個方法.

package com.dingcheng.common.dao;

import java.io.Serializable;

public interface BaseDao<T> {
    public T get(Serializable id);
    public int insert(T model);
}


2) 實現baseDao

package com.dingcheng.common.dao.impl;

import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert;

import com.dingcheng.common.dao.BaseDao;
import com.dingcheng.common.exception.MySqlException;
import com.dingcheng.common.util.GenericsUtils;

public class BaseDaoImpl<T>  implements BaseDao<T>  {
	private Logger logger = Logger.getLogger(BaseDaoImpl.class);
	
    //從spring注入原有的sqlSessionTemplate
	@Autowired  
    private SqlSessionTemplate sqlSession;  
	
	protected Class<T> entityClass;
	protected String sqlMapNamespace;
	
	public static final String POSTFIX_SELECT = ".select";
	public static final String POSTFIX_INSERT = ".insert";
	
	public String getSqlMapNamespace() {
		return sqlMapNamespace;
	}
	
	protected SqlSessionTemplate getSqlSession(){
		return sqlSession;
	}
	
	/**
	 * 在構造函數中將泛型T.class賦給entityClass.
	 * sqlNamespace 帶包名
	 */
	@SuppressWarnings("unchecked")
	public BaseDaoImpl() {
		entityClass = GenericsUtils.getSuperClassGenricType(getClass());
		sqlMapNamespace = entityClass.getName();
	}
	
	@Override
	public T get(Serializable id) {
		if(id==null) return null;
		return sqlSession.selectOne(sqlMapNamespace+POSTFIX_SELECT,id);
	}

	@Override
	public int insert(T o) {
		return sqlSession.insert(sqlMapNamespace+POSTFIX_INSERT, o);
	}
	
}

這裏的重點就是在 baseDaoImpl的構造函數,裏面獲取到了sql的namespace, getSuperClassGenricType方法如下

	public static Class getSuperClassGenricType(Class clazz) {
		Type genType = clazz.getGenericSuperclass();
		if (!(genType instanceof ParameterizedType)) {
			return Object.class;
		}

		Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
		if (!(params[0] instanceof Class)) {
			return Object.class;
		}
		return (Class) params[0];
	}


2.實現baseService

baseService很簡單,只用調用對應的dao層的方法即可.  所以只需要有對應的dao對象即可. 但是用註解的話,沒法直接注入. 所以只有把getBaseDao放到具體的service中實現.


package com.dingcheng.common.service;

import com.dingcheng.common.dao.BaseDao;

public abstract class BaseService<T> {
	
	public BaseService(){}
	
	/**
	 * 由業務類實現
	 * @return
	 */
	public abstract BaseDao<T> getBaseDao();
	
	/**
	 * 根據id,查詢單個
	 * @param id
	 * @return
	 */
    public T get(Integer id){
    	return getBaseDao().get(id);
    }
    
    /**
     * 插入單個對象
     * @param model
     * @return
     */
    public int create(T model){
    	return getBaseDao().insert(model);
    }
    
}


3.具體模塊實現

上面公用寫完,現在寫具體實現.

package com.dingcheng.sys.dao;

import com.dingcheng.common.dao.BaseDao;
import com.dingcheng.sys.model.User;

public interface UserDao extends BaseDao<User>{

}


package com.dingcheng.sys.dao.impl;

import org.springframework.stereotype.Repository;

import com.dingcheng.common.dao.impl.BaseDaoImpl;
import com.dingcheng.sys.dao.UserDao;
import com.dingcheng.sys.model.User;

@Repository("userDaoImpl")
public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao {

}


package com.dingcheng.sys.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.dingcheng.common.dao.BaseDao;
import com.dingcheng.common.service.BaseService;
import com.dingcheng.sys.dao.UserDao;
import com.dingcheng.sys.model.User;


@Service("userService")
public class UserService extends BaseService<User> {

	@Autowired
	private UserDao userDaoImpl;
	
	@Override
	public BaseDao<User> getBaseDao() {
		return userDaoImpl;
	}
	
}

可以看到, userDao 和 userService 裏面 都很簡單.


4.測試

package com.dingcheng.sys.service;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.dingcheng.sys.model.User;


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:application-context.xml"})
public class UserServiceTest {
	@Autowired
	private UserService userService;
	
	
	@Test
	public void testSave(){
		User user = new User();
		user.setLoginName("loginName");
		user.setPassword("password");
		userService.create(user);
	}
	
}


源碼地址:

https://code.csdn.net/qq315737546/ssmq/tree/master

裏面有更多的公用方法以及quartz的配置.



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章