SSM+JSP实现销售记录展示,带分页功能、模糊查询及最新数据优先
SSM+JSP实现销售记录展示,带分页功能、模糊查询及最新数据优先
本文提供SSM+JSP框架下实现销售记录展示的代码示例,包含分页功能、模糊查询功能,以及将最新数据展示在第一条的优化。示例代码涵盖数据库表设计、实体类、Mapper接口、Service接口与实现类、Controller以及JSP页面,并详细解释了实现过程。
1. 创建数据库表sale_record,包含字段id、product、customer、area、store、date等。
2. 创建SaleRecord实体类,对应数据库表字段。
public class SaleRecord {
private Integer id;
private String product;
private String customer;
private String area;
private String store;
private Date date;
// getters and setters
}
3. 创建SaleRecordMapper接口,定义查询方法。
public interface SaleRecordMapper {
List<SaleRecord> selectAll();
List<SaleRecord> selectByKeyword(String keyword);
List<SaleRecord> selectByPage(@Param("start") int start, @Param("pageSize") int pageSize);
int count();
}
4. 创建SaleRecordMapper.xml,实现查询方法。
<mapper namespace="com.example.mapper.SaleRecordMapper">
<select id="selectAll" resultType="com.example.entity.SaleRecord">
SELECT * FROM sale_record ORDER BY date DESC
</select>
<select id="selectByKeyword" resultType="com.example.entity.SaleRecord">
SELECT * FROM sale_record WHERE product LIKE #{keyword} OR customer LIKE #{keyword} OR area LIKE #{keyword} OR store LIKE #{keyword} OR date LIKE #{keyword}
</select>
<select id="selectByPage" resultType="com.example.entity.SaleRecord">
SELECT * FROM sale_record ORDER BY date DESC LIMIT #{start}, #{pageSize}
</select>
<select id="count" resultType="int">
SELECT COUNT(*) FROM sale_record
</select>
</mapper>
5. 创建SaleRecordService接口和实现类,调用Mapper进行数据库操作。
public interface SaleRecordService {
List<SaleRecord> getAll();
List<SaleRecord> getByKeyword(String keyword);
List<SaleRecord> getByPage(int pageNum, int pageSize);
int getTotalCount();
}
@Service
public class SaleRecordServiceImpl implements SaleRecordService {
@Autowired
private SaleRecordMapper saleRecordMapper;
@Override
public List<SaleRecord> getAll() {
return saleRecordMapper.selectAll();
}
@Override
public List<SaleRecord> getByKeyword(String keyword) {
return saleRecordMapper.selectByKeyword(keyword);
}
@Override
public List<SaleRecord> getByPage(int pageNum, int pageSize) {
int start = (pageNum - 1) * pageSize;
return saleRecordMapper.selectByPage(start, pageSize);
}
@Override
public int getTotalCount() {
return saleRecordMapper.count();
}
}
6. 创建SaleRecordController,处理前端请求。
@Controller
public class SaleRecordController {
@Autowired
private SaleRecordService saleRecordService;
@RequestMapping("/saleRecords")
public String saleRecords(Model model, @RequestParam(value = "pageNum", defaultValue = "1") int pageNum, @RequestParam(value = "pageSize", defaultValue = "10") int pageSize, @RequestParam(value = "keyword", required = false) String keyword) {
List<SaleRecord> saleRecords;
int totalCount;
if (keyword == null) {
saleRecords = saleRecordService.getByPage(pageNum, pageSize);
totalCount = saleRecordService.getTotalCount();
} else {
saleRecords = saleRecordService.getByKeyword(keyword);
totalCount = saleRecords.size();
}
model.addAttribute("saleRecords", saleRecords);
model.addAttribute("totalCount", totalCount);
model.addAttribute("pageNum", pageNum);
model.addAttribute("pageSize", pageSize);
return "saleRecords";
}
}
7. 创建JSP页面saleRecords.jsp,展示销售记录。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Sale Records</title>
</head>
<body>
<h1>Sale Records</h1>
<form action="saleRecords" method="get">
<input type="text" name="keyword" placeholder="Keyword">
<input type="submit" value="Search">
</form>
<table border="1">
<tr>
<th>ID</th>
<th>Product</th>
<th>Customer</th>
<th>Area</th>
<th>Store</th>
<th>Date</th>
</tr>
<c:forEach items="${saleRecords}" var="saleRecord">
<tr>
<td>${saleRecord.id}</td>
<td>${saleRecord.product}</td>
<td>${saleRecord.customer}</td>
<td>${saleRecord.area}</td>
<td>${saleRecord.store}</td>
<td>${saleRecord.date}</td>
</tr>
</c:forEach>
</table>
<div>
<c:choose>
<c:when test="${totalCount <= pageSize}">
<c:set var="totalPage" value="1" />
</c:when>
<c:otherwise>
<c:set var="totalPage" value="${totalCount / pageSize + 1}" />
</c:otherwise>
</c:choose>
<c:if test="${pageNum > 1}">
<a href="saleRecords?pageNum=${pageNum - 1}&pageSize=${pageSize}&keyword=${keyword}">Previous</a>
</c:if>
<c:forEach begin="1" end="${totalPage}" step="1" varStatus="loop">
<c:choose>
<c:when test="${loop.index == pageNum}">
<b>${loop.index}</b>
</c:when>
<c:otherwise>
<a href="saleRecords?pageNum=${loop.index}&pageSize=${pageSize}&keyword=${keyword}">${loop.index}</a>
</c:otherwise>
</c:choose>
</c:forEach>
<c:if test="${pageNum < totalPage}">
<a href="saleRecords?pageNum=${pageNum + 1}&pageSize=${pageSize}&keyword=${keyword}">Next</a>
</c:if>
</div>
</body>
</html>
以上代码示例实现了销售记录的展示、分页和模糊查询功能,并通过ORDER BY date DESC将最新数据展示在第一条。在SaleRecordController中,根据关键字判断是进行查询还是分页查询;在JSP页面中,通过循环展示销售记录的表格,并根据当前页和总页数生成分页链接。
优化建议:
- 可以使用更加专业的分页组件,例如MyBatis的PageHelper或Spring Data JPA的PagingAndSortingRepository,简化分页功能的实现。
- 可以将模糊查询的逻辑封装到Service层,提高代码可维护性和可复用性。
- 可以使用缓存机制,例如Ehcache或Redis,提高数据读取效率。
- 可以使用日志框架,例如Log4j或SLF4j,记录系统运行状态和异常信息,方便排查问题。
注意:
- 实际应用中,请根据具体需求进行调整和完善。
- 以上示例代码仅供参考,建议在实际项目中进行更深入的研究和学习。
原文地址: https://www.cveoy.top/t/topic/hNLj 著作权归作者所有。请勿转载和采集!