前面已經實現了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);
}
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);
}
}
上面公用寫完,現在寫具體實現.
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的配置.