综合案例-1
查询所有-后台&前台
-
前端页面(brand.html)
页面加载完成后,自动发送一个异步请求(AJAX),向后端请求品牌列表数据。拿到响应数据后,将其设置到页面对应的数据模型上,用于渲染展示。
-
Web层(SelectAllServlet)
接收到前端的异步请求后,调用Service层的
selectAll方法进行业务查询。得到返回的List<Brand>集合后,将该集合转换为JSON格式字符串,最后通过响应对象将JSON数据返回给前端。 -
Service层(BrandService)
selectAll方法被调用后,直接调用Dao层的brandMapper.selectAll()方法,获取所有品牌数据的列表,并将结果原样返回给Web层。 -
Dao层(BrandMapper)
selectAll()方法执行数据库查询(例如SQL的SELECT * FROM brand),返回一个包含所有品牌记录的List<Brand>集合。
新增品牌-后台&前端
1. 前端页面(brand.html)
用户点击提交按钮后,页面收集表单中的品牌数据,通过异步请求(AJAX)将这些数据发送给后端。收到后端返回的成功标识后,前端判断添加操作成功,然后关闭当前添加窗口,并重新加载品牌列表数据以刷新页面显示。
2. Web层(AddServlet)
接收前端发来的品牌数据,随后调用Service层的add方法进行添加操作。添加完成后,向前端响应一个表示操作成功的标识。
3. Service层(BrandService)
add方法接收Web层传入的品牌对象,调用Dao层的brandMapper.add(brand)方法,将该品牌数据传递下去。
4. Dao层(BrandMapper)
add(brand)方法执行数据库的插入操作(例如SQL的INSERT INTO brand语句),将品牌数据持久化到数据库中。
综合案例-2
Servlet代码优化
·Web层的Servlet个数太多了,不利于管理和编写
·将Servlet进行归类,对于同一个实体的操作方法,写到一个Servlet中。

1.获取最后一段路径,其实就是方法名称
2.通过反射获取方法对象,执行方法
自定义Servlet,使用请求路径进行方法分发;替换HttpServlet的灯具请求凡是进行方法分发
批量删除
1. 前端页面(brand.html)
用户点击"批量删除"按钮后,前端收集所有被勾选的品牌ID,组成一个ID数组。然后发送一个异步请求(AJAX),将这个ID数组作为请求数据提交给后端。收到后端返回的成功标识后,前端判断删除操作是否成功,向用户给出操作结果的提示(如"删除成功"),并重新查询加载品牌列表数据,刷新页面。
2. Web层(BrandServlet 或专门的删除Servlet)
接收前端发来的ID数组数据。随后调用Service层的deleteByIds方法,将该ID数组传入进行批量删除操作。删除完成后,向前端响应一个表示操作成功的标识。
3. Service层(BrandService)
deleteByIds(int[] ids)方法接收Web层传入的ID数组,调用Dao层的brandMapper.deleteByIds(ids)方法,将待删除的ID集合传递下去。
4. Dao层(BrandMapper)
deleteByIds(int[] ids)方法执行数据库的批量删除操作。对应的SQL语句为 DELETE FROM tb_brand WHERE id IN (?, ?, ?)(问号个数根据数组长度动态生成)。在MyBatis等持久层框架中,通过 <foreach> 标签动态拼接多个ID占位符,最终将数组中的ID传入SQL,完成数据库记录的删除。
分页查询
前端传递给后台:1.当前页码:currentPage 2.每页显示条数:pageSize
后台给前端返回:1.当前页数据:List 2.总记录数:totalCount
1. 前端页面(brand.html)
页面加载完成后,自动发送一个异步请求(AJAX),携带当前页码(page)和每页显示条数(size)作为请求参数,向后端请求分页数据。收到响应后,获取分页结果(包含列表数据和总记录数等),用于页面渲染。
2. Web层(BrandServlet)
接收到前端的异步请求,获取参数中的"当前页码"和"每页显示条数"。随后调用Service层的分页查询方法,并得到封装好的PageBean对象。将该PageBean转换为JSON格式字符串,通过响应写回客户端。
3. Service层(BrandService)
接收当前页码和每页显示条数两个参数。首先根据页码和每页条数计算起始索引(begin),即数据库查询的偏移量。然后调用Dao层的两个方法:
-
调用
brandMapper.selectByPage(begin, size),查询该页对应的品牌列表数据; -
调用
brandMapper.selectTotalCount(),查询品牌的总记录数。最后将列表数据和总记录数组装进
PageBean对象,返回给Web层。
4. Dao层(BrandMapper)
提供两个具体的数据操作方法:
-
selectByPage(begin, size):根据传入的起始索引和每页条数,执行数据库的分页查询(例如使用LIMIT begin, size),返回当前页的品牌列表。 -
selectTotalCount():执行数据库的计数查询(例如SELECT COUNT(*) FROM tb_brand),返回品牌的总记录数,用于前端计算总页数等。
条件查询
·三个条件之间的关系:AND
·三个条件不需要全部填写-->动态SQL <if><where>
·条件查询需要分页
1. 前端页面(brand.html)
-
查询表单与一个"查询条件对象模型"绑定,用于收集用户输入的筛选条件(如品牌名称、状态等)。
-
用户点击"查询"按钮时触发数据请求。
-
页面加载完成(或点击查询按钮)后,发送异步请求(AJAX)到后端,请求参数包括:当前页码、每页显示条数,以及封装了查询条件的对象(通常以JSON格式传递)。
2. Web层(BrandServlet)
-
接收前端传来的三个参数:当前页码、每页显示条数、查询条件对象。
-
调用Service层的条件分页查询方法,获得返回结果
PageBean(包含总记录数和当前页数据列表)。 -
将
PageBean对象转换为 JSON 字符串,写回客户端响应。
3. Service层(BrandService)
-
接收参数:当前页码、每页显示条数、查询条件对象。
-
先根据页码和每页条数计算数据库查询的起始索引(
begin = (page - 1) * size)。 -
然后分两步调用 Dao 层:
-
调用
brandMapper.selectByPageAndCondition(begin, size, brand),获取当前页符合条件的品牌列表。 -
调用
brandMapper.selectTotalCount(brand),获取符合查询条件的总记录数。
-
-
将获得的当前页列表和总记录数组装成一个
PageBean对象,并返回给 Web 层。
4. Dao层(BrandMapper)
-
selectByPageAndCondition(begin, size, brand):执行带条件的分页查询,SQL 形如SELECT * FROM tb_brand WHERE ... LIMIT begin, size,返回符合条件的当前页品牌列表。 -
selectTotalCount(brand):执行带条件的计数查询,SQL 形如SELECT COUNT(*) FROM tb_brand WHERE ...,返回符合条件的品牌总数。