Spring+Hibernate 创建BaseServiceImpl

作者:Runtime   阅读 (3729)  |  收藏 (0)  |  点赞 (0)

摘要

Service 层的很多方法也许不一定逐个对应的 去实现, 而可以创建一个BaseServiceImpl然后去继承它


原文链接:Spring+Hibernate 创建BaseServiceImpl

使用BaseDaoImpl可以提高代码的利用率,也是java开发所提倡的,同样实现BaseService也是有其道理的(个人见解)。

实现这个BaseServiceImpl的关键点在于准确的传递给BaseDaoImpl泛型的类型,另外 注意,基于继承BaseServiceIml时,需要使用多例来注入BaseServiceImp的BaseDao对象。如何对BaseDaoImpl进行注入泛型类型和其类名是个难点,

最早我采用的是通过在BaseSericeImp的构造方法中使用set注入,发现此时的BaseDao还没有被注入,通过查阅资料发现使用@PostConstruct就可以 后文有概述,详情请查看相关资料。

在这里只粘贴部分关键代码

BaseDao:

public interface BaseDao<T> {
	T get(int id);
	void save(T entity);
	public String getTableName();
	void setEntityName(Class<?> entityName);
	void setTableName(String tableName);
	public void setHibernateTemplate(HibernateTemplate hibernateTemplate);
}

BaseDaoImpl:

@Repository("baseDao")//Spring 的注解
@Scope("prototype")//多例
public class BaseDaoImpl<T> implements BaseDao<T>{

	private String tableName;
	
	//注入Hibernate模板类
	@Resource
	private HibernateTemplate hibernateTemplate;
	
	@Resource
	private JdbcTemplate jdbcTemplate;
	/**
	 * @Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上
	 * @Resource(这个注解属于J2EE的),默认安照名称进行装配,名称可以通过name属性进行指定
	 * Resource(name="hibernateTemplate")
	 * 
	 */
	private Class<?> entityName;//Dao的泛型类,即子类所指定的T所对应的类型
	
	public BaseDaoImpl(){//通过反射获取子类Dao,对应第泛型实体类
		entityName = GenericsUtils.getSuperClassGenricType(getClass());
		tableName = entityName.getSimpleName();
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public T get(int id) {
		return (T) hibernateTemplate.get(entityName, id);
	}

	@Override
	public void save(T entity) {
		hibernateTemplate.save(entity);
	}
	......
}

BaseService:

public interface BaseService<T> {
	T get(int id);
	void save(T entity);
}

BaseServiceImpl:

public class BaseServiceImpl<T> implements BaseService<T> {

	@Resource
	private BaseDao<T> baseDao;
	
	public BaseServiceImpl(){
		
	}
	//在构造方法和Spring注入后执行
	@PostConstruct
	public void initService(){
		String className;
		Class<?> clasz;
		clasz = GenericsUtils.getSuperClassGenricType(getClass());
		className = clasz.getSimpleName();
		baseDao.setEntityName(clasz);
		baseDao.setTableName(className);
	}
	@Override
	public T get(int id) {
		return baseDao.get(id);
	}

	@Override
	public void save(T entity) {
		baseDao.save(entity);
	}
}

Test:

@Entity
@Table(name = "test")
public class Test {
	private int id;
	private String name;
	private String parentName;
	private String levels;
	private String text;
	
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getParentName() {
		return parentName;
	}
	public void setParentName(String parentName) {
		this.parentName = parentName;
	}
	public String getLevels() {
		return levels;
	}
	public void setLevels(String levels) {
		this.levels = levels;
	}
	public String getText() {
		return text;
	}
	public void setText(String text) {
		this.text = text;
	}	
}

TestDao:

public interface TestDao extends BaseDao<Test> {
//可以写扩展接口
}

TestDaoImpl:

@Repository("testDao")
public class TestDaoImpl extends BaseDaoImpl<Test> implements TestDao{
//可以实现扩展接口
}

TestService:

public interface TestService extends BaseService<Test>{
}

TestSericeImpl:

@Service("testService")
public class TestServiceImpl extends BaseServiceImpl<Test> implements TestService{
	@Resource
	private  TestDao testDao;//使用扩展接口是调用	
}

TestController:

@Controller
@RequestMapping("test")
public class TestController {
	@Resource
	private TestService testService;
	
	@RequestMapping("/testdata")
	public static String test1(){
		return "testdata";//测试页面
	}
	@RequestMapping("/testget")
	public void test2(){
		System.out.println(testService.get(1).getName());
	}
	@RequestMapping("/create")
	public @ResponseBody String create(Test t){
		System.out.println(t.getId());
		Map<String, Object> map = new HashMap<>();
		testService.save(t);
		map.put("status", "ok");
		return JSON.toJSONString(map);
	}
}

testdata.jsp:测试用 很简陋

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html>
<html>
<head>
	<base href="<%=basePath%>">
</head>
<body>
	<div>
		<form id="form1">
		<div><input type="text" name="id"></div>
		<div><input type="text" name="name"></div>
		<div><input type="text" name="parentName"></div>
		<div><input type="text" name="levels"></div>
		<div><input type="text" name="text"></div>
			<button type="button" id="record">提交</button>
		</form>
	</div>
	<script src="js/jquery.min.js"></script>
	<script src="js/layer/layer.js"></script>
	<script type="text/javascript">
	$('#record').click(function(){
		 var formParam = $("#form1").serialize();
		    $.ajax({  
		        type:'post',      
		        url: "test/create",
		        data:formParam,
		        cache:false,
		        dataType:'json',  
		        success:function(data){
		        	layer.load(2);
       			setTimeout(function(){
       				layer.closeAll('loading');
       			}, 2000);
		        	if(data.msg === "true"){
		        		layer.alert('操作成功!', {icon: 1});
		        		$('#Modal').modal('hide');
		        	}else{
		        		layer.alert('操作失败!请稍后重试', {icon: 0});
		        	}
		         },  
		         error : function() {  
		        	 layer.alert('异常!请稍后重试', {icon: 3});  
		         }
		    });
   	});
	</script>
</body>
</html>

粘贴复制中可能会出现错误,还有一些不太重要的代码 比如基本的配置文件 get set方法等 未给出

分类   hibernate
字数   5192

博客标签    Hibernate   Spring   Spring MVC  

评论