专业的JAVA编程教程与资源

网站首页 > java教程 正文

【每日一学】Java CRUD操作大揭秘:学会创建、读取、更新和删除

temp10 2024-11-07 12:32:34 java教程 7 ℃ 0 评论

学习总目标

本次学习目标

【每日一学】Java CRUD操作大揭秘:学会创建、读取、更新和删除

4.1 数据建模

4.1.1 物理建模

CREATE DATABASE `view-demo`CHARACTER SET utf8;
USE `view-demo`;
CREATE TABLE t_soldier(
soldier_id INT PRIMARY KEY AUTO_INCREMENT,
soldier_name CHAR(100),
soldier_weapon CHAR(100)
);

4.1.2 逻辑建模

public class Soldier {

private Integer soldierId;
private String soldierName;
private String soldierWeapon;
...

4.2 总体架构


4.3 搭建环境

4.3.1 搭建持久层环境

  1. 拷贝持久层的jar包: mysql驱动、druid、dbutils、junit、BeanUtils
  2. 拷贝JDBCUtils工具类、jdbc.properties文件、BaseDao类

4.3.2 搭建Thymeleaf环境

  1. 拷贝Thymeleaf所需的jar包
  2. 拷贝ViewBaseServlet类
  3. 配置web.xml
  • <!-- 在上下文参数中配置视图前缀和视图后缀 -->
    <context-param>
    <param-name>view-prefix</param-name>
    <param-value>/WEB-INF/view/</param-value>
    </context-param>
    <context-param>
    <param-name>view-suffix</param-name>
    <param-value>.html</param-value>
    </context-param>
  1. 创建view目录


4.4 需要实现的功能列表

  • 显示首页:浏览器通过index.html访问首页Servlet,然后再解析对应的模板视图
  • 显示列表:在首页点击超链接,跳转到目标页面把所有士兵的信息列表显示出来
  • 删除信息:在列表上点击删除超链接,执行信息的删除操作
  • 新增信息:在列表页面点击超链接跳转到新增士兵信息的表单页面在新增信息的表单页面点击提交按钮执行保存
  • 更新信息:在列表上点击更新超链接,跳转到更新士兵信息的表单页面:表单回显在更新信息的表单页面点击提交按钮执行更新

4.5 显示首页功能

4.5.1 目标

浏览器访问index.html,通过首页Servlet,渲染视图,显示首页。

4.5.2 思路


4.5.3 代码

① 创建PortalServlet

<servlet>
<servlet-name>PortalServlet</servlet-name>
<servlet-class>com.atguigu.servlet.PortalServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PortalServlet</servlet-name>
<url-pattern>/portal</url-pattern>
</servlet-mapping>

Servlet代码:

package com.atguigu.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author chenxin
* 日期2021-06-13 14:07
*/
public class PortalServlet extends ViewBaseServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//跳转到首页
processTemplate("index",request,response);
}
}

②创建portal.html


<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<!--
查询士兵列表
-->
<a th:href="@{/soldier(method='showAll')}">查看士兵列表</a>
</body>
</html>

4.6 显示列表

4.6.1 目标

在目标页面显示所有士兵信息,士兵信息是从数据库查询出来的

4.6.2 思路


4.6.3 代码

① ModelBaseServlet

创建这个基类的原因是:我们希望每一个模块能够对应同一个Servlet,这个模块所需要调用的所有方法都集中在同一个Servlet中。如果没有这个ModelBaseServlet基类,我们doGet()、doPost()方法可以用来处理请求,这样一来,每一个方法都需要专门创建一个Servlet(就好比咱们之前的LoginServlet、RegisterServlet其实都应该合并为UserServlet)。

package com.atguigu.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
/**
* @author chenxin
* 日期2021-06-13 16:31
*/
public class ModelBaseServlet extends ViewBaseServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//获取请求参数method的值
String method = request.getParameter("method");
//method参数的值就是要调用的方法的方法名,那就是已知方法名要去查找调用本对象的方法
try {
Method declaredMethod = this.getClass().getDeclaredMethod(method, HttpServletRequest.class, HttpServletResponse.class);
//暴力反射
declaredMethod.setAccessible(true);
//调用方法
declaredMethod.invoke(this,request,response);
} catch (Exception e) {
e.printStackTrace();
}
}
}

② SoldierDao.selectSoldierList()



接口方法:

public interface SoldierDao {
/**
* 查询所有士兵
* @return
*/
List<Soldier> findAll() throws SQLException;
}

实现类方法:

public class SoldierDaoImpl extends BaseDao<Soldier> implements SoldierDao {
@Override
public List<Soldier> findAll() throws SQLException {
String sql = "select soldier_id soldierId,soldier_name soldierName,soldier_weapon soldierWeapon from t_soldier";
return getBeanList(Soldier.class,sql);
}
}

③ SoldierService.getSoldierList()


接口方法:

public interface SoldierService {
/**
* 查询所有士兵信息
* @return
*/
List<Soldier> findAllSoldier() throws Exception;
}

实现类方法:

public class SoldierServiceImpl implements SoldierService {
private SoldierDao soldierDao = new SoldierDaoImpl();
@Override
public List<Soldier> findAllSoldier() throws Exception {
return soldierDao.findAll();
}
}

④ SoldierServlet.showList()

/**
* 处理查询所有士兵信息的请求
* @param request
* @param response
*/
public void showAll(HttpServletRequest request,HttpServletResponse response){
try {
//调用业务层的方法查询士兵列表
List<Soldier> soldierList = soldierService.findAllSoldier();
//将soldierList存储到域对象
request.setAttribute("soldierList",soldierList);
//跳转到展示页面进行展示
processTemplate("list",request,response);
} catch (Exception e) {
e.printStackTrace();
}
}

⑤ 显示士兵列表的list.html页面

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>士兵列表展示页面</title>
</head>
<body>
<table border="1" cellspacing="0" width="800">
<tr>
<th>士兵的编号</th>
<th>士兵的姓名</th>
<th>士兵的武器</th>
<th>删除信息</th>
<th>修改信息</th>
</tr>
<tbody th:if="${#lists.isEmpty(soldierList)}">
<tr>
<td th:colspan="5">没有士兵数据,请添加士兵</td>
</tr>
</tbody>
<tbody th:unless="${#lists.isEmpty(soldierList)}">
<tr th:each="soldier : ${soldierList}">
<td th:text="${soldier.soldierId}">士兵的编号</td>
<td th:text="${soldier.soldierName}">士兵的姓名</td>
<td th:text="${soldier.soldierWeapon}">士兵的武器</td>
<td><a th:href="@{/soldier(method='deleteSoldier',id=${soldier.soldierId})}">删除信息</a></td>
<td><a th:href="@{/soldier(method='toUpdatePage',id=${soldier.soldierId})}">修改信息</a></td>
</tr>
</tbody>
<tfoot>
<tr>
<td th:colspan="5" align="center">
<a th:href="@{/soldier(method='toAddPage')}">添加士兵信息</a>
</td>
</tr>
</tfoot>
</table>
</body>
</html>

4.7 删除功能

4.7.1 目标

点击页面上的超链接,把数据库表中的记录删除。

4.7.2 思路


4.7.3 代码

① 完成删除超链接


<td><a th:href="@{/soldier(method='deleteSoldier',id=${soldier.soldierId})}">删除信息</a></td>

关于@{地址}附加请求参数的语法格式:

  • 只有一个请求参数:@地址(请求参数名=普通字符串)或@{地址(请求参数名=${需要解析的表达式})}
  • 多个请求参数:@地址(名=值,名=值)

官方文档中的说明如下:


② Servlet方法

/**
* 删除士兵信息
* @param request
* @param response
* @throws IOException
*/
public void deleteSoldier(HttpServletRequest request,HttpServletResponse response) throws IOException {
//1. 获取请求参数:id
Integer id = Integer.valueOf(request.getParameter("id"));
//2. 调用业务层的方法,根据id删除士兵
try {
soldierService.deleteSoldierById(id);
//3. 删除成功,重新查询所有
response.sendRedirect(request.getContextPath()+"/soldier?method=showAll");
} catch (Exception e) {
e.printStackTrace();
}
}

③ Service方法

@Override
public void deleteSoldierById(Integer id) throws Exception{
soldierDao.deleteSoldierById(id);
}

④ Dao方法

@Override
public void deleteSoldierById(Integer id) throws SQLException {
String sql = "delete from t_soldier where soldier_id=?";
update(sql,id);
}

4.8 前往新增信息的表单页面

4.8.1 创建超链接

<a th:href="@{/soldier(method='toAddPage')}">添加士兵信息</a>

4.8.2 Servlet

/**
* 跳转到添加页面
* @param request
* @param response
*/
public void toAddPage(HttpServletRequest request,HttpServletResponse response) throws IOException {
processTemplate("add",request,response);
}

4.8.3 创建表单页面


<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>添加士兵的页面</title>
</head>
<body>
<form th:action="@{/soldier(method='addSoldier')}" method="post">
士兵姓名<input name="soldierName"/><br/>
士兵武器<input name="soldierWeapon"/><br/>
<input type="submit" value="添加">
</form>
</body>
</html>

4.9 执行保存

4.9.1 目标

提交表单后,将表单数据封装为Soldier对象,然后将Soldier对象保存到数据库。

4.9.2 思路


4.9.3 代码

① Servlet方法

/**
* 添加士兵信息
* @param request
* @param response
* @throws IOException
*/
public void addSoldier(HttpServletRequest request,HttpServletResponse response) throws IOException {
//1. 获取请求参数
Map<String, String[]> parameterMap = request.getParameterMap();
//2. 将请求参数封装到Soldier对象
Soldier soldier = new Soldier();
try {
BeanUtils.populate(soldier,parameterMap);
//3. 调用业务层的方法处理添加士兵的功能
soldierService.addSoldier(soldier);
//4. 跳转到查看所有士兵信息列表
response.sendRedirect(request.getContextPath()+"/soldier?method=showAll");
} catch (Exception e) {
e.printStackTrace();
}
}

② Service方法

@Override
public void addSoldier(Soldier soldier) throws Exception {
soldierDao.addSoldier(soldier);
}

③ Dao方法

@Override
public void addSoldier(Soldier soldier) throws SQLException {
String sql = "insert into t_soldier (soldier_name,soldier_weapon) values (?,?)";
update(sql,soldier.getSoldierName(),soldier.getSoldierWeapon());
}

4.10 前往修改信息的表单页面


4.10.1 创建超链接

<a th:href="@{/soldier(method='toUpdatePage',id=${soldier.soldierId})}">修改信息</a>

4.10.2 Servlet方法

/**
* 跳转到修改页面
* @param request
* @param response
* @throws IOException
*/
public void toUpdatePage(HttpServletRequest request,HttpServletResponse response) throws IOException {
//获取要修改的士兵的id
Integer id = Integer.valueOf(request.getParameter("id"));
//查询出当前士兵的信息
try {
Soldier soldier = soldierService.findSoldierById(id);
//将soldier存储到请求域中
request.setAttribute("soldier",soldier);
//跳转到修改页面
processTemplate("update",request,response);
} catch (Exception e) {
e.printStackTrace();
}
}

4.10.3 Service方法

@Override
public Soldier findSoldierById(Integer id) throws Exception {
return soldierDao.findSoldierById(id);
}

4.10.4 Dao方法

@Override
public Soldier findSoldierById(Integer id) throws SQLException {
String sql = "select soldier_id soldierId,soldier_name soldierName,soldier_weapon soldierWeapon from t_soldier where soldier_id=?";
return getBean(Soldier.class,sql,id);
}

4.10.5 表单页面

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>修改页面</title>
</head>
<body>
<form th:action="@{/soldier(method='updateSoldier')}" method="post">
<input type="hidden" name="soldierId" th:value="${soldier.soldierId}"/>
士兵姓名<input type="text" th:value="${soldier.soldierName}" name="soldierName"/><br/>
士兵武器<input type="text" th:value="${soldier.soldierWeapon}" name="soldierWeapon"/><br/>
<input type="submit" value="修改"/>
</form>
</body>
</html>

4.11 执行更新


4.11.1 Servlet方法

/**
* 修改士兵信息
* @param request
* @param response
* @throws IOException
*/
public void updateSoldier(HttpServletRequest request,HttpServletResponse response) throws IOException {
//1. 获取请求参数
Map<String, String[]> parameterMap = request.getParameterMap();
//2. 将请求参数封装到Soldier对象
Soldier soldier = new Soldier();
try {
BeanUtils.populate(soldier,parameterMap);
//3. 调用业务层的方法执行修改
soldierService.updateSoldier(soldier);
//4. 修改成功之后重新查询所有
response.sendRedirect(request.getContextPath()+"/soldier?method=showAll");
} catch (Exception e) {
e.printStackTrace();
}
}

4.11.2 Service方法

@Override
public void updateSoldier(Soldier soldier) throws Exception {
soldierDao.updateSoldier(soldier);
}

4.11.3 Dao方法

@Override
public void updateSoldier(Soldier soldier) throws SQLException {
String sql = "update t_soldier set soldier_name=?, soldier_weapon=? where soldier_id=?";
update(sql,soldier.getSoldierName(),soldier.getSoldierWeapon(),soldier.getSoldierId());
}

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表