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

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

  • 前言
  • 环境准备
    • 创建web项目结构
    • 导入依赖和配置文件
    • 创建层次模型
    • 实现查询

前言

这里是看了一点jsp的,顺便过了一下,不是特别熟悉,因为现在这种技术是比较落后了,但是作为学习的过程也就学了下。
因为技术不是现在很常用,所以我没有单独做出笔记。将前段的一些知识,后端的一些知识简单结合一下,作为这个阶段的一个简单的练习。
虽然简单但是知识还是很值得注意,因为实现的前后端涉及到原理性的东西,还有零碎的知识点,所以自己就记录下来。
简单看了下mvc和三层架构的思想。我没有研究很深,但是看的出来是一种分而治之得思想,就是各自实现各自的功能,使得功能之间的服务更加有条理,而不是混在一块。
java从入门到精通二十四(三层架构完成增删改查)_第1张图片
上面的是mvn模式,下面对应的是三层架构。我们就是从数据访问层和业务逻辑层和表现层的思维去进行编程。

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

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

环境准备

创建web项目结构

java从入门到精通二十四(三层架构完成增删改查)_第2张图片
这里当然可以选择骨架
java从入门到精通二十四(三层架构完成增删改查)_第3张图片

我选择不用骨架

java从入门到精通二十四(三层架构完成增删改查)_第4张图片

这是创建好后这个pom配置文件
java从入门到精通二十四(三层架构完成增删改查)_第5张图片
然后我们给它配置war打包方式。
java从入门到精通二十四(三层架构完成增删改查)_第6张图片
这是我们目前的结构,然后我们需要补齐一些目录和配置
java从入门到精通二十四(三层架构完成增删改查)_第7张图片
我们打开项目结构来看,然后选中Facets,然后我们看到我们新建的这个没有被认作是web模块。
java从入门到精通二十四(三层架构完成增删改查)_第8张图片

那我们就添加上去,点击加号,然后选择web。
java从入门到精通二十四(三层架构完成增删改查)_第9张图片

然后把你的模块添加进去
java从入门到精通二十四(三层架构完成增删改查)_第10张图片

java从入门到精通二十四(三层架构完成增删改查)_第11张图片
连续点击确认
java从入门到精通二十四(三层架构完成增删改查)_第12张图片
然后我们点击这里。
java从入门到精通二十四(三层架构完成增删改查)_第13张图片
然后下面最好选择3.0之后的版本
java从入门到精通二十四(三层架构完成增删改查)_第14张图片
然后后面的确认就好。

现在我们再看项目目录,在做小的改造。这个项目结构还是不太正确
java从入门到精通二十四(三层架构完成增删改查)_第15张图片
我们先把web拖到main下
java从入门到精通二十四(三层架构完成增删改查)_第16张图片

然后将WEB-INF拖到web下面
java从入门到精通二十四(三层架构完成增删改查)_第17张图片
这样就基本改造完成。
这里我们在说明了一遍自己创建web项目结构的过程。之前我们都说过,包括骨架。这里就再复习一遍。

导入依赖和配置文件

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

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


<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.0modelVersion>

    <groupId>org.examplegroupId>
    <artifactId>brand-demo01artifactId>
    <version>1.0-SNAPSHOTversion>
    <packaging>warpackaging>


    <properties>
        <maven.compiler.source>8maven.compiler.source>
        <maven.compiler.target>8maven.compiler.target>
    properties>
    <dependencies>
        <dependency>
            <groupId>org.mybatisgroupId>
            <artifactId>mybatisartifactId>
            <version>3.5.9version>
        dependency>
        <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
            <version>8.0.29version>
        dependency>
        <dependency>
            <groupId>javax.servletgroupId>
            <artifactId>javax.servlet-apiartifactId>
            <version>4.0.1version>
            <scope>providedscope>
        dependency>
        <dependency>
            <groupId>javax.servlet.jspgroupId>
            <artifactId>jsp-apiartifactId>
            <version>2.2version>
            <scope>providedscope>
        dependency>
        <dependency>
            <groupId>jstlgroupId>
            <artifactId>jstlartifactId>
            <version>1.2version>

        dependency>
        <dependency>
            <groupId>taglibsgroupId>
            <artifactId>standardartifactId>
            <version>1.1.2version>

        dependency>



    dependencies>
    <build>
        <plugins>

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

            plugin>

        plugins>
    build>

project>

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


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>
        
        <package name="com.jgdabc.mapper"/>
    mappers>
configuration>

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

创建层次模型

然后我们创建这样的层次包结构。
java从入门到精通二十四(三层架构完成增删改查)_第18张图片

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断层,但是在我前端展示还是非常正常。原因往后看。

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

java从入门到精通二十四(三层架构完成增删改查)_第19张图片

这是我多次操作的结果,但是前端展示id还是连续的。
java从入门到精通二十四(三层架构完成增删改查)_第20张图片
表创建以后我们需要一个实体类

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 核心配置文件


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>
        
        <package name="com.jgdabc.mapper"/>
    mappers>
configuration>

映射文件,这个可有可无,只是因为我没有在这里面写sql。
java从入门到精通二十四(三层架构完成增删改查)_第21张图片


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>

java从入门到精通二十四(三层架构完成增删改查)_第22张图片

我们写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>Titletitle>
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>

启动!
java从入门到精通二十四(三层架构完成增删改查)_第23张图片
我们启动服务后默认会打开index.html,所以初始化我们就写在这里面

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

body>
html>

点击查询所有
java从入门到精通二十四(三层架构完成增删改查)_第24张图片
我在核心配置文件中这样写就可以自动开启驼峰规则,这样就可以避免数据库字段和idea实体类字段不匹配导致查询不到结果的问题。
java从入门到精通二十四(三层架构完成增删改查)_第25张图片
如果不这样处理的话,我们就需要在映射文件中这样写。


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,笔记,java,架构,mvc)