时间:2023-02-16 09:34:20 | 栏目:JAVA代码 | 点击:次
SSM框架是spring MVC ,Spring和Mybatis框架的整合,是标准的MVC模式,将整个系统划分为表现层(web),controller层,service层,dao层四层,使用spring MVC负责请求的转发和视图管理。
Spring实现业务对象管理,Mybatis作为数据对象的持久化引擎。
DataBase ===> Entity ===> Mapper.xml ===> Dao.Java ===> Service.java ===> Controller.java ===> html css js(thymeleaf)
用IDEA创建一个maven项目结构如左图所示,在该项目中,有五个包,分别是controller、dao、entity、service和serviceimpl:
层 | 描述 |
---|---|
实体层 | 数据库在项目中的类,主要用于定义与数据库对象应的属性,提供get/set方法,tostring方法,有参无参构造函数。 |
持久层 | 与数据库交互,dao层首先会创建dao接口,接着就可以在配置文件中定义该接口的实现类;接着就可以在模块中调用dao的接口进行数据业务的处理,而不用关注此接口的具体实现类是哪一个类,dao层的数据源和数据库连接的参数都是在配置文件中进行配置的。 |
业务层 | 控制业务,业务模块的逻辑应用设计,和dao层一样都是先设计接口,再创建要实现的类,然后在配置文件中进行配置其实现的关联。接下来就可以在service层调用接口进行业务逻辑应用的处理。 |
实现层 | 实现service接口的所有方法,整合service和dao |
控制层 | controller层主要调用Service层里面的接口控制具体的业务流程,控制的配置也要在配置文件中进行。Controller和Service的区别是:Controller负责具体的业务模块流程的控制;Service层负责业务模块的逻辑应用设计 |
实体层用于存放我们的实体类,与数据库中的属性值基本保持一致,实现set和get的方法。
1.导入lombok小辣椒驱动依赖,用来生成get/set方法依赖:
package com.dvms.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; import lombok.experimental.Accessors; import java.util.Date; @Data @ToString @AllArgsConstructor @NoArgsConstructor @Accessors(chain = true) //链式调用 public class Emp { private String id; private String name; private Double salary; private Integer age; private Date bir; }
2.传统方式
package com.umf.entity; import java.io.Serializable; public class UpdataSettingEntity implements Serializable { private static final long serialVersionUID = 1L; // private Integer id = 1; // private int updataflag; /** * 设置: */ public void setId(Integer id) { this.id = id; } /** * 获取: */ public Integer getId() { return id; } /** * 设置: */ public void setUpdataflag(int updataflag) { this.updataflag = updataflag; } /** * 获取: */ public int getUpdataflag() { return updataflag; } }
dao层(接口类)对数据库进行数据持久化操作,他的方法语句是直接针对数据库操作的,主要实现一些增删改查操作,在Mybatis中方法主要与与xxxDao(Mapper).xml内相互一一映射。
Mybatis可以用.xml进行数据操作,也可以在dao层用注解的方式,也可以采取xml和dao层接口组合使用的方法(常用)。
package com.dvms.dao; import com.dvms.entity.User; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; import java.util.List; @Repository public interface UserDao { //登录 User login(@Param("username") String username, @Param("password") String password);// 在mybatis中传递多个参数要做参数的绑定 //新增用户(注册) void save(User user); //查询所有用户 List<User> findAlluser(); //删除用户 void delete(String id); //修改用户信息(先查再改) User update(String id); void add(User user); }
xxxDao(Mapper).xml:
关键: < mapper namespace=“com.dvms.dao.UserDao”>
前提:基本数据库语法
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.dvms.dao.UserDao"> <!--注册/新增用户--> <insert id="save" parameterType="User"> insert into user (id,username,password,sex,phone,email,role) values (#{id},#{username},#{password},#{sex},#{phone},#{email},#{role}) </insert> <!--登录验证--> <select id="login" resultType="User"> select id,username,password,sex,phone,email,role from user where username =#{username} and password =#{password} </select> <!--查询所有用户--> <select id="findAlluser" resultType="User"> select id,username,password,sex,phone,email,role from user </select> <!--删除用户--> <delete id="delete" parameterType="String"> delete from user where id=#{id} </delete> <!--修改用户信息--> <!--查到要修改的用户信息--> <select id="update" parameterType="String" resultType="User"> select id,username,password,sex,phone,email,role from user where id=#{id} </select> <!--修改用户信息--> <update id="add" parameterType="User"> update user set username=#{username},password=#{password},sex=#{sex},phone=#{phone},email=#{email},role=#{role} where id=#{id} </update> </mapper>
在dao层用注解的方式:
public interface StudentDao { @Select("select * from student where stu_id=#{stuId}") public Student queryById(int stuId); }
service层(接口类)为controller层的类提供接口进行调用,一般就是自己写的方法封装起来,具体实现在serviceImpl中。
service层是建立在dao层之上的,建立了dao层后才可以建立service层,而service层又是在controller层之下的,因而service层应该既调用dao层的接口,又要提供接口给Controller层的类来进行调用,它刚好处于一个中间层的位置。每个模型都有一个service接口,每个接口分别封装各自的业务处理方法。
package com.dvms.service; import com.dvms.entity.User; import java.util.List; public interface UserService { //新增用户 void save(User user); //登录 User login(String username, String password); //查询所有用户 List<User> findAlluser(); //删除用户 void delete(String id); //修改用户信息 User update(String id); void add(User user); }
servicedmpl(实现service层,整合service和dao)(导入dao层)(接口实现类)
package com.dvms.service.Impl; import com.dvms.dao.UserDao; import com.dvms.entity.User; import com.dvms.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.UUID; @Service public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Override public void save(User user) { user.setId(UUID.randomUUID().toString()); userDao.save(user); } @Override public User login(String username, String password) { return userDao.login(username,password); } @Override public List<User> findAlluser() { return userDao.findAlluser(); } @Override public void delete(String id) { userDao.delete(id); } @Override public User update(String id) { return userDao.update(id); } @Override public void add(User user) { userDao.add(user); } }
负责具体模块的业务流程控制(获取参数(前端传过来)返回响应(前端或数据库或一个指定路径)),需要调用service逻辑设计层的接口来控制业务流程(导入service层)。
package com.dvms.controller; import com.dvms.entity.Emp; ..... @Controller public class EmpController { @Autowired private EmpService empService; @GetMapping("emp/findAll") public String findAll(@RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "5") int pageSize, Model model){ PageHelper.startPage(pageNum,pageSize);// PageInfo<Emp> pageInfo = new PageInfo<>(empService.findAll()); model.addAttribute("pageInfo",pageInfo); // List<Emp> emps = empService.findAll(); // model.addAttribute("emps",emps); return "ems/tables"; } @RequestMapping("/emp/save") public String save(Emp emp){ empService.save(emp); return "redirect:/emp/findAll"; } }
Controller层调用了Service层的接口方法,Service层调用Dao层的方法,其中调用的参数是使用Entity层进行传递的。View层与Controller层协同工作,主要负责界面展示。