ssm(springmvc4+spring4+mybatis3)整合实战-个人博客系统-dao与service层等组件整合
这一篇博客,我把mybatis逆向工程生成的dao与service层分享出来,另外,我在第一篇博客时贴出的web.xml中配置了一个InitComponent,即初始化组件:
com.steadyjack.service.impl.InitComponent
这个组件的作用在于启动时获取系统首页所需要的各个model的信息,加快首页index.html的访问速度。下面先贴出这个组件的源码吧:
在package com.steadyjack.service.impl 下建立 InitComponent.java类:
package com.steadyjack.service.impl;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import com.steadyjack.entity.Blog;
import com.steadyjack.entity.BlogType;
import com.steadyjack.entity.Blogger;
import com.steadyjack.entity.Link;
import com.steadyjack.service.BlogService;
import com.steadyjack.service.BlogTypeService;
import com.steadyjack.service.BloggerService;
import com.steadyjack.service.LinkService;
/**
* title:InitComponent.java
* description:初始化组件 把博主信息 根据博客类别分类信息 根据日期归档分类信息
* 存放到application中,用以提供页面请求性能
* time:2017年1月16日 下午10:36:50
* author:debug-steadyjack
*/
@Component
public class InitComponent implements ServletContextListener,ApplicationContextAware{
//其实这个就是spring的IOC容器-spring上下文应用程序
private static ApplicationContext applicationContext;
@SuppressWarnings("static-access")
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext=applicationContext;
}
public void contextInitialized(ServletContextEvent servletContextEvent) {
//application:整个应用的上下文应用程序,可以往此对象中绑定一些经常需要访问的对象
ServletContext application=servletContextEvent.getServletContext();
//Spring IOC容器中获取各个bean
BloggerService bloggerService=(BloggerService) applicationContext.getBean("bloggerService");
Blogger blogger=bloggerService.find(); // 查询博主信息
blogger.setPassword(null);
application.setAttribute("blogger", blogger);
BlogTypeService blogTypeService=(BlogTypeService) applicationContext.getBean("blogTypeService");
List blogTypeCountList=blogTypeService.countList(); // 查询博客类别以及博客的数量
application.setAttribute("blogTypeCountList", blogTypeCountList);
BlogService blogService=(BlogService) applicationContext.getBean("blogService");
List blogCountList=blogService.countList(); // 根据日期分组查询博客
application.setAttribute("blogCountList", blogCountList);
LinkService linkService=(LinkService) applicationContext.getBean("linkService");
List linkList=linkService.list(null); // 查询所有的友情链接信息
application.setAttribute("linkList", linkList);
String ctx=application.getRealPath("/");
System.out.println("根路径: "+ctx);
application.setAttribute("ctx", ctx);
}
public void contextDestroyed(ServletContextEvent sce) {
}
}
然后,会发现这个初始化组件InitComponent.java用到了ioc容器的各个service组件,故而,下面建立service层各个组件:
在package com.steadyjack.service下建立BloggerService.java,BlogService.java,BlogTypeService.java,CommentService.java,LinkService.java各个interface(接口类),源码如下:
BloggerService.java接口类:
package com.steadyjack.service;
import com.steadyjack.entity.Blogger;
/**
* title:BloggerService.java
* description:博主Service接口
* time:2017年1月16日 下午10:00:20
* author:debug-steadyjack
*/
public interface BloggerService {
/**
* 查询博主信息
* @return
*/
public Blogger find();
/**
* 通过用户名查询用户
* @param userName
* @return
*/
public Blogger getByUserName(String userName);
/**
* 更新博主信息
* @param blogger
* @return
*/
public Integer update(Blogger blogger);
}
BlogService.jave接口类:
package com.steadyjack.service;
import java.util.List;
import java.util.Map;
import com.steadyjack.entity.Blog;
/**
* title:BlogService.java
* description:博客Service接口
* time:2017年1月16日 下午10:35:32
* author:debug-steadyjack
*/
public interface BlogService {
/**
* 根据日期月份分组查询
* @return
*/
public List countList();
/**
* 分页查询博客
* @return
*/
public List list(Map map);
/**
* 获取总记录数
* @param map
* @return
*/
public Long getTotal(Map map);
/**
* 通过Id查找实体
* @param id
* @return
*/
public Blog findById(Integer id);
/**
* 更新博客信息
* @param blog
* @return
*/
public Integer update(Blog blog);
/**
* 获取上一个博客
* @param id
* @return
*/
public Blog getLastBlog(Integer id);
/**
* 获取下一个博客
* @param id
* @return
*/
public Blog getNextBlog(Integer id);
/**
* 添加博客信息
* @param blog
* @return
*/
public Integer add(Blog blog);
/**
* 删除博客信息
* @param id
* @return
*/
public Integer delete(Integer id);
/**
* 查询指定的博客类别下的博客数量
* @param typeId
* @return
*/
public Integer getBlogByTypeId(Integer typeId);
}
BlogTypeService.java接口类:
package com.steadyjack.service;
import java.util.List;
import java.util.Map;
import com.steadyjack.entity.BlogType;
/**
* title:BlogTypeService.java
* description:博客类型Service接口
* time:2017年1月16日 下午10:03:06
* author:debug-steadyjack
*/
public interface BlogTypeService {
/**
* 查询所有博客类型 以及对应的博客数量
* @return
*/
public List countList();
/**
* 分页查询博客类别信息
* @param map
* @return
*/
public List list(Map map);
/**
* 获取总记录数
* @param map
* @return
*/
public Long getTotal(Map map);
/**
* 添加博客类别信息
* @param blogType
* @return
*/
public Integer add(BlogType blogType);
/**
* 修改博客类别信息
* @param blogType
* @return
*/
public Integer update(BlogType blogType);
/**
* 删除博客类别信息
* @param id
* @return
*/
public Integer delete(Integer id);
}
CommentService.java接口类:
package com.steadyjack.service;
import java.util.List;
import java.util.Map;
import com.steadyjack.entity.Comment;
/**
* title:CommentService.java
* description:评论Service接口
* time:2017年1月16日 下午10:35:42
* author:debug-steadyjack
*/
public interface CommentService {
/**
* 添加评论
* @param comment
* @return
*/
public int add(Comment comment);
/**
* 修改评论
* @param comment
* @return
*/
public int update(Comment comment);
/**
* 查找用户评论信息
* @param map
* @return
*/
public List list(Map map);
/**
* 获取总记录数
* @param map
* @return
*/
public Long getTotal(Map map);
/**
* 删除评论信息
* @param id
* @return
*/
public Integer delete(Integer id);
}
LinkService.java接口类:
package com.steadyjack.service;
import java.util.List;
import java.util.Map;
import com.steadyjack.entity.Link;
/**
* title:LinkService.java
* description:友情链接Service接口
* time:2017年1月16日 下午10:35:55
* author:debug-steadyjack
*/
public interface LinkService {
/**
* 添加友情链接
* @param link
* @return
*/
public int add(Link link);
/**
* 修改友情链接
* @param link
* @return
*/
public int update(Link link);
/**
* 查找友情链接信息
* @param map
* @return
*/
public List list(Map map);
/**
* 获取总记录数
* @param map
* @return
*/
public Long getTotal(Map map);
/**
* 删除友情链接
* @param id
* @return
*/
public Integer delete(Integer id);
}
各个service的实现类建立在package com.steadyjack.service.impl目录下,各个实现类源码如下:
BloggerServiceImpl.java实现类:
package com.steadyjack.service.impl;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.steadyjack.dao.BloggerDao;
import com.steadyjack.entity.Blogger;
import com.steadyjack.service.BloggerService;
/**
* title:BloggerServiceImpl.java
* description:博主Service实现类
* time:2017年1月16日 下午10:36:10
* author:debug-steadyjack
*/
@Service("bloggerService")
public class BloggerServiceImpl implements BloggerService{
@Resource
private BloggerDao bloggerDao;
public Blogger find() {
return bloggerDao.find();
}
public Blogger getByUserName(String userName) {
return bloggerDao.getByUserName(userName);
}
public Integer update(Blogger blogger) {
return bloggerDao.update(blogger);
}
}
BlogServiceImpl.java实现类如下:
package com.steadyjack.service.impl;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.steadyjack.dao.BlogDao;
import com.steadyjack.entity.Blog;
import com.steadyjack.service.BlogService;
/**
* title:BlogServiceImpl.java
* description:博客Service实现类
* time:2017年1月16日 下午10:36:23
* author:debug-steadyjack
*/
@Service("blogService")
public class BlogServiceImpl implements BlogService{
@Resource
private BlogDao blogDao;
public List countList() {
return blogDao.countList();
}
public List list(Map map) {
return blogDao.list(map);
}
public Long getTotal(Map map) {
return blogDao.getTotal(map);
}
public Blog findById(Integer id) {
return blogDao.findById(id);
}
public Integer update(Blog blog) {
return blogDao.update(blog);
}
public Blog getLastBlog(Integer id) {
return blogDao.getLastBlog(id);
}
public Blog getNextBlog(Integer id) {
return blogDao.getNextBlog(id);
}
public Integer add(Blog blog) {
return blogDao.add(blog);
}
public Integer delete(Integer id) {
return blogDao.delete(id);
}
public Integer getBlogByTypeId(Integer typeId) {
return blogDao.getBlogByTypeId(typeId);
}
}
BlogTypeServiceImpl.java实现类:
package com.steadyjack.service.impl;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.steadyjack.dao.BlogTypeDao;
import com.steadyjack.entity.BlogType;
import com.steadyjack.service.BlogTypeService;
/**
* title:BlogTypeServiceImpl.java
* description:博客类型Service实现类
* time:2017年1月16日 下午10:36:32
* author:debug-steadyjack
*/
@Service("blogTypeService")
public class BlogTypeServiceImpl implements BlogTypeService{
@Resource
private BlogTypeDao blogTypeDao;
public List countList() {
return blogTypeDao.countList();
}
public List list(Map map) {
return blogTypeDao.list(map);
}
public Long getTotal(Map map) {
return blogTypeDao.getTotal(map);
}
public Integer add(BlogType blogType) {
return blogTypeDao.add(blogType);
}
public Integer update(BlogType blogType) {
return blogTypeDao.update(blogType);
}
public Integer delete(Integer id) {
return blogTypeDao.delete(id);
}
}
CommentServiceImpl.java实现类:
package com.steadyjack.service.impl;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.steadyjack.dao.CommentDao;
import com.steadyjack.entity.Comment;
import com.steadyjack.service.CommentService;
/**
* title:CommentServiceImpl.java
* description:评论Service实现类
* time:2017年1月16日 下午10:36:41
* author:debug-steadyjack
*/
@Service("commentService")
public class CommentServiceImpl implements CommentService{
@Resource
private CommentDao commentDao;
public int add(Comment comment) {
return commentDao.add(comment);
}
public List list(Map map) {
return commentDao.list(map);
}
public Long getTotal(Map map) {
return commentDao.getTotal(map);
}
public Integer delete(Integer id) {
return commentDao.delete(id);
}
public int update(Comment comment) {
return commentDao.update(comment);
}
}
LinkServiceImpl.java实现类:
package com.steadyjack.service.impl;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.steadyjack.dao.LinkDao;
import com.steadyjack.entity.Link;
import com.steadyjack.service.LinkService;
/**
* title:LinkServiceImpl.java
* description:友情链接Service实现类
* time:2017年1月16日 下午10:37:15
* author:debug-steadyjack
*/
@Service("linkService")
public class LinkServiceImpl implements LinkService{
@Resource
private LinkDao linkDao;
public int add(Link link) {
return linkDao.add(link);
}
public int update(Link link) {
return linkDao.update(link);
}
public List list(Map map) {
return linkDao.list(map);
}
public Long getTotal(Map map) {
return linkDao.getTotal(map);
}
public Integer delete(Integer id) {
return linkDao.delete(id);
}
}
同样的道理,在service.impl中的各个实现类中,自然用到了mapper类(即dao层的类):包括dao与xml配置文件,下面也贴出来。
首先是package com.steadyjack.dao的各个dao层类:
BlogDao.java:
package com.steadyjack.dao;
import java.util.List;
import java.util.Map;
import com.steadyjack.entity.Blog;
/**
* title:BlogDao.java
* description: 博客Dao接口
* time:2017年1月16日 下午10:34:19
* author:debug-steadyjack
*/
public interface BlogDao {
/**
* 根据日期月份分组查询 - 月份-当年博客的数量
* @return
*/
public List countList();
/**
* 分页查询博客
* @return
*/
public List list(Map map);
/**
* 获取总记录数
* @param map
* @return
*/
public Long getTotal(Map map);
/**
* 通过Id查找实体
* @param id
* @return
*/
public Blog findById(Integer id);
/**
* 更新博客信息
* @param blog
* @return
*/
public Integer update(Blog blog);
/**
* 获取上一个博客
* @param id
* @return
*/
public Blog getLastBlog(Integer id);
/**
* 获取下一个博客
* @param id
* @return
*/
public Blog getNextBlog(Integer id);
/**
* 添加博客信息
* @param blog
* @return
*/
public Integer add(Blog blog);
/**
* 删除博客信息
* @param id
* @return
*/
public Integer delete(Integer id);
/**
* 查询指定的博客类别下的博客数量
* @param typeId
* @return
*/
public Integer getBlogByTypeId(Integer typeId);
}
BloggerDao.java:
package com.steadyjack.dao;
import com.steadyjack.entity.Blogger;
/**
* title:BloggerDao.java
* description:博主Dao接口
* time:2017年1月16日 下午10:16:44
* author:debug-steadyjack
*/
public interface BloggerDao {
/**
* 查询博主信息
* @return
*/
public Blogger find();
/**
* 通过用户名查询用户
* @param userName
* @return
*/
public Blogger getByUserName(String userName);
/**
* 更新博主信息
* @param blogger
* @return
*/
public Integer update(Blogger blogger);
}
BlogTypeDao.java:
package com.steadyjack.dao;
import java.util.List;
import java.util.Map;
import com.steadyjack.entity.BlogType;
/**
* title:BlogTypeDao.java
* description:博客类型Dao接口
* time:2017年1月16日 下午10:11:14
* author:debug-steadyjack
*/
public interface BlogTypeDao {
/**
* 查询所有博客类型 以及对应的博客数量
* @return
*/
public List countList();
/**
* 通过id查询博客类型
* @param id
* @return
*/
public BlogType findById(Integer id);
/**
* 分页查询博客类别信息
* @param map
* @return
*/
public List list(Map map);
/**
* 获取总记录数
* @param map
* @return
*/
public Long getTotal(Map map);
/**
* 添加博客类别信息
* @param blogType
* @return
*/
public Integer add(BlogType blogType);
/**
* 修改博客类别信息
* @param blogType
* @return
*/
public Integer update(BlogType blogType);
/**
* 删除博客类别信息
* @param id
* @return
*/
public Integer delete(Integer id);
}
CommentDao.java:
package com.steadyjack.dao;
import java.util.List;
import java.util.Map;
import com.steadyjack.entity.Comment;
/**
* title:CommentDao.java
* description:评论Dao接口
* time:2017年1月16日 下午10:28:17
* author:debug-steadyjack
*/
public interface CommentDao {
/**
* 添加评论
* @param comment
* @return
*/
public int add(Comment comment);
/**
* 修改评论
* @param comment
* @return
*/
public int update(Comment comment);
/**
* 查找用户评论信息
* @param map
* @return
*/
public List list(Map map);
/**
* 获取总记录数
* @param map
* @return
*/
public Long getTotal(Map map);
/**
* 删除评论信息
* @param id
* @return
*/
public Integer delete(Integer id);
}
LinkDao.java:
package com.steadyjack.dao;
import java.util.List;
import java.util.Map;
import com.steadyjack.entity.Link;
/**
* title:LinkDao.java
* description:友情链接Dao接口
* time:2017年1月16日 下午10:31:28
* author:debug-steadyjack
*/
public interface LinkDao {
/**
* 添加友情链接
* @param link
* @return
*/
public int add(Link link);
/**
* 修改友情链接
* @param link
* @return
*/
public int update(Link link);
/**
* 查找友情链接信息
* @param map
* @return
*/
public List list(Map map);
/**
* 获取总记录数
* @param map
* @return
*/
public Long getTotal(Map map);
/**
* 删除友情链接
* @param id
* @return
*/
public Integer delete(Integer id);
}
最后是mapper配置文件,包目录为com.steadyjack.mappers。
BloggerMapper.xml:
update tb_blogger
password=#{password},
nickName=#{nickName},
sign=#{sign},
proFile=#{proFile},
imageName=#{imageName},
where id=1
BlogMapper.xml:
update tb_blog
title=#{title},
summary=#{summary},
content=#{content},
typeId=#{blogType.id},
clickHit=#{clickHit},
replyHit=#{replyHit},
keyWord=#{keyWord},
where id=#{id}
insert into tb_blog values(null,#{title},#{summary},now(),0,0,#{content},#{blogType.id},#{keyWord})
delete from tb_blog where id=#{id}
BlogTypeMapper.xml:
insert into tb_blogType values(null,#{typeName},#{orderNo});
update tb_blogType
typeName=#{typeName},
orderNo=#{orderNo},
where id=#{id}
delete from tb_blogType where id=#{id}
CommentMapper.xml:
insert into tb_comment values(null,#{userIp},#{blog.id},#{content},now(),0)
update tb_comment
state=#{state},
where id=#{id}
delete from tb_comment where id=#{id}
LinkMapper.xml:
insert into tb_link values(null,#{linkName},#{linkUrl},#{orderNo})
update tb_link
linkName=#{linkName},
linkUrl=#{linkUrl},
orderNo=#{orderNo},
where id=#{id}
delete from tb_link where id=#{id}
然后把shiro配置文件中自定义的realm也贴出来吧,用于用户权限认证授权。包package com.steadyjack.realm,建立MyRealm.java:
package com.steadyjack.realm;
import javax.annotation.Resource;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import com.steadyjack.entity.Blogger;
import com.steadyjack.service.BloggerService;
/**
* title:MyRealm.java
* description:自定义Realm(域)
* time:2017年1月22日 下午10:50:57
* author:debug-steadyjack
*/
public class MyRealm extends AuthorizingRealm{
@Resource
private BloggerService bloggerService;
/**
* 为当限前登录的用户授予角色和权
* (由于目前系统没有啥资源且只有admin超级用户,故而没写授予角色、权限(资源)逻辑)
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
return null;
}
/**
* 验证当前登录的用户
* (成功时,将登陆用户绑定到会话中;失败时,其实会报各种exception,理当抛出用于前端页面展示(后期实现))
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
//获取身份(在这里指 用户名)-凭证(在这里指 密码)
String userName=(String)token.getPrincipal();
Blogger blogger=bloggerService.getByUserName(userName);
if(blogger!=null){
//当前用户信息存到session中
SecurityUtils.getSubject().getSession().setAttribute("currentUser", blogger);
AuthenticationInfo authcInfo=new SimpleAuthenticationInfo(blogger.getUserName(),blogger.getPassword(),getName());
return authcInfo;
}else{
return null;
}
}
}
至此,基本上后端mvc的dao层与service层跟model都已经分享完毕。可能缺一些util(下篇贴出),加入util之后,再开发controller与页面解析,基本上系统慢慢就起来了。。。。
如果有相关问题:如想找我付费开发其他功能,讨论其中相关问题等等,可以来以下两群找我,我叫debug!
Java开源技术交流:583522159 个人QQ:1948831260