java优雅的SSM框架(五):SSM整合(由浅入深,深度解读)

 

 

 

 

 

 

 

什么是SSM框架?

SSM框架,是Spring + Spring MVC + MyBatis的缩写,这个是继SSH之后,目前比较主流的Java EE企业级框架,适用于搭建各种大型的企业级应用系统。

那么SSM框架有具体有哪些优点呢?

对于SSM框架的具体优点我主要总结了以下几点:


(1)Spring的优势:

Spring的IOC特性将对象之间的依赖关系交给了Spring控制,方便解耦,简化了开发

Spring的AOP特性,对重复模块进行集中和对其他优秀开源框架的集成支持

(2)Spring MVC的优势

SpringMVC对web层进行解耦,使我们开发更简洁

(3)Mybatis的优势:

数据库的sql语句采用xml文件配置,解除了sql和代码的耦合

提供映射标签,支持对象和和数据库orm字段关系的映射,

支持对象关系映射标签,支持对象关系的组建

提供了xml标签,支持动态的sql

当然SSM框架还有好多非常易于使用的优点,这里就不一一列出了,等大家以后使用了自己进行探索吧


说了这么多,SSM框架的基本原理实现是什么呢?

其实,我感觉SSM框架的核心层次还是在于MVC的设计模式,任何对于代码的简洁化操作都是基于MVC的条件下进行设计分担各种不同的职责,然后由系统统一调用。

那么系统怎样调用我们的各个层次的处理员呢?

Spring为我们提供了很好的技术保障。

1.其一那就是注解

我们只需添加相应的注解,并且打开Spring的注解扫描就可以将各个对象纳入到Spring的管理容器中进行管理,这就是Spring的IOC特性。很多对象都不用我们自己进行创建,我们只需要配置相应的配置文件交给Spring框架去读,Spring会给我们自动创建很多的对象,这点对我们非常的方便。

前面的文章中提到过Spring、SpringMVC框架常用的一些注解,有什么不明白的地方大家可以具体的看一看,这里就不再一一重复了。

一般我们做简单的测试和demo只需要简单的配置一下Spring-MVC.xml、Spring-Mapper.xml、Mapper.xml就可以了。

2.其二是SpringMVC对用户访问和视图控制的处理(Controller层)

浏览器访问服务器,前端控制器接收用户请求,根据在HandlerMapping中配置的相关信息,调用控制器,在控制器内将相应的数据封装进ModelAndView,然后将ModelAndView返回给前端控制器,前端控制器根据视图解析器将ModelAndView封装的数据返回给前端页面。

3.其三呢就是Spring和Mybatis连用了(Dao层)

Mybatis是非常好的DAO层封装框架,它为我们节省了太对太对的时间和处理了。

Mybatis框架原理简图

SqlSessionFactoryBuilder创建的SqlSessionFactory工厂,该工厂读取我们的配置文件,生成相应的语句对象,我们从工厂中拿出SqlSession然后,只需根据自己的需求执行语句对象获得返回的数据就可以了,中间的具体操作不是很多。

4.其四就是我们的Service层了

其实说了这么多,上面的可能在我们初学的时候真的不需要我们写太多的逻辑性代码,我们要进行大量的逻辑的代码编辑的还是我们的Service层,Service层获取到DAO层返回的数据,进行相应的逻辑要求判断,然后把结果封装起来,返回给控制器,控制器只需控制返回的路径或者数据就行了。

上面四点就是我简单的总结了以下SSM框架的原理

那么问题又来了,我们知道了原理和优点,改怎样使用呢?上代码,这里我们先用jsp写吧,简单一些。

1.配置我们创建项目所需的依赖

jstl、Spring MVC、Spring jdbc 、mysql connection、DBCP、Mybatis、Mybatis Spring

2.项目结构和配置文件

web.xml、Spring-mvc.xml、Mapper.xml、数据库连接池配置文件

web.xml

这里我们说一下MapperScannerConfigurer:根据指定包批量扫描Mapper接口并生成实例根据指定包批量扫描Mapper接口并生成实例。

也就是说,我们配置的映射文件实际上是被解释成实例化的对象了,我们在映射文件中配置的标签的id属性对应于DAO层方法的方法名,参数类型,返回值类型都相对应,实际上,就是DAO层的一个实现类,只不过不是我们自己手打的。

在使用MapperScannerConfigurer时,只需要指定一个basePackage即可,basePackage用于指定Mapper接口所在的包,在这个包及其所有子包下面的Mapper接口都将被搜索到,并把它们注册为一个个MapperFactoryBean对象,多个包之间可以使用逗号或者分号进行分隔。

MapperScannerConfigurer自动扫描com.wyq包下所有接口,遇到带@MyBatisRepository标记的将对应MapperFactoryBean对象注册(MapperScannerConfigurer自定义注解标记)

这里关于MapperFactoryBean不说太多,有兴趣的可以查一下

3.前端页面

add.jsp

add.jsp

find.jsp




find.jsp

index.jsp


index.jsp

show.jsp


show.jsp

update.jsp


update.jsp

4.编写Controller,Service,Dao层代码

IndexController.class

/**
* 主页面的视图控制
*/
@Controller
@RequestMapping("/index")
public class IndexController {

@Resource
private DeptService deptService;
//去主页面
@RequestMapping("/toIndex.do")
public String toIndex(){
return "index";
}
//去登录页面 return "index"

//去添加页面 return "add"
//去查找页面 return "find"
//去查看页面 return "show"
//去修改页面 return "update"
@RequestMapping("/toUpdate.do")
public ModelAndView toUpdate(@RequestParam("id")String id){
Dept dept = (Dept)deptService.findOne(Integer.parseInt(id));
ModelAndView mav = new ModelAndView("update");
mav.addObject(dept);//向修改页面填入当前数据
return mav;
}
}

DeptController.class

@Controller
@RequestMapping("/dept")
public class DeptController {

//注入对象
@Resource
private DeptService deptService;
//执行登录
@RequestMapping("/add.do")
public String add(Dept dept){
deptService.add(dept);
return "add";
}
//执行查找
@RequestMapping("/find.do")
@ResponseBody//生成json数据
public ModelAndView find(@RequestParam("id")String id){
ModelAndView mav = new ModelAndView("find");
Object obj = deptService.findOne(Integer.parseInt(id));
mav.addObject("result", obj);
return mav;
}
//执行显示
@RequestMapping("/findAll.do")
@ResponseBody
public ModelAndView findAll(){
ModelAndView mav = new ModelAndView("show");
List<Dept> list = (List)deptService.findAll();
if(list==null){
mav.addObject("list","没值");
}
mav.addObject("list", list);
return mav;
}
//执行删除
@RequestMapping("/delete.do")
public ModelAndView delete(@RequestParam("id")String id){
deptService.delete(Integer.parseInt(id));
return findAll();
}
//更改
@RequestMapping("/update.do")
public ModelAndView update(Dept dept){
deptService.update(dept);
return findAll();
}
}

service层实现类DeptServiceImp

@Service
public class DeptServiceImp implements DeptService {

@Resource
private DeptDao deptDao;

@Override
public void add(Dept dept) {
deptDao.add(dept);
}
@Override
public void delete(int id) {
deptDao.delete(id);
}
@Override
public void update(Dept dept) {
deptDao.update(dept);
}
@Override
public Dept findOne(int id) {
Dept dept = deptDao.findOne(id);
return dept;
}
@Override
public List findAll() {
List<Dept> list = deptDao.findAll();
return list;
}
}

dao层 DeptDao.class

public interface DeptDao {

public void add(Dept dept);

public void delete(int id);

public void update(Dept dept);

public Dept findOne(int id);

public List findAll();
}

实体类 Dept.class

public class Dept {

private int id;
private String dname;
private String loc;
}

5.写测试类测试各个层次的代码

6.部署到服务器上面运行,访问测试,看看哪里需要更正

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 33
    点赞
  • 137
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值