MVC模式 &三层架构思想完成增删改查.

MVC模式图解:

MVC模式 &三层架构思想完成增删改查._第1张图片

三层架构图解:

表现层、业务逻辑层、数据访问层互不干扰,也就是说比如我们表现层更改代码不会干涉到其他两层

(com.itheima.web 这代表的是包名 也就是说最好把表现层或者业务逻辑层放到此对应的包名下)

以后会用三大框架封装表现层、业务逻辑层、数据访问层 (对应框架:SpringMVC、Spring、Mybatis)

MVC模式 &三层架构思想完成增删改查._第2张图片

MVC模式和三层架构图解: 

也就是说我们学习的MVC模式对应的是三层架构的表现层 (相当于学三层架构的表现层)

MVC模式 &三层架构思想完成增删改查._第3张图片

运用以上三层架构思想完成案例:

MVC模式 &三层架构思想完成增删改查._第4张图片 准备环境:

MVC模式 &三层架构思想完成增删改查._第5张图片

 1、创建模块brand-demo  引入用到的坐标 (brand-demo创建的是web模块 骨架模式):

坐标:




  4.0.0

  org.example
  brand-demo
  1.0-SNAPSHOT
  war

  
      
    
      org.mybatis
      mybatis
      3.5.5
    

    
    
      mysql
      mysql-connector-java
      5.1.34
    

    
    
      javax.servlet
      javax.servlet-api
      3.1.0
      provided
    

    
    
      javax.servlet.jsp
      jsp-api
      2.2
      provided
    

    
    
      jstl
      jstl
      1.2
    

    
    
      taglibs
      standard
      1.1.2
    
  

    
  
    
      
        org.apache.tomcat.maven
        tomcat7-maven-plugin
        2.2
        
      
    
  


注意别忘记把brand-demo新项目拉到服务器中:

MVC模式 &三层架构思想完成增删改查._第6张图片

 2、创建三层架构的包结构:

MVC模式 &三层架构思想完成增删改查._第7张图片

 3、数据库表准备tb_brand:

create table tb_brand(
    -- id 主键
    id  int primary key auto_increment,
    -- 品牌名称
    brand_name varchar(20),
    -- 企业名称
    company_name varchar(20),
    -- 排序字段
    ordered int,
    -- 描述信息
    description varchar(100),
    -- 状态: 0:禁用 1:启动
    status  int
);
 
insert into tb_brand (brand_name, company_name, ordered, description, status)values
('三只松鼠','三只松鼠股份有限公司',5,'好吃不上火',0),
('华为','华为技术有限公司',100,'华为致于把数字世界带入每个人、每个家庭、每个组织、构建万物互联的智能世界',1),
('小米','小米科技有限公司',50,'are you ok',1);

4、实体类Brand:复制mybatis增删改查笔记即可

5、mybatis基础环境配置: 看mybatis笔记 去官方复制即可  mybatis-config.xml




    
        
            
            

                
                
                
                
                
            
        



    

    
        
        
    

MVC模式 &三层架构思想完成增删改查._第8张图片

 重要细节:注意搞完之后检查以下配置文件的路径是否都正确、是否都能对应住

 接下来开始运用三层架构的思想完成增删改查操作:

以下是以查询所有商品为例, 其他的增删改的逻辑和查询所有的逻辑是一样的:

MVC模式 &三层架构思想完成增删改查._第9张图片

index.jsp改成brand.jsp

一、查询所有:

(以下的过程是在index.html开始的,所以看笔记的时候最好也在index.html开始)

MVC模式 &三层架构思想完成增删改查._第10张图片

Dao/Mapper层:(数据访问层)

package com.itheima.mapper;
import com.itheima.pojo.Brand;
import org.apache.ibatis.annotations.ResultMap;
import org.apache.ibatis.annotations.Select;

import java.util.List;


/**
 *  代理开发接口
 */
public interface BrandMapper {
    /**
     *  查询所有商品
     */
    @Select("select * from tb_brand")
    @ResultMap("brandResultMap") // 数据库中的字段名和实体类的属性名有不一样的时候用这个注表
                           //明, 因为brandResultMap标签中处理过字段名和数据库名不一样的时候了
    List selectAll();
}

service层:(业务逻辑层)

(这个业务逻辑层可以拿到BrandMapper接口查询出来的所有商品数据 【只不过以前我们拿到数据后都是输出了 这里我们返回到方法当中了 因为我们需要在web表现层 进行把数据转发给jsp页面展示给用户的  不是输出在我们控制台的】)

MVC模式 &三层架构思想完成增删改查._第11张图片

package com.itheima.service;
import com.itheima.mapper.BrandMapper;
import com.itheima.pojo.Brand;
import com.itheima.util.SqlSessionFactoryUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import java.util.List;

/**
 *  业务逻辑层
 */

public class BrandService {
    /**
     *  查询所有功能
     * @return
     */
    public List selectAll(){
        // 利用工厂调用BrandMapper接口中的selectAll查询全部的方法
        SqlSessionFactory Factory =SqlSessionFactoryUtils.getSqlSessionFactory();
        SqlSession sqlSession =Factory.openSession();
        BrandMapper brandMapper =sqlSession.getMapper(BrandMapper.class);
        List brands =brandMapper.selectAll(); //
        // System.out.println(brands); 输出全部的商品
        // 这里我们返回即可,当调用这个方法的时候再输出
        return brands;
    }
}

web层:(表现层)

把查询出来的所有的数据转发到brand.jsp页面当中然后展示给用户

jsp的作用就是:jsp页面运用EL表达式可以把查询到的所有商品展示给客户端浏览器上

package com.itheima.web;
import com.itheima.pojo.Brand;
import com.itheima.service.BrandService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@WebServlet("/selectAllServlet")
public class SelectAllServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1 调用BrandService完成查询
        BrandService brandService =new BrandService();
        List brands =brandService.selectAll();

        // 2 把查询到的数据存入request域当中
        request.setAttribute("brands",brands);

        // 3 把存入的数据转发到brand.jsp页面中供用户查看数据
        request.getRequestDispatcher("/brand.jsp").forward(request,response);
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

MVC模式 &三层架构思想完成增删改查._第12张图片

index.html: (点击查询所有跳转到selectAllServlet路径下

MVC模式 &三层架构思想完成增删改查._第13张图片




    
    Title



 查询所有 



转发到的brand.jsp: (把数据展示给用户)

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    <%-- 引入标签库 --%>




    
    Title




序号 品牌名称 企业名称 排序 品牌介绍 状态 操作
${status.count} ${brand.brandName} ${brand.companyName} ${brand.ordered} ${brand.description} 启用 禁止 修改 删除

开启服务器后,通过index.html进行访问路径下的资源如下:

MVC模式 &三层架构思想完成增删改查._第14张图片

 MVC模式 &三层架构思想完成增删改查._第15张图片

总体的增删改查就是和上面的逻辑是一样的:

增删改查总代码如下:

MVC模式 &三层架构思想完成增删改查._第16张图片

Mapper层:(BrandMapper) 访问数据层

package com.itheima.mapper;
import com.itheima.pojo.Brand;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.ResultMap;
import org.apache.ibatis.annotations.Select;
import java.util.List;


/**
 *  代理开发接口
 */
public interface BrandMapper {
    /**
     *  1、查询所有商品
     */
    @Select("select * from tb_brand")
    @ResultMap("brandResultMap")
    List selectAll();

    /**
     *  2、添加商品
     */
    void add(Brand brand);

    /**
     * 3、根据id查询
     */
    @Select("select * from tb_brand where id = #{id}")
    @ResultMap("brandResultMap")
    Brand selectById(int id);

    /**
     * 4、修改商品
     */
    void update(Brand brand);

    /**
     * 5、删除商品 (通过id删除)
     */
    @Delete("delete from tb_brand where id =#{id}")
    void delete(int id);

}

BrandMapper.xml文件: 





    
        
        
    

    
    
        insert into tb_brand(brand_name, company_name, ordered, description, status) values
    (#{brandName},#{companyName},#{ordered},#{description},#{status});
    

    
    
        update tb_brand set brand_name =#{brandName},company_name=#{companyName},ordered=#{ordered},
            description=#{description},status=#{status} where id =#{id};
    

 Service层:业务逻辑层 (Brandservice)

package com.itheima.service;
import com.itheima.mapper.BrandMapper;
import com.itheima.pojo.Brand;
import com.itheima.util.SqlSessionFactoryUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import java.util.List;

/**
 *  业务逻辑层
 */

public class BrandService {
    /**
     *  查询所有功能
     * @return
     */
    public List selectAll(){
        // 利用工厂调用BrandMapper接口中的selectAll查询全部的方法
        SqlSessionFactory Factory =SqlSessionFactoryUtils.getSqlSessionFactory();
        SqlSession sqlSession =Factory.openSession();
        BrandMapper brandMapper =sqlSession.getMapper(BrandMapper.class);
        List brands =brandMapper.selectAll();
        // System.out.println(brands); 输出全部的商品
        // 这里我们返回即可,当调用这个方法的时候再输出

        // 释放资源
        sqlSession.close();
        return brands;
        // 释放资源
    }

    /**
     *  添加商品的功能
     *  注意小细节:所有的增删改都涉及到事务,idea会默认帮我们回滚事务 因此我们需要手动提交事务
     */
    public void add(Brand brand){
        // 利用工厂调用BrandMapper接口中的selectAll查询全部的方法
        SqlSessionFactory Factory =SqlSessionFactoryUtils.getSqlSessionFactory();
        SqlSession sqlSession =Factory.openSession();
        BrandMapper brandMapper =sqlSession.getMapper(BrandMapper.class);
        brandMapper.add(brand);
        // 提交事务
        sqlSession.commit();
        // 释放资源
        sqlSession.close();
    }

    /**
     * 根据id查询商品数据
     */
    public Brand selectById(int id){
        // 利用工厂调用BrandMapper接口中的selectAll查询全部的方法
        SqlSessionFactory Factory =SqlSessionFactoryUtils.getSqlSessionFactory();
        SqlSession sqlSession =Factory.openSession();
        BrandMapper brandMapper =sqlSession.getMapper(BrandMapper.class);
        Brand brand =brandMapper.selectById(id);
        // 释放资源
        sqlSession.close();
        return brand;
    }

    /**
     * 修改商品
     */
    public void update(Brand brand){
        SqlSessionFactory Factory =SqlSessionFactoryUtils.getSqlSessionFactory();
        SqlSession sqlSession =Factory.openSession();
        BrandMapper brandMapper =sqlSession.getMapper(BrandMapper.class);
        brandMapper.update(brand);

        // 提交事务
        sqlSession.commit();
        // 释放资源
        sqlSession.close();
    }

    /**
     *  删除商品
     *  (先通过id查找出想要删除的整条SQL数据)
     */
    public void deleteById(int id){
        SqlSessionFactory Factory =SqlSessionFactoryUtils.getSqlSessionFactory();
        SqlSession sqlSession =Factory.openSession();
        BrandMapper brandMapper =sqlSession.getMapper(BrandMapper.class);
        brandMapper.delete(id);

        // 提交事务
        sqlSession.commit();
        // 释放资源
        sqlSession.close();
    }
}

web层:表现层

AddServlet:

package com.itheima.web;
import com.itheima.pojo.Brand;
import com.itheima.service.BrandService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/addServlet")
public class AddServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // 解决Post请求乱码问题
        request.setCharacterEncoding("utf-8");

        // 1. 先获取客户端addBrand.jsp传输过来的请求数据 (数据以key values的形式存储在request域当中)
        String brandName =request.getParameter("brandName");
        String companyName =request.getParameter("companyName");
        String ordered =request.getParameter("ordered");
        String description =request.getParameter("description");
        String status =request.getParameter("status");

        // 2. 把获取的客户端的请求数据 封装到Brand对象属性中 进行往数据库当中添加数据
        Brand brand =new Brand();
        brand.setBrandName(brandName);
        brand.setCompanyName(companyName);
        brand.setOrdered(Integer.parseInt(ordered)); // 因为对象属性中该属性是Integer类型 客户的数据为String类型
        brand.setDescription(description);
        brand.setStatus(Integer.parseInt(status));

        // 3. 调用BrandService业务逻辑层中的增加商品的方法
        BrandService brandService =new BrandService();
        brandService.add(brand);

        // 4. 转发到查询所有商品的路径  (把添加过后的全部商品再查询一下展示给客户端)
        request.getRequestDispatcher("/selectAllServlet").forward(request,response);


    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

DeleteById:

package com.itheima.web;
import com.itheima.service.BrandService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/deleteById")
public class DeleteById extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1. 接收传送过来的id
        String id =request.getParameter("id");

        // 2. 调用业务逻辑层 传递id参数
        BrandService brandService =new BrandService();
        brandService.deleteById(Integer.parseInt(id));

        // 3. 删除成功后 转发到查询所有商品的路径下 展示给用户所有商品
        request.getRequestDispatcher("/selectAllServlet").forward(request,response);




    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

SelectAllServlet:

package com.itheima.web;
import com.itheima.pojo.Brand;
import com.itheima.service.BrandService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@WebServlet("/selectAllServlet")
public class SelectAllServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1 调用BrandService完成查询
        BrandService brandService =new BrandService();
        List brands =brandService.selectAll();

        // 2 把查询到的数据存入request域当中
        request.setAttribute("brands",brands);

        // 3 把存入的数据转发到brand.jsp页面中供用户查看数据
        request.getRequestDispatcher("/brand.jsp").forward(request,response);
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

 SelectByIdServlet:(这个是修改回显的操作,先是通过在brand.jsp页面上点击修改按钮(附带着id) 然后通过超链接进入selectByIdServlet路径资源下、把该id所查询出来的信息展示回显给用户 然后供用户进行修改的操作 最后再转发到查询所有的商品 把修改后的所有商品展示给用户)

package com.itheima.web;
import com.itheima.pojo.Brand;
import com.itheima.service.BrandService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


@WebServlet("/selectByIdServlet")
public class SelectByIdServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1. 接收传送过来的id
        String id =request.getParameter("id");

        // 2. 调用业务逻辑层进行通过id查询
        BrandService brandService =new BrandService();
        Brand brand =brandService.selectById(Integer.parseInt(id));  // SQL查询的时候id是int型  这里接收的是String 需要转换

        // 3. 通过id查询的数据储存到request域当中
        request.setAttribute("brand",brand);

        // 4. 把通过id查询出来的商品数据回显给客户端进行修改操作
        // (就是把查询出来的数据通过转发给jsp页面 然后通过做的页面让客户端直接在我们做的页面当中进行修改数据)
        request.getRequestDispatcher("/update.jsp").forward(request,response);


    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}
 
  

UpdateServlet:

package com.itheima.web;
import com.itheima.pojo.Brand;
import com.itheima.service.BrandService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/updateServlet")
public class UpdateServlet extends HttpServlet {

    Brand brand =new Brand();
    BrandService brandService =new BrandService();

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // 处理post乱码问题
        request.setCharacterEncoding("utf-8");

        // 1. 接收用户修改传到request当中的数据

        String id =request.getParameter("id");
        String brandName =request.getParameter("brandName");
        String companyName =request.getParameter("companyName");
        String ordered =request.getParameter("ordered");
        String description =request.getParameter("description");
        String status =request.getParameter("status");

        // 2. 把接收的数据封装到Brand对象属性当中
        brand.setId(Integer.parseInt(id));
        brand.setBrandName(brandName);
        brand.setCompanyName(companyName);
        brand.setOrdered(Integer.parseInt(ordered));
        brand.setDescription(description);
        brand.setStatus(Integer.parseInt(status));

        // 3. 调用业务逻辑层中的update方法 进行传送封装到Brand对象属性中的客户端数据 进行SQL语句操作
        brandService.update(brand);

        // 4. 修改成功后 转发到查询所有的selectAllServlet路径下把所有的商品再展示给用户
        request.getRequestDispatcher("/selectAllServlet").forward(request,response);

    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

index.html:




    
    Title



 查询所有 



 brand.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    <%-- 引入标签库 --%>




    
    Title




<%-- ?id 是把id传送给selectByIdServlet路径下的资源当中 --%>
序号 品牌名称 企业名称 排序 品牌介绍 状态 操作
${status.count} ${brand.brandName} ${brand.companyName} ${brand.ordered} ${brand.description} 启用 禁止 修改 删除

addBrand.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>




    
    添加品牌


添加品牌

品牌名称:
企业名称:
排序:
描述信息:
状态: 禁用 启用

 update.jsp:

<%@ page contentType="text/html;charset=UTF-8" isELIgnored="false" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>





  
  修改品牌


修改品牌

<%--隐藏域,提交id--%> 品牌名称:
企业名称:
排序:
描述信息:
状态: 禁用 启用
禁用 启用

解决如下这样的问题(jsp页面上不显示相对应的数据 而显示代码问题): 

MVC模式 &三层架构思想完成增删改查._第17张图片

 MVC模式 &三层架构思想完成增删改查._第18张图片

开启服务器:访问index.html页面 演示增删改查操作:

添加:

MVC模式 &三层架构思想完成增删改查._第19张图片

 MVC模式 &三层架构思想完成增删改查._第20张图片

MVC模式 &三层架构思想完成增删改查._第21张图片

 修改:

MVC模式 &三层架构思想完成增删改查._第22张图片

 MVC模式 &三层架构思想完成增删改查._第23张图片

 MVC模式 &三层架构思想完成增删改查._第24张图片

 删除:

MVC模式 &三层架构思想完成增删改查._第25张图片

 点击修改后即可 (通过id删除的)

MVC模式 &三层架构思想完成增删改查._第26张图片

你可能感兴趣的:(笔记,mvc,tomcat,maven,java)