關(guān)于SSM框架下各層的解釋說明(Controller等)
SSM框架
SSM框架是spring MVC ,Spring和Mybatis框架的整合,是標(biāo)準(zhǔn)的MVC模式,將整個(gè)系統(tǒng)劃分為表現(xiàn)層(web),controller層,service層,dao層四層,使用spring MVC負(fù)責(zé)請(qǐng)求的轉(zhuǎn)發(fā)和視圖管理。
Spring實(shí)現(xiàn)業(yè)務(wù)對(duì)象管理,Mybatis作為數(shù)據(jù)對(duì)象的持久化引擎。
- 表現(xiàn)層(web):通俗講就是展現(xiàn)給用戶的界面,即用戶在使用一個(gè)系統(tǒng)的時(shí)候他的所見所得。
- 業(yè)務(wù)邏輯層(service):針對(duì)具體問題的操作,也可以說是對(duì)數(shù)據(jù)層的操作,對(duì)數(shù)據(jù)業(yè)務(wù)邏輯處理。
- 數(shù)據(jù)訪問層(dao):該層所做事務(wù)直接操作數(shù)據(jù)庫(kù),針對(duì)數(shù)據(jù)的增添、刪除、修改、更新、查找等。
DataBase ===> Entity ===> Mapper.xml ===> Dao.Java ===> Service.java ===> Controller.java ===> html css js(thymeleaf)
各層解釋說明
用IDEA創(chuàng)建一個(gè)maven項(xiàng)目結(jié)構(gòu)如左圖所示,在該項(xiàng)目中,有五個(gè)包,分別是controller、dao、entity、service和serviceimpl:
層 | 描述 |
---|---|
實(shí)體層 | 數(shù)據(jù)庫(kù)在項(xiàng)目中的類,主要用于定義與數(shù)據(jù)庫(kù)對(duì)象應(yīng)的屬性,提供get/set方法,tostring方法,有參無參構(gòu)造函數(shù)。 |
持久層 | 與數(shù)據(jù)庫(kù)交互,dao層首先會(huì)創(chuàng)建dao接口,接著就可以在配置文件中定義該接口的實(shí)現(xiàn)類;接著就可以在模塊中調(diào)用dao的接口進(jìn)行數(shù)據(jù)業(yè)務(wù)的處理,而不用關(guān)注此接口的具體實(shí)現(xiàn)類是哪一個(gè)類,dao層的數(shù)據(jù)源和數(shù)據(jù)庫(kù)連接的參數(shù)都是在配置文件中進(jìn)行配置的。 |
業(yè)務(wù)層 | 控制業(yè)務(wù),業(yè)務(wù)模塊的邏輯應(yīng)用設(shè)計(jì),和dao層一樣都是先設(shè)計(jì)接口,再創(chuàng)建要實(shí)現(xiàn)的類,然后在配置文件中進(jìn)行配置其實(shí)現(xiàn)的關(guān)聯(lián)。接下來就可以在service層調(diào)用接口進(jìn)行業(yè)務(wù)邏輯應(yīng)用的處理。 |
實(shí)現(xiàn)層 | 實(shí)現(xiàn)service接口的所有方法,整合service和dao |
控制層 | controller層主要調(diào)用Service層里面的接口控制具體的業(yè)務(wù)流程,控制的配置也要在配置文件中進(jìn)行。Controller和Service的區(qū)別是:Controller負(fù)責(zé)具體的業(yè)務(wù)模塊流程的控制;Service層負(fù)責(zé)業(yè)務(wù)模塊的邏輯應(yīng)用設(shè)計(jì) |
entity層(model層)
實(shí)體層用于存放我們的實(shí)體類,與數(shù)據(jù)庫(kù)中的屬性值基本保持一致,實(shí)現(xiàn)set和get的方法。
1.導(dǎo)入lombok小辣椒驅(qū)動(dòng)依賴,用來生成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) //鏈?zhǔn)秸{(diào)用 public class Emp { private String id; private String name; private Double salary; private Integer age; private Date bir; }
2.傳統(tǒng)方式
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; /** * 設(shè)置: */ public void setId(Integer id) { this.id = id; } /** * 獲?。? */ public Integer getId() { return id; } /** * 設(shè)置: */ public void setUpdataflag(int updataflag) { this.updataflag = updataflag; } /** * 獲?。? */ public int getUpdataflag() { return updataflag; } }
dao層(mapper層)
dao層(接口類)對(duì)數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)持久化操作,他的方法語句是直接針對(duì)數(shù)據(jù)庫(kù)操作的,主要實(shí)現(xiàn)一些增刪改查操作,在Mybatis中方法主要與與xxxDao(Mapper).xml內(nèi)相互一一映射。
Mybatis可以用.xml進(jìn)行數(shù)據(jù)操作,也可以在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中傳遞多個(gè)參數(shù)要做參數(shù)的綁定 //新增用戶(注冊(cè)) void save(User user); //查詢所有用戶 List<User> findAlluser(); //刪除用戶 void delete(String id); //修改用戶信息(先查再改) User update(String id); void add(User user); }
xxxDao(Mapper).xml:
關(guān)鍵: < mapper namespace=“com.dvms.dao.UserDao”>
前提:基本數(shù)據(jù)庫(kù)語法
<?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"> <!--注冊(cè)/新增用戶--> <insert id="save" parameterType="User"> insert into user (id,username,password,sex,phone,email,role) values (#{id},#{username},#{password},#{sex},#{phone},#{email},#{role}) </insert> <!--登錄驗(yàn)證--> <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層
service層(接口類)為controller層的類提供接口進(jìn)行調(diào)用,一般就是自己寫的方法封裝起來,具體實(shí)現(xiàn)在serviceImpl中。
service層是建立在dao層之上的,建立了dao層后才可以建立service層,而service層又是在controller層之下的,因而service層應(yīng)該既調(diào)用dao層的接口,又要提供接口給Controller層的類來進(jìn)行調(diào)用,它剛好處于一個(gè)中間層的位置。每個(gè)模型都有一個(gè)service接口,每個(gè)接口分別封裝各自的業(yè)務(wù)處理方法。
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(實(shí)現(xiàn)service層,整合service和dao)(導(dǎo)入dao層)(接口實(shí)現(xiàn)類)
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); } }
Controller層(web 層)
負(fù)責(zé)具體模塊的業(yè)務(wù)流程控制(獲取參數(shù)(前端傳過來)返回響應(yīng)(前端或數(shù)據(jù)庫(kù)或一個(gè)指定路徑)),需要調(diào)用service邏輯設(shè)計(jì)層的接口來控制業(yè)務(wù)流程(導(dǎo)入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層調(diào)用了Service層的接口方法,Service層調(diào)用Dao層的方法,其中調(diào)用的參數(shù)是使用Entity層進(jìn)行傳遞的。View層與Controller層協(xié)同工作,主要負(fù)責(zé)界面展示。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java關(guān)鍵字final用法知識(shí)點(diǎn)
在本篇文章里小編給大家分享的是關(guān)于java關(guān)鍵字final用法知識(shí)點(diǎn)以及相關(guān)實(shí)例內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。2019-09-09Java即將引入新對(duì)象類型來解決內(nèi)存使用問題
這篇文章主要介紹了Java即將引入新對(duì)象類型來解決內(nèi)存使用問題,文章通過圍繞主題的相關(guān)資料展開詳細(xì)內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05Mysql存儲(chǔ)java對(duì)象實(shí)例詳解
這篇文章主要介紹了Mysql存儲(chǔ)java對(duì)象實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2016-11-11淺談Java中@Autowired和@Inject注解的區(qū)別和使用場(chǎng)景
本文主要介紹了淺談Java中@Autowired和@Inject注解的區(qū)別和使用場(chǎng)景,@Autowired注解在依賴查找方式和注入方式上更加靈活,適用于Spring框架中的依賴注入,而@Inject注解在依賴查找方式上更加嚴(yán)格,適用于Java的依賴注入標(biāo)準(zhǔn),感興趣的可以了解一下2023-11-11談?wù)凧ava中整數(shù)類型(short int long)的存儲(chǔ)方式
在java中的整數(shù)類型有四種,分別是byte short in long,本文重點(diǎn)給大家介紹java中的整數(shù)類型(short int long),由于byte只是一個(gè)字節(jié)0或1,在此就不多說了,對(duì)java中的整數(shù)類型感興趣的朋友一起學(xué)習(xí)吧2015-11-11System.currentTimeMillis()計(jì)算方式與時(shí)間的單位轉(zhuǎn)換詳解
這篇文章主要介紹了System.currentTimeMillis()計(jì)算方式與時(shí)間的單位轉(zhuǎn)換詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05詳解JDK中ExecutorService與Callable和Future對(duì)線程的支持
這篇文章主要介紹了詳解JDK中ExecutorService與Callable和Future對(duì)線程的支持的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-09-09java反編譯工具jd-gui-osx?for?mac?M1芯片無法使用的問題及解決
這篇文章主要介紹了java反編譯工具jd-gui-osx?for?mac?M1芯片無法使用的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01Java Socket編程實(shí)例(四)- NIO TCP實(shí)踐
這篇文章主要講解Java Socket編程中NIO TCP的實(shí)例,希望能給大家做一個(gè)參考。2016-06-06