栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java从入门到精通二十四(三层架构完成增删改查)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java从入门到精通二十四(三层架构完成增删改查)

java从入门到精通二十三(三层架构完成增删改查)
  • 前言
  • 环境准备
    • 创建web项目结构
    • 导入依赖和配置文件
    • 创建层次模型
    • 实现查询

前言

这里是看了一点jsp的,顺便过了一下,不是特别熟悉,因为现在这种技术是比较落后了,但是作为学习的过程也就学了下。
因为技术不是现在很常用,所以我没有单独做出笔记。将前段的一些知识,后端的一些知识简单结合一下,作为这个阶段的一个简单的练习。
虽然简单但是知识还是很值得注意,因为实现的前后端涉及到原理性的东西,还有零碎的知识点,所以自己就记录下来。
简单看了下mvc和三层架构的思想。我没有研究很深,但是看的出来是一种分而治之得思想,就是各自实现各自的功能,使得功能之间的服务更加有条理,而不是混在一块。

上面的是mvn模式,下面对应的是三层架构。我们就是从数据访问层和业务逻辑层和表现层的思维去进行编程。

我们的目的是实现一个前后端结合的项目,完成一个增删改查的操作,将表单在前端页面上进行展示。

具体的可以看下面的展示。

环境准备 创建web项目结构


这里当然可以选择骨架

我选择不用骨架

这是创建好后这个pom配置文件

然后我们给它配置war打包方式。

这是我们目前的结构,然后我们需要补齐一些目录和配置

我们打开项目结构来看,然后选中Facets,然后我们看到我们新建的这个没有被认作是web模块。

那我们就添加上去,点击加号,然后选择web。

然后把你的模块添加进去


连续点击确认

然后我们点击这里。

然后下面最好选择3.0之后的版本

然后后面的确认就好。

现在我们再看项目目录,在做小的改造。这个项目结构还是不太正确

我们先把web拖到main下

然后将WEB-INF拖到web下面

这样就基本改造完成。
这里我们在说明了一遍自己创建web项目结构的过程。之前我们都说过,包括骨架。这里就再复习一遍。

导入依赖和配置文件

下面这个是我们目前项目需要使用的所有依赖。
需要注意的是,一定要注意scope的作用域,非常重要,设置不当可能会导致冲突还有就是检测不到等异常。

需要操作数据库。mysql的驱动包
要使用mybatis框架。mybaits的依赖包
web项目需要用到servlet和jsp。servlet和jsp的依赖包需要使用 jstl 进行数据展示。jstl的依赖包



    4.0.0

    org.example
    brand-demo01
    1.0-SNAPSHOT
    war


    
        8
        8
    
    
        
            org.mybatis
            mybatis
            3.5.9
        
        
            mysql
            mysql-connector-java
            8.0.29
        
        
            javax.servlet
            javax.servlet-api
            4.0.1
            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

            

        
    


需要一个mybatis核心配置文件,我们把它放到rescorces下面。




    
        
        
    

    
    
        
    

    
        
            
            
                
                
                
                
            
        
    
    
        
        
    

基本的两个配置,其他的配置我们还有在构建mapper的还需要一个xml文件。

创建层次模型

然后我们创建这样的层次包结构。

webapp下面存放jsp等前端页面。在java下面创建存放接口mapper的接口代码,还有一个实体pojo下存放brand类作为包装类。我们的属性在这里写。service里面就傻逼我们可以从这里调用的服务代码。util报下是将加载数据库核心配置文件单独封装。web下面就是我们的Servlet代码,具体实现后端的功能,包括增删改查等功能。

我们的web下面的Servlet和webapp下面的jsp等前端页面展示构成了表现层。像html或者jsp我们可以认为是视图,然后Servlet是控制器。我们的service包下的类提供业务逻辑的功能。mapper下面的接口类作为数据访问层。

我们的数据库的配置文件时一定要有的,因为将来我们需要去连接数据库,配置驱动等等。然后mapperMapper.xml在本次项目中没有发挥作用,因为简单的sql语句就在接口里面按照注解写好了。但是我们最好养成这样的习惯,因为将来我们的sql语句实际并没有这么简单。我们还是用到了代理。映射文件和接口文件的位置相对位置类位置一样。

实现查询

这些操作我们都需要和前后端结合,也就是需要在页面上展示,并不是仅仅在控制台输出。

创建一张数据库表。

-- 删除tb_brand表
drop table if exists tb_brand;
-- 创建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);


SELECT * FROM tb_brand;

这是之前创建表表的代码,不过填写什么并没有关系,以为之后可以自己进行增删改查,并且删除的话,虽然在数据库中会出现id断层,但是在我前端展示还是非常正常。原因往后看。

我的数据库表现在被我已经删该为这样了。

这是我多次操作的结果,但是前端展示id还是连续的。

表创建以后我们需要一个实体类

package com.jgdabc.pojo;



public class Brand {
    // id 主键
    private Integer id;
    // 品牌名称
    private String brandName;
    // 企业名称
    private String companyName;
    // 排序字段
    private Integer ordered;
    // 描述信息
    private String description;
    // 状态:0:禁用  1:启用
    private Integer status;


    public Brand() {
    }

    public Brand(Integer id, String brandName, String companyName, String description) {
        this.id = id;
        this.brandName = brandName;
        this.companyName = companyName;
        this.description = description;
    }

    public Brand(Integer id, String brandName, String companyName, Integer ordered, String description, Integer status) {
        this.id = id;
        this.brandName = brandName;
        this.companyName = companyName;
        this.ordered = ordered;
        this.description = description;
        this.status = status;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getBrandName() {
        return brandName;
    }

    public void setBrandName(String brandName) {
        this.brandName = brandName;
    }

    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }

    public Integer getOrdered() {
        return ordered;
    }

    public void setOrdered(Integer ordered) {
        this.ordered = ordered;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    @Override
    public String toString() {
        return "Brand{" +
                "id=" + id +
                ", brandName='" + brandName + ''' +
                ", companyName='" + companyName + ''' +
                ", ordered=" + ordered +
                ", description='" + description + ''' +
                ", status=" + status +
                '}';
    }
}

mybatis 核心配置文件




    
        
        
    

    
    
        
    

    
        
            
            
                
                
                
                
            
        
    
    
        
        
    


映射文件,这个可有可无,只是因为我没有在这里面写sql。






我们写BrandMapper这个接口,作为Dao层。

package com.jgdabc.mapper;

import com.jgdabc.pojo.Brand;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

public interface BrandMapper {
    @Select("select * from tb_brand")
    ListselectAll();
}

做一个工具类

package com.jgdabc.util;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class SqlSessionFactoryUtils {

    private static SqlSessionFactory sqlSessionFactory;

    static {
        //静态代码块会随着类的加载而自动执行,且只执行一次

        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    public static SqlSessionFactory getSqlSessionFactory(){
        return sqlSessionFactory;
    }
}

然后service包下,我们创建一个BrandService

package com.jgdabc.service;

import com.jgdabc.mapper.BrandMapper;
import com.jgdabc.pojo.Brand;
import com.jgdabc.util.SqlSessionFactoryUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import java.util.List;

public class BrandService {
    SqlSessionFactory factory = SqlSessionFactoryUtils.getSqlSessionFactory();
    public ListselectAll()
    {

        SqlSession sqlSession = factory.openSession();
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
        List brands = mapper.selectAll();
        sqlSession.close();
        return  brands;

    }
}

然后创建一个Servlet类

package com.jgdabc.web;

import com.jgdabc.pojo.Brand;
import com.jgdabc.service.BrandService;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.List;

@WebServlet("/selectAllServlet")
public class SelectAllServlet extends HttpServlet {
    BrandService service = new BrandService();
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        List brands = service.selectAll();
        System.out.println(brands);
//        存入request区域当中
        request.setAttribute("brands",brands);

//        转发到brand.jsp
        request.getRequestDispatcher("/brand.jsp").forward(request,response);



    }

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

然后创建brand.jsp。

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




    
    Title




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

启动!

我们启动服务后默认会打开index.html,所以初始化我们就写在这里面




    
    Title


查询所有



点击查询所有

我在核心配置文件中这样写就可以自动开启驼峰规则,这样就可以避免数据库字段和idea实体类字段不匹配导致查询不到结果的问题。

如果不这样处理的话,我们就需要在映射文件中这样写。












然后在接口中写一下返回类型(用注解)

	@Select("select * from tb_brand")
	@ResultMap("brandResultMap")
	List selectAll();

未完续更

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/888166.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号