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

本文介绍如何使用Java实现基于三层架构(数据访问层、业务逻辑层、表现层)的增删改查操作。从创建web项目结构、配置依赖、创建层次模型开始,逐步讲解查询、添加、修改、删除功能的实现,以及会话技术,包括cookie和session的使用,探讨数据共享、生存时间和安全性。最后讨论了过滤器Filter在项目中的应用以及一些常见问题的解决方案。
摘要由CSDN通过智能技术生成

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

前言

这里是看了一点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的依赖包

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>brand-demo01</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>


    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.9</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.29</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>

        </dependency>
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>

        </dependency>



    </dependencies>
    <build>
        <plugins>

            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>

            </plugin>

        </plugins>
    </build>

</project>

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

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <!--  开启自动驼峰命名规则映射  -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

    <!--起别名-->
    <typeAliases>
        <package name="com.jgdabc.pojo"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///mysql?serverTimezone=GMT"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--扫描mapper-->
        <package name="com.jgdabc.mapper"/>
    </mappers>
</configuration>

基本的两个配置,其他的配置我们还有在构建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 核心配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <!--  开启自动驼峰命名规则映射  -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

    <!--起别名-->
    <typeAliases>
        <package name="com.jgdabc.pojo"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///mysql?serverTimezone=GMT"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--扫描mapper-->
        <package name="com.jgdabc.mapper"/>
    </mappers>
</configuration>

映射文件,这个可有可无,只是因为我没有在这里面写sql。
在这里插入图片描述

<?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.jgdabc.mapper.BrandMapper">

</mapper>

在这里插入图片描述

我们写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")
    List<Brand>selectAll();
}

做一个工具类

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 List<Brand>selectAll()
    {

        SqlSession sqlSession = factory.openSession();
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
        List<Brand> 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<Brand> 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" %>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<input type="button" value="新增" id="add"><br>
<hr>
<table border="1" cellspacing="0" width="80%">
    <tr>
        <th>序号</th>
        <th>品牌名称</th>
        <th>企业名称</th>
        <th>排序</th>
        <th>品牌介绍</th>
        <th>状态</th>
        <th>操作</th>

    </tr>


    <c:forEach items="${brands}" var="brand" varStatus="status">
        <tr align="center">
            <%--<td>${brand.id}</td>--%>
            <td>${status.count}</td>
            <td>${brand.brandName}</td>
            <td>${brand.companyName}</td>
            <td>${brand.ordered}</td>
            <td>${brand.description}</td>
            <c:if test="${brand.status == 1}">
                <td>启用</td>
            </c:if>
            <c:if test="${brand.status != 1}">
                <td>禁用</td>
            </c:if>

            <td><a href="/brand-demo01/selectByIdServlet?id=${brand.id}">修改</a>
                <a href="/brand-demo01/selectDeleteServlet?id=${brand.id}">删除</a></td>

        </tr>

    </c:forEach>

</table>

<script>
    document.getElementById("add").onclick = function (){
        location.href = "/brand-demo01/addBrand.jsp";
    }

</script>
</body>
</html>

启动!
在这里插入图片描述
我们启动服务后默认会打开index.html,所以初始化我们就写在这里面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<a href="/brand-demo01/selectAllServlet">查询所有</a>

</body>
</html>

点击查询所有
在这里插入图片描述
我在核心配置文件中这样写就可以自动开启驼峰规则,这样就可以避免数据库字段和idea实体类字段不匹配导致查询不到结果的问题。
在这里插入图片描述
如果不这样处理的话,我们就需要在映射文件中这样写。

<?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.itheima.mapper.BrandMapper">
<resultMap id="brandResultMap" type="brand">
<result column="brand_name" property="brandName"></result>
<result column="company_name" property="companyName"></result>
</resultMap>
</mapper>

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

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

这样我们也可以将数据库字段和java驼峰命名法匹配起来。

未完续更

实现添加

在这里插入图片描述
我们首先在Dao层也就是mapper层写出这个接口方法。

package com.jgdabc.mapper;

import com.jgdabc.pojo.Brand;
imp
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值