文章目錄
- 0. 項目介紹
- 1. 環境準備
- 2. 查看所有
- 2.1 編寫BrandMapper接口
- 2.2 編寫服務類,創建BrandService,用于調用該方法
- 2.5 編寫Servlet
- 2.4 編寫brand.jsp頁面
- 2.5 測試
- 3.添加
- 3.1 編寫BrandMapper接口 添加方法
- 3.2 編寫服務
- 3.3 改寫Brand.jsp頁面,添加新增按鈕,并跳轉到新的jsp頁面(addBrand頁面)
- 3.4 編寫Servlet
- 3.5 測試
0. 項目介紹
其他項目-用戶登錄注冊頁面:https://blog.csdn.net/meini32/article/details/132305323
項目介紹
需求:完成品牌數據的增刪改查操作
技術框架說明
三層架構是將我們的項目分成了三個層面,分別是 表現層 、 業務邏輯層 、 數據訪問層。
整個流程是,瀏覽器發送請求,表現層的Servlet接收請求并調用業務邏輯層的方法進行業務邏輯處理,而業務邏輯層方法調用數據訪問層方法進行數據的操作,依次返回到serlvet,然后servlet將數據交由 JSP 進行展示。
- 數據訪問層:Mybatis、mysql
- 業務邏輯層:JAVA
- 表現層:JSP、Servlet
實現步驟
1. 環境準備
環境準備
- 創建新的項目 brand_demo,引入坐標配置pom文件()
- 創建三層架構的包結構
- 數據庫表 tb_brand
- 實體類 Brand
MyBatis 基礎環境配置
Mybatis-config.xml
BrandMapper.xml
BrandMapper接口
Mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--起別名--><typeAliases><package name="com.itheima.pojo"/></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql:///db1?useSSL=false&useServerPrepStmts=true"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><mappers><!--掃描mapper--><package name="com.itheima.mapper"/></mappers>
</configuration>
pom.xml文件配置
<?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-demo</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><!-- mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.5</version></dependency><!--mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.34</version></dependency><!--servlet--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><!--jsp--><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2</version><scope>provided</scope></dependency><!--jstl--><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>
工具類 SqlsessionFactoryUtils
package com.itheima.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{InputStream inputStream = null;try {inputStream = Resources.getResourceAsStream("mybatis-config.xml");} catch (IOException e) {e.printStackTrace();}SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}public static SqlSessionFactory getSqlSessionFactory(){return sqlSessionFactory;}
}
屬性名稱對應不上解決方法
在BrandMapper映射文件里,定義映射關系
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--
namespace:名稱空間
--><mapper namespace="com.itheima.mapper.BrandMapper"><!-- resultMap 標簽定義映射關系--><resultMap id="brandRseultMap" type="brand"><result column="brand_name" property="brandName"></result><result column="company_name" property="companyName"></result></resultMap></mapper>
在接口方法中指定該映射
public interface BrandMapper {//查看所有@ResultMap("brandResultMap")@Select("select * from tb_brand;")List<Brand> selectAll();
}
2. 查看所有
說明:當我們點擊 index.html 頁面中的 查詢所有 這個超鏈接時,就能查詢到上圖右半部分的數據。
2.1 編寫BrandMapper接口
public interface BrandMapper {//查看所有@Select("select * from tb_brand;")List<Brand> selectAll();
}
2.2 編寫服務類,創建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 {SqlSessionFactory sqlSessionFactory =SqlSessionFactoryUtils.getSqlSessionFactory();//查所有public List<Brand> selectAll(){//調用BrandMapper中的selectAll方法//獲取SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();//獲取MapperBrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);//調用方法List<Brand> brands = brandMapper.selectAll();sqlSession.close();return brands;}
}
2.5 編寫Servlet
package com.itheima.web;import com.itheima.pojo.Brand;
import com.itheima.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 {//創建這個服務private BrandService service = new BrandService();@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1. 調用BrandService完成查詢List<Brand> brands = service.selectAll();//2. 存入request域中request.setAttribute("brands",brands);//3. 轉發到brand.jsprequest.getRequestDispatcher("/brand.jsp").forward(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}
2.4 編寫brand.jsp頁面
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page isELIgnored="false" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %><!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<input type="button" value="新增"><br>
<hr>
<table border="1" cellspacing="0" width="800"><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>${brand.id}</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==0}"><td>禁止</td></c:if><td><a href="/brand-demo/selectByIdServlet?id=${brand.id}">修改</a> <a href="#">刪除</a></td></tr></c:forEach></table></body>
</html>
2.5 測試
3.添加
3.1 編寫BrandMapper接口 添加方法
//添加@Insert("insert into tb_brand values(null,#{brandName},#{companyName},#{ordered},#{description},#{status})")void add(Brand brand);
3.2 編寫服務
public class BrandService {SqlSessionFactory sqlSessionFactory =SqlSessionFactoryUtils.getSqlSessionFactory();//添加數據public void add(Brand brand){//調用BrandMapper中的selectAll方法//獲取SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();//獲取MapperBrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);//調用方法brandMapper.add(brand);//提交事務sqlSession.commit();sqlSession.close();}
}
3.3 改寫Brand.jsp頁面,添加新增按鈕,并跳轉到新的jsp頁面(addBrand頁面)
<%--Created by IntelliJ IDEA.User: 11445Date: 2023/8/18Time: 20:31To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %><!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>添加品牌</title>
</head>
<body>
<h3>添加品牌</h3>
<form action="" method="post">品牌名稱:<input name="brandName"><br>企業名稱:<input name="companyName"><br>排序:<input name="ordered"><br>描述信息:<textarea rows="5" cols="20" name="description"></textarea><br>狀態:<input type="radio" name="status" value="0">禁用<input type="radio" name="status" value="1">啟用<br><input type="submit" value="提交">
</form>
</body>
</html>
3.4 編寫Servlet
在 web 包下創建 AddServlet 的 servlet ,該 servlet 的邏輯如下:
- 設置處理post請求亂碼的字符集
- 接收客戶端提交的數據
- 將接收到的數據封裝到 Brand 對象中
- 調用 BrandService 的 add() 方法進行添加的業務邏輯處理
- 跳轉到 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;@WebServlet("/addServlet")
public class AddServlet extends HttpServlet {private BrandService service = new BrandService();@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//處理post請求的亂碼問題req.setCharacterEncoding("utf-8");//1. 接收表單提交的數據,封裝為一個Brand對象String brandName = req.getParameter("brandName");String companyName = req.getParameter("companyName");String ordered = req.getParameter("ordered");String description = req.getParameter("description");String status = req.getParameter("status");//封裝為一個Brand對象Brand brand = new Brand();brand.setBrandName(brandName);brand.setCompanyName(companyName);brand.setOrdered(Integer.parseInt(ordered));brand.setDescription(description);brand.setStatus(Integer.parseInt(status));//2. 調用service 完成添加service.add(brand);//3. 轉發到查詢所有Servletreq.getRequestDispatcher("/selectAllServlet").forward(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req,resp);}
}
3.5 測試