网站设计专业需要什么免费推广神器
2026/1/21 1:32:03 网站建设 项目流程
网站设计专业需要什么,免费推广神器,薪火相传网站建设,软件设计学什么课程综合案例 今日目标#xff1a; 能够完成查询所有功能能够完成添加功能能够理解 BaseServlet 思想能够完成批量删除功能能够完成分页查询功能能够完成条件查询功能 1#xff0c;功能介绍 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aACcg93Y-1…综合案例今日目标能够完成查询所有功能能够完成添加功能能够理解 BaseServlet 思想能够完成批量删除功能能够完成分页查询功能能够完成条件查询功能1功能介绍[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aACcg93Y-1686534210003)(E:/za/heimajavaweb/day14-综合案例/ppt/assets/image-20210825171411003.png)]以上是我们在综合案例要实现的功能。对数据的除了对数据的增删改查功能外还有一些复杂的功能如批量删除、分页查询、条件查询等功能批量删除功能每条数据前都有复选框当我选中多条数据并点击批量删除按钮后会发送请求到后端并删除数据库中指定的多条数据。分页查询功能当数据库中有很多数据时我们不可能将所有的数据展示在一页里这个时候就需要分页展示数据。条件查询功能数据库量大的时候我们就需要精确的查询一些想看到的数据这个时候就需要通过条件查询。这里的修改品牌和删除品牌功能在课程上不做讲解留作同学来下的练习。2环境准备环境准备我们主要完成以下两件事即可将资料的 brand-case 模块导入到 idea中执行资料中提供的 tb_brand.sql脚本2.1 工程准备将04-资料\01-初始工程中的brand-case工程导入到我们自己的 idea 中。工程结构如下2.2 创建表下面是创建表的语句-- 删除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 (华为, 华为技术有限公司, 100, 万物互联, 1), (小米, 小米科技有限公司, 50, are you ok, 1), (格力, 格力电器股份有限公司, 30, 让世界爱上中国造, 1), (阿里巴巴, 阿里巴巴集团控股有限公司, 10, 买买买, 1), (腾讯, 腾讯计算机系统有限公司, 50, 玩玩玩, 0), (百度, 百度在线网络技术公司, 5, 搜搜搜, 0), (京东, 北京京东世纪贸易有限公司, 40, 就是快, 1), (小米, 小米科技有限公司, 50, are you ok, 1), (三只松鼠, 三只松鼠股份有限公司, 5, 好吃不上火, 0), (华为, 华为技术有限公司, 100, 万物互联, 1), (小米, 小米科技有限公司, 50, are you ok, 1), (格力, 格力电器股份有限公司, 30, 让世界爱上中国造, 1), (阿里巴巴, 阿里巴巴集团控股有限公司, 10, 买买买, 1), (腾讯, 腾讯计算机系统有限公司, 50, 玩玩玩, 0), (百度, 百度在线网络技术公司, 5, 搜搜搜, 0), (京东, 北京京东世纪贸易有限公司, 40, 就是快, 1), (华为, 华为技术有限公司, 100, 万物互联, 1), (小米, 小米科技有限公司, 50, are you ok, 1), (格力, 格力电器股份有限公司, 30, 让世界爱上中国造, 1), (阿里巴巴, 阿里巴巴集团控股有限公司, 10, 买买买, 1), (腾讯, 腾讯计算机系统有限公司, 50, 玩玩玩, 0), (百度, 百度在线网络技术公司, 5, 搜搜搜, 0), (京东, 北京京东世纪贸易有限公司, 40, 就是快, 1), (小米, 小米科技有限公司, 50, are you ok, 1), (三只松鼠, 三只松鼠股份有限公司, 5, 好吃不上火, 0), (华为, 华为技术有限公司, 100, 万物互联, 1), (小米, 小米科技有限公司, 50, are you ok, 1), (格力, 格力电器股份有限公司, 30, 让世界爱上中国造, 1), (阿里巴巴, 阿里巴巴集团控股有限公司, 10, 买买买, 1), (腾讯, 腾讯计算机系统有限公司, 50, 玩玩玩, 0), (百度, 百度在线网络技术公司, 5, 搜搜搜, 0), (京东, 北京京东世纪贸易有限公司, 40, 就是快, 1), (华为, 华为技术有限公司, 100, 万物互联, 1), (小米, 小米科技有限公司, 50, are you ok, 1), (格力, 格力电器股份有限公司, 30, 让世界爱上中国造, 1), (阿里巴巴, 阿里巴巴集团控股有限公司, 10, 买买买, 1), (腾讯, 腾讯计算机系统有限公司, 50, 玩玩玩, 0), (百度, 百度在线网络技术公司, 5, 搜搜搜, 0), (京东, 北京京东世纪贸易有限公司, 40, 就是快, 1), (小米, 小米科技有限公司, 50, are you ok, 1), (三只松鼠, 三只松鼠股份有限公司, 5, 好吃不上火, 0), (华为, 华为技术有限公司, 100, 万物互联, 1), (小米, 小米科技有限公司, 50, are you ok, 1), (格力, 格力电器股份有限公司, 30, 让世界爱上中国造, 1), (阿里巴巴, 阿里巴巴集团控股有限公司, 10, 买买买, 1), (腾讯, 腾讯计算机系统有限公司, 50, 玩玩玩, 0), (百度, 百度在线网络技术公司, 5, 搜搜搜, 0), (京东, 北京京东世纪贸易有限公司, 40, 就是快, 1);3查询所有功能[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1C83epRX-1686534210005)(E:/za/heimajavaweb/day14-综合案例/ppt/assets/image-20210825200138600.png)]如上图所示是查询所有品牌数据在页面展示的效果。要实现这个功能要先搞明白如下问题什么时候发送异步请求页面加载完毕后就需要在页面上看到所有的品牌数据。所以在mounted()这个构造函数中写发送异步请求的代码。请求需要携带参数吗查询所有功能不需要携带什么参数。响应的数据格式是什么样后端是需要将ListBrand对象转换为 JSON 格式的数据并响应回给浏览器。响应数据格式如下[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-udA6OXck-1686534210005)(E:/za/heimajavaweb/day14-综合案例/ppt/assets/image-20210825201634849.png)]整体流程如下[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5vQsCQ7X-1686534210006)(E:/za/heimajavaweb/day14-综合案例/ppt/assets/image-20210825200332542.png)]我们先实现后端程序然后再实现前端程序。3.1 后端实现3.1.1 dao方法实现在com.itheima.mapper.BrandMapper接口中定义抽象方法并使用Select注解编写 sql 语句/** * 查询所有 * return */ Select(select * from tb_brand) ListBrand selectAll();由于表中有些字段名和实体类中的属性名没有对应所以需要在com/itheima/mapper/BrandMapper.xml映射配置文件中定义结果映射 使用resultMap标签。映射配置文件内容如下?xml version1.0 encodingUTF-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.itheima.mapper.BrandMapper resultMap idbrandResultMap typebrand result propertybrandName columnbrand_name / result propertycompanyName columncompany_name / /resultMap /mapper定义完结果映射关系后在接口selectAll()方法上引用该结构映射。使用ResultMap(brandResultMap)注解完整接口的selectAll()方法如下/** * 查询所有 * return */ Select(select * from tb_brand) ResultMap(brandResultMap) ListBrand selectAll();3.1.2 service方法实现在com.itheima.service包下创建BrandService接口在该接口中定义查询所有的抽象方法public interface BrandService { /** * 查询所有 * return */ ListBrand selectAll(); }并在com.itheima.service下再创建impl包impl表示是放 service 层接口的实现类的包。 在该包下创建名为BrandServiceImpl类public class BrandServiceImpl implements BrandService { Override public ListBrand selectAll() { } }此处为什么要给 service 定义接口呢因为service定义了接口后在 servlet 中就可以使用多态的形式创建Service实现类的对象如下这里使用多态是因为方便我们后期解除Servlet和service的耦合。从上面的代码我们可以看到SelectAllServlet类和BrandServiceImpl类之间是耦合在一起的如果后期BrandService有其它更好的实现类例如叫BrandServiceImpl那就需要修改SelectAllServlet类中的代码。后面我们学习了Spring框架后就可以解除SelectAllServlet类和红色框括起来的代码耦合。而现在咱们还做不到解除耦合在这里只需要理解为什么定义接口即可。BrandServiceImpl类代码如下public class BrandServiceImpl implements BrandService { //1. 创建SqlSessionFactory 工厂对象 SqlSessionFactory factory SqlSessionFactoryUtils.getSqlSessionFactory(); Override public ListBrand selectAll() { //2. 获取SqlSession对象 SqlSession sqlSession factory.openSession(); //3. 获取BrandMapper BrandMapper mapper sqlSession.getMapper(BrandMapper.class); //4. 调用方法 ListBrand brands mapper.selectAll(); //5. 释放资源 sqlSession.close(); return brands; } }3.1.3 servlet实现在com.itheima.web.servlet包下定义名为SelectAllServlet的查询所有的servlet。该servlet逻辑如下调用service的selectAll()方法查询所有的品牌数据并接口返回结果将返回的结果转换为 json 数据响应 json 数据代码如下WebServlet(/selectAllServlet) public class SelectAllServlet extends HttpServlet { private BrandService brandService new BrandServiceImpl(); Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1. 调用service查询 ListBrand brands brandService.selectAll(); //2. 转为JSON String jsonString JSON.toJSONString(brands); //3. 写数据 response.setContentType(text/json;charsetutf-8); //告知浏览器响应的数据是什么 告知浏览器使用什么字符集进行解码 response.getWriter().write(jsonString); } Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }3.1.4 测试后端程序在浏览器输入访问 servlet 的资源路径http://localhost:8080/brand-case/selectAllServlet如果没有报错并能看到如下信息表明后端程序没有问题[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VXBvXwlh-1686534210006)(E:/za/heimajavaweb/day14-综合案例/ppt/assets/image-20210825205133752.png)]3.2 前端实现前端需要在页面加载完毕后发送 ajax 请求所以发送请求的逻辑应该放在mounted()钩子函数中。而响应回来的数据需要赋值给表格绑定的数据模型从下图可以看出表格绑定的数据模型是tableData前端代码如下mounted(){ //当页面加载完成后发送异步请求获取数据 var _this this; axios({ method:get, url:http://localhost:8080/brand-case/selectAllServlet }).then(function (resp) { _this.tableData resp.data; }) }4添加功能上图是添加数据的对话框当点击提交按钮后就需要将数据提交到后端并将数据保存到数据库中。下图是整体的流程[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mcnaVWBa-1686534210007)(E:/za/heimajavaweb/day14-综合案例/ppt/assets/image-20210825221329231.png)]页面发送请求时需要将输入框输入的内容提交给后端程序而这里是以 json 格式进行传递的。而具体的数据格式如下[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TUXeZAiQ-1686534210007)(E:/za/heimajavaweb/day14-综合案例/ppt/assets/image-20210826185917510.png)]注意由于是添加数据所以上述json数据中id是没有值的。4.1 后端实现4.1.1 dao方法实现在BrandMapper接口中定义add()添加方法并使用Insert注解编写sql语句/** * 添加数据 * param brand */ Insert(insert into tb_brand values(null,#{brandName},#{companyName},#{ordered},#{description},#{status})) void add(Brand brand);4.1.2 service方法实现在BrandService接口中定义add()添加数据的业务逻辑方法/** * 添加数据 * param brand */ void add(Brand brand);在BrandServiceImpl类中重写add()方法并进行业务逻辑实现Override public void add(Brand brand) { //2. 获取SqlSession对象 SqlSession sqlSession factory.openSession(); //3. 获取BrandMapper BrandMapper mapper sqlSession.getMapper(BrandMapper.class); //4. 调用方法 mapper.add(brand); sqlSession.commit();//提交事务 //5. 释放资源 sqlSession.close(); }注意增删改操作一定要提交事务。4.1.3 servlet实现在com.itheima.web.servlet包写定义名为AddServlet的 Servlet。该 Servlet 的逻辑如下接收页面提交的数据。页面到时候提交的数据是 json 格式的数据所以此处需要使用输入流读取数据将接收到的数据转换为Brand对象调用 service 的add()方法进行添加的业务逻辑处理给浏览器响应添加成功的标识这里直接给浏览器响应success字符串表示成功servlet 代码实现如下WebServlet(/addServlet) public class AddServlet extends HttpServlet { private BrandService brandService new BrandServiceImpl(); Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1. 接收品牌数据 BufferedReader br request.getReader(); String params br.readLine();//json字符串 //转为Brand对象 Brand brand JSON.parseObject(params, Brand.class); //2. 调用service添加 brandService.add(brand); //3. 响应成功的标识 response.getWriter().write(success); } Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }4.2 前端实现上图左边是页面效果里面的提交按钮可以通过上图右边看出绑定了一个 单击事件而该事件绑定的是addBrand函数所以添加数据功能的逻辑代码应该写在addBrand()函数中。在此方法中需要发送异步请求并将表单中输入的数据作为参数进行传递。如下// 添加数据 addBrand() { var _this this; // 发送ajax请求添加数据 axios({ method:post, url:http://localhost:8080/brand-case/addServlet, data:_this.brand }).then(function (resp) { //响应数据的处理逻辑 }) }在then函数中的匿名函数是成功后的回调函数而resp.data就可以获取到响应回来的数据如果值是success表示数据添加成功。成功后我们需要做一下逻辑处理关闭新增对话框窗口如下图所示是添加数据的对话框代码从代码中可以看到此对话框绑定了dialogVisible数据模型只需要将该数据模型的值设置为 false就可以关闭新增对话框窗口了。重新查询数据数据添加成功与否用户只要能在页面上查看到数据说明添加成功。而此处需要重新发送异步请求获取所有的品牌数据而这段代码在查询所有功能中已经实现所以我们可以将此功能代码进行抽取抽取到一个selectAll()函数中// 查询所有数据 selectAll(){ var _this this; axios({ method:get, url:http://localhost:8080/brand-case/selectAllServlet }).then(function (resp) { _this.tableData resp.data; }) }那么就需要将mounted()钩子函数中代码改进为mounted(){ //当页面加载完成后发送异步请求获取数据 this.selectAll(); }同时在新增响应的回调中调用selectAll()进行数据的重新查询。弹出消息给用户提示添加成功[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0b818d0o-1686534210008)(E:/za/heimajavaweb/day14-综合案例/ppt/assets/image-20210825224958220.png)]上图左边就是 elementUI 官网提供的成功提示代码而上图右边是具体的效果。注意上面的this需要的是表示 VUE 对象的this。综上所述前端代码如下// 添加数据 addBrand() { var _this this; // 发送ajax请求添加数据 axios({ method:post, url:http://localhost:8080/brand-case/addServlet, data:_this.brand }).then(function (resp) { if(resp.data success){ //添加成功 //关闭窗口 _this.dialogVisible false; // 重新查询数据 _this.selectAll(); // 弹出消息提示 _this.$message({ message: 恭喜你添加成功, type: success }); } }) }5servlet优化5.1 问题导入Web 层的 Servlet 个数太多了不利于管理和编写通过之前的两个功能我们发现每一个功能都需要定义一个servlet一个模块需要实现增删改查功能就需要4个servlet模块一多就会造成servlet泛滥。此时我们就想servlet能不能像service一样一个模块只定义一个servlet而每一个功能只需要在该servlet中定义对应的方法。例如下面代码WebServlet(/brand/*) public class BrandServlet { //查询所有 public void selectAll(...) {} //添加数据 public void add(...) {} //修改数据 public void update(...) {} //删除删除 public void delete(...) {} }而我们知道发送请求servlettomcat会自动的调用service()方法之前我们在自定义的servlet中重写doGet()方法和doPost()方法当我们访问该servlet时会根据请求方式将请求分发给doGet()或者doPost()方法如下图那么我们也可以仿照这样请求分发的思想在service()方法中根据具体的操作调用对应的方法如查询所有就调用selectAll()方法添加企业信息就调用add()方法。为了做到通用我们定义一个通用的servlet类在定义其他的servlet是不需要继承HttpServlet而继承我们定义的BaseServlet在BaseServlet中调用具体servlet如BrandServlet中的对应方法。public class BaseServlet extends HttpServlet { Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //进行请求的分发 } }BrandServlet定义就需要修改为如下WebServlet(/brand/*) public class BrandServlet extends BaseServlet { //用户实现分页查询 public void selectAll(...) {} //添加企业信息 public void add(...) {} //修改企业信息 public void update(...) {} //删除企业信息 public void delete(...) {} }那么如何在BaseServlet中调用对应的方法呢比如查询所有就调用selectAll()方法。可以规定在发送请求时请求资源的二级路径/brandServlet/selectAll和需要调用的方法名相同如查询所有数据的路径以后就需要写成http://localhost:8080/brand-case/brandServlet/selectAll添加数据的路径以后就需要写成http://localhost:8080/brand-case/brandServlet/add修改数据的路径以后就需要写成http://localhost:8080/brand-case/brandServlet/update删除数据的路径以后就需要写成http://localhost:8080/brand-case/brandServlet/delete这样的话在BaseServlet中就需要获取到资源的二级路径作为方法名然后调用该方法public class BaseServlet extends HttpServlet { Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1. 获取请求路径 String uri req.getRequestURI(); // 例如路径为/brand-case/brand/selectAll //2. 获取最后一段路径方法名 int index uri.lastIndexOf(/); String methodName uri.substring(index 1); // 获取到资源的二级路径 selectAll //2. 执行方法 //2.1 获取BrandServlet /UserServlet 字节码对象 Class //System.out.println(this); Class? extends BaseServlet cls this.getClass(); //2.2 获取方法 Method对象 try { Method method cls.getMethod(methodName,); //4,调用该方法 method.invoke(this,); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } }通过上面代码发现根据方法名获取对应方法的Method对象时需要指定方法参数的字节码对象。解决这个问题可以将方法的参数类型规定死而方法中可能需要用到request对象和response对象所以指定方法的参数为HttpServletRequest和HttpServletResponse那么BrandServlet代码就可以改进为WebServlet(/brand/*) public class BrandServlet extends BaseServlet { //用户实现分页查询 public void selectAll(HttpServletRequest req, HttpServletResponse resp) {} //添加企业信息 public void add(HttpServletRequest req, HttpServletResponse resp) {} //修改企业信息 public void update(HttpServletRequest req, HttpServletResponse resp) {} //删除企业信息 public void delete(HttpServletRequest req, HttpServletResponse resp) {} }BaseServlet代码可以改进为public class BaseServlet extends HttpServlet { //根据请求的最后一段路径来进行方法分发 Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1. 获取请求路径 String uri req.getRequestURI(); // 例如路径为/brand-case/brand/selectAll //2. 获取最后一段路径方法名 int index uri.lastIndexOf(/); String methodName uri.substring(index 1); // 获取到资源的二级路径 selectAll //2. 执行方法 //2.1 获取BrandServlet /UserServlet 字节码对象 Class //System.out.println(this); Class? extends BaseServlet cls this.getClass(); //2.2 获取方法 Method对象 try { Method method cls.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class); //2.3 执行方法 method.invoke(this,req,resp); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } }5.2 代码优化5.2.1 后端优化定义了BaseServlet后针对品牌模块我们定义一个BrandServlet的 Servlet并使其继承BaseServlet。在BrandServlet中定义 以下功能的方法查询所有功能方法名声明为selectAll并将之前的SelectAllServlet中的逻辑代码拷贝到该方法中添加数据功能方法名声明为add并将之前的AddServlet中的逻辑代码拷贝到该方法中具体代码如下WebServlet(/brand/*) public class BrandServlet extends BaseServlet{ private BrandService brandService new BrandServiceImpl(); public void selectAll(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1. 调用service查询 ListBrand brands brandService.selectAll(); //2. 转为JSON String jsonString JSON.toJSONString(brands); //3. 写数据 response.setContentType(text/json;charsetutf-8); response.getWriter().write(jsonString); } public void add(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1. 接收品牌数据 BufferedReader br request.getReader(); String params br.readLine();//json字符串 //转为Brand对象 Brand brand JSON.parseObject(params, Brand.class); //2. 调用service添加 brandService.add(brand); //3. 响应成功的标识 response.getWriter().write(success); } }5.2.2 前端优化页面中之前发送的请求的路径都需要进行修改selectAll()函数中发送异步请求的url应该改为http://localhost:8080/brand-case/brand/selectAll。具体代码如下// 查询分页数据 selectAll(){ var _this this; axios({ method:get, url:http://localhost:8080/brand-case/brand/selectAll }).then(function (resp) { _this.tableData resp.data; }) }addBrand()函数中发送异步请求的url应该改为http://localhost:8080/brand-case/brand/add。具体代码如下// 添加数据 addBrand() { //console.log(this.brand); var _this this; // 发送ajax请求添加数据 axios({ method:post, url:http://localhost:8080/brand-case/brand/add, data:_this.brand }).then(function (resp) { if(resp.data success){ //添加成功 //关闭窗口 _this.dialogVisible false; // 重新查询数据 _this.selectAll(); // 弹出消息提示 _this.$message({ message: 恭喜你添加成功, type: success }); } }) }6批量删除如上图所示点击多条数据前的复选框就意味着要删除这些数据而点击了批量删除按钮后需要让用户确认一下因为有可能是用户误操作的当用户确定后需要给后端发送请求并携带者需要删除数据的多个id值后端程序删除数据库中的数据。具体的流程如下[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YeiaTRy7-1686534210008)(E:/za/heimajavaweb/day14-综合案例/ppt/assets/image-20210826201651241.png)]注意前端发送请求时需要将要删除的多个id值以json格式提交给后端而该json格式数据如下[1,2,3,4]6.1 后端实现6.1.1 dao方法实现在BrandMapper接口中定义deleteByIds()添加方法由于这里面要用到动态 sql 属于复杂的sql操作建议使用映射配置文件。接口方法声明如下/** * 批量删除 * param ids */ void deleteByIds(Param(ids) int[] ids);在BrandMapper.xml映射配置文件中添加 statementdelete iddeleteByIds delete from tb_brand where id in foreach collectionids itemid separator, open( close) #{id} /foreach /delete6.1.2 service方法实现在BrandService接口中定义deleteByIds()批量删除的业务逻辑方法/** * 批量删除 * param ids */ void deleteByIds( int[] ids);在BrandServiceImpl类中重写deleteByIds()方法并进行业务逻辑实现Override public void deleteByIds(int[] ids) { //2. 获取SqlSession对象 SqlSession sqlSession factory.openSession(); //3. 获取BrandMapper BrandMapper mapper sqlSession.getMapper(BrandMapper.class); //4. 调用方法 mapper.deleteByIds(ids); sqlSession.commit();//提交事务 //5. 释放资源 sqlSession.close(); }6.1.3 servlet实现在BrandServlet类中定义deleteByIds()方法。而该方法的逻辑如下接收页面提交的数据。页面到时候提交的数据是 json 格式的数据所以此处需要使用输入流读取数据接收页面提交的数据。页面到时候提交的数据是 json 格式的数据所以此处需要使用输入流读取数据将接收到的数据转换为int[]数组调用 service 的deleteByIds()方法进行批量删除的业务逻辑处理给浏览器响应添加成功的标识这里直接给浏览器响应success字符串表示成功servlet 中deleteByIds()方法代码实现如下public void deleteByIds(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1. 接收数据 json [1,2,3] BufferedReader br request.getReader(); String params br.readLine();//json字符串 //转为 int[] int[] ids JSON.parseObject(params, int[].class); //2. 调用service添加 brandService.deleteByIds(ids); //3. 响应成功的标识 response.getWriter().write(success); }6.2 前端实现此功能的前端代码实现稍微有点麻烦分为以下几步实现6.2.1 获取选中的id值从上图可以看出表格复选框绑定了一个selection-change事件该事件是当选择项发生变化时会触发。该事件绑定了handleSelectionChange函数而该函数有一个参数val该参数是获取选中行的数据如下而我们只需要将所有选中数据的id值提交给服务端即可获取id的逻辑我们书写在批量删除按钮绑定的函数中。在批量删除按钮绑定单击事件并给绑定触发时调用的函数如下并在Vue对象中的 methods 中定义deleteByIds()函数在该函数中从multipleSelection数据模型中获取所选数据的id值。要完成这个功能需要在 Vue 对象中定义一个数据模型selectedIds:[]在deleteByIds()函数中遍历multipleSelection数组并获取到每一个所选数据的id值存储到selectedIds数组中代码实现如下//1. 创建id数组 [1,2,3], 从 this.multipleSelection 获取即可 for (let i 0; i this.multipleSelection.length; i) { let selectionElement this.multipleSelection[i]; this.selectedIds[i] selectionElement.id; }6.2.2 发送异步请求使用 axios 发送异步请求并经上一步获取到的存储所有的 id 数组作为请求参数//2. 发送AJAX请求 var _this this; // 发送ajax请求添加数据 axios({ method:post, url:http://localhost:8080/brand-case/brand/deleteByIds, data:_this.selectedIds }).then(function (resp) { if(resp.data success){ //删除成功 // 重新查询数据 _this.selectAll(); // 弹出消息提示 _this.$message({ message: 恭喜你删除成功, type: success }); } })6.2.3 确定框实现由于删除操作是比较危险的有时候可能是由于用户的误操作点击了批量删除按钮所以在点击了按钮后需要先给用户确认提示。而确认框在elementUI中也提供了如下图[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2LtoOOUo-1686534210009)(E:/za/heimajavaweb/day14-综合案例/ppt/assets/image-20210826225742852.png)]而在点击确定按钮后需要执行之前删除的逻辑。因此前端代码实现如下// 批量删除 deleteByIds(){ // 弹出确认提示框 this.$confirm(此操作将删除该数据, 是否继续?, 提示, { confirmButtonText: 确定, cancelButtonText: 取消, type: warning }).then(() { //用户点击确认按钮 //1. 创建id数组 [1,2,3], 从 this.multipleSelection 获取即可 for (let i 0; i this.multipleSelection.length; i) { let selectionElement this.multipleSelection[i]; this.selectedIds[i] selectionElement.id; } //2. 发送AJAX请求 var _this this; // 发送ajax请求添加数据 axios({ method:post, url:http://localhost:8080/brand-case/brand/deleteByIds, data:_this.selectedIds }).then(function (resp) { if(resp.data success){ //删除成功 // 重新查询数据 _this.selectAll(); // 弹出消息提示 _this.$message({ message: 恭喜你删除成功, type: success }); } }) }).catch(() { //用户点击取消按钮 this.$message({ type: info, message: 已取消删除 }); }); }7分页查询我们之前做的查询所有功能中将数据库中所有的数据查询出来并展示到页面上试想如果数据库中的数据有很多假设有十几万条的时候将数据全部展示出来肯定不现实那如何解决这个问题呢几乎所有的网站都会使用分页解决这个问题。每次只展示一页的数据比如一页展示10条数据如果还想看其他的数据可以通过点击页码进行查询[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VU4Smbbl-1686534210009)(E:/za/heimajavaweb/day14-综合案例/ppt/assets/image-20210826230648031.png)]7.1 分析7.1.1 分页查询sql分页查询也是从数据库进行查询的所以我们要分页对应的SQL语句应该怎么写。分页查询使用LIMIT关键字格式为LIMIT 开始索引 每页显示的条数。以后前端页面在发送请求携带参数时它并不明确开始索引是什么但是它知道查询第几页。所以开始索引需要在后端进行计算计算的公式是 开始索引 当前页码 - 1* 每页显示条数比如查询第一页的数据的 SQL 语句是select * from tb_brand limit 0,5;查询第二页的数据的 SQL 语句是select * from tb_brand limit 5,5;查询第三页的数据的 SQL 语句是select * from tb_brand limit 10,5;7.1.2 前后端数据分析分页查询功能时候比较复杂的所以我们要先分析清楚以下两个问题前端需要传递什么参数给后端根据上一步对分页查询 SQL 语句分析得出前端需要给后端两个参数当前页码 currentPage每页显示条数pageSize后端需要响应什么数据给前端上图是分页查询页面展示的效果从上面我们可以看出需要响应以下联股份数据当前页需要展示的数据。我们在后端一般会存储到 List 集合中总共记录数。在上图页面中需要展示总的记录数所以这部分数据也需要。总的页面 elementUI 的分页组件会自动计算我们不需要关心而这两部分需要封装到 PageBean 对象中并将该对象转换为 json 格式的数据响应回给浏览器通过上面的分析我们需要先在pojo包下创建PageBean类为了做到通过会将其定义成泛型类代码如下//分页查询的JavaBean public class PageBeanT { // 总记录数 private int totalCount; // 当前页数据 private ListT rows; public int getTotalCount() { return totalCount; } public void setTotalCount(int totalCount) { this.totalCount totalCount; } public ListT getRows() { return rows; } public void setRows(ListT rows) { this.rows rows; } }7.1.3 流程分析后端需要响应总记录数和当前页的数据两部分数据给前端所以在BrandMapper接口中需要定义两个方法selectByPage() 查询当前页的数据的方法selectTotalCount() 查询总记录的方法整体流程如下[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KanE1Isi-1686534210009)(E:/za/heimajavaweb/day14-综合案例/ppt/assets/image-20210826232620404.png)]7.2 后端实现7.2.1 dao方法实现在BrandMapper接口中定义selectByPage()方法进行分页查询代码如下/** * 分页查询 * param begin * param size * return */ Select(select * from tb_brand limit #{begin} , #{size}) ResultMap(brandResultMap) ListBrand selectByPage(Param(begin) int begin,Param(size) int size);在BrandMapper接口中定义selectTotalCount()方法进行统计记录数代码如下/** * 查询总记录数 * return */ Select(select count(*) from tb_brand ) int selectTotalCount();7.2.2 service方法实现在BrandService接口中定义selectByPage()分页查询数据的业务逻辑方法/** * 分页查询 * param currentPage 当前页码 * param pageSize 每页展示条数 * return */ PageBeanBrand selectByPage(int currentPage,int pageSize);在BrandServiceImpl类中重写selectByPage()方法并进行业务逻辑实现Override public PageBeanBrand selectByPage(int currentPage, int pageSize) { //2. 获取SqlSession对象 SqlSession sqlSession factory.openSession(); //3. 获取BrandMapper BrandMapper mapper sqlSession.getMapper(BrandMapper.class); //4. 计算开始索引 int begin (currentPage - 1) * pageSize; // 计算查询条目数 int size pageSize; //5. 查询当前页数据 ListBrand rows mapper.selectByPage(begin, size); //6. 查询总记录数 int totalCount mapper.selectTotalCount(); //7. 封装PageBean对象 PageBeanBrand pageBean new PageBean(); pageBean.setRows(rows); pageBean.setTotalCount(totalCount); //8. 释放资源 sqlSession.close(); return pageBean; }7.2.3 servlet实现在BrandServlet类中定义selectByPage()方法。而该方法的逻辑如下获取页面提交的当前页码和每页显示条目数两个数据。这两个参数是在url后进行拼接的格式是url?currentPage1pageSize5。获取这样的参数需要使用requet.getparameter()方法获取。调用 service 的selectByPage()方法进行分页查询的业务逻辑处理将查询到的数据转换为 json 格式的数据响应 json 数据servlet 中selectByPage()方法代码实现如下public void selectByPage(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1. 接收 当前页码 和 每页展示条数 url?currentPage1pageSize5 String _currentPage request.getParameter(currentPage); String _pageSize request.getParameter(pageSize); int currentPage Integer.parseInt(_currentPage); int pageSize Integer.parseInt(_pageSize); //2. 调用service查询 PageBeanBrand pageBean brandService.selectByPage(currentPage, pageSize); //2. 转为JSON String jsonString JSON.toJSONString(pageBean); //3. 写数据 response.setContentType(text/json;charsetutf-8); response.getWriter().write(jsonString); }7.2.4 测试在浏览器上地址栏输入http://localhost:8080/brand-case/brand/selectByPage?currentPage1pageSize5查询到以下数据[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rTen47n9-1686534210010)(E:/za/heimajavaweb/day14-综合案例/ppt/assets/image-20210828184610060.png)]7.3 前端实现7.3.1 selectAll 代码改进selectAll()函数之前是查询所有数据现需要改成分页查询。 请求路径应改为http://localhost:8080/brand-case/brand/selectByPage?currentPage1pageSize5而currentPage和pageSize是需要携带的参数分别是 当前页码 和 每页显示的条目数。刚才我们对后端代码进行测试可以看出响应回来的数据所以在异步请求的成功回调函数then中的匿名函数中给页面表格的数据模型赋值_this.tableData resp.data.rows;。整体代码如下var _this this; axios({ method:post, url:http://localhost:8080/brand-case/brand/selectByPagecurrentPage1pageSize5 }).then(resp { //设置表格数据 _this.tableData resp.data.rows; // {rows:[],totalCount:100} })响应的数据中还有总记录数要进行总记录数展示需要在页面绑定数据模型注意该数据模型需要在Vue对象中声明出来。那异步请求的代码就可以优化为var _this this; axios({ method:post, url:http://localhost:8080/brand-case/brand/selectByPage?currentPage1pageSize5 }).then(resp { //设置表格数据 _this.tableData resp.data.rows; // {rows:[],totalCount:100} //设置总记录数 _this.totalCount resp.data.totalCount; })而页面中分页组件给当前页码和每页显示的条目数都绑定了数据模型所以selectAll()函数中发送异步请求的资源路径中不能将当前页码和 每页显示条目数写死代码就可以优化为var _this this; axios({ method:post, url:http://localhost:8080/brand-case/brand/selectByPage?currentPagethis.currentPagepageSize this.pageSize }).then(resp { //设置表格数据 _this.tableData resp.data.rows; // {rows:[],totalCount:100} //设置总记录数 _this.totalCount resp.data.totalCount; })7.3.2 改变每页条目数当我们改变每页显示的条目数后需要重新发送异步请求。而下图是分页组件代码size-change就是每页显示的条目数发生变化时会触发的事件而该事件绑定了一个handleSizeChange函数整个逻辑如下handleSizeChange(val) { //我们选择的是 ‘5条/页’ 此值就是 5.而我们选择了 10条/页 此值就是 10 // 重新设置每页显示的条数 this.pageSize val; //调用 selectAll 函数重新分页查询数据 this.selectAll(); }7.3.3 改变当前页码当我们改变页码时需要重新发送异步请求。而下图是分页组件代码current-change就是页码发生变化时会触发的事件而该事件绑定了一个handleSizeChange函数整个逻辑如下handleCurrentChange(val) { //val 就是改变后的页码 // 重新设置当前页码 this.currentPage val; //调用 selectAll 函数重新分页查询数据 this.selectAll(); }8条件查询上图就是用来输入条件查询的条件数据的。要做条件查询功能先明确以下三个问题3个条件之间什么关系同时满足所用 SQL 中多个条件需要使用 and 关键字连接3个条件必须全部填写吗不需要。想根据哪儿个条件查询就写那个所以这里需要使用动态 sql 语句条件查询需要分页吗需要根据上面三个问题的明确我们就可以确定sql语句了整个条件分页查询流程如下[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9RYargSp-1686534210010)(E:/za/heimajavaweb/day14-综合案例/ppt/assets/image-20210828224859135.png)]8.1 后端实现8.1.1 dao实现在BrandMapper接口中定义selectByPageAndCondition()方法 和selectTotalCountByCondition方法用来进行条件分页查询功能方法如下/** * 分页条件查询 * param begin * param size * return */ ListBrand selectByPageAndCondition(Param(begin) int begin,Param(size) int size,Param(brand) Brand brand); /** * 根据条件查询总记录数 * return */ int selectTotalCountByCondition(Brand brand);参数begin分页查询的起始索引size分页查询的每页条目数brand用来封装条件的对象由于这是一个复杂的查询语句需要使用动态sql所以我们在映射配置文件中书写 sql 语句。brand_name字段和company_name字段需要进行模糊查询所以需要使用%占位符。映射配置文件中 statement 书写如下!--查询满足条件的数据并进行分页-- select idselectByPageAndCondition resultMapbrandResultMap select * from tb_brand where if testbrand.brandName ! null and brand.brandName ! and brand_name like #{brand.brandName} /if if testbrand.companyName ! null and brand.companyName ! and company_name like #{brand.companyName} /if if testbrand.status ! null and status #{brand.status} /if /where limit #{begin} , #{size} /select !--查询满足条件的数据条目数-- select idselectTotalCountByCondition resultTypejava.lang.Integer select count(*) from tb_brand where if testbrandName ! null and brandName ! and brand_name like #{brandName} /if if testcompanyName ! null and companyName ! and company_name like #{companyName} /if if teststatus ! null and status #{status} /if /where /select8.1.2 service实现在BrandService接口中定义selectByPageAndCondition()分页查询数据的业务逻辑方法/** * 分页条件查询 * param currentPage * param pageSize * param brand * return */ PageBeanBrand selectByPageAndCondition(int currentPage,int pageSize,Brand brand);在BrandServiceImpl类中重写selectByPageAndCondition()方法并进行业务逻辑实现Override public PageBeanBrand selectByPageAndCondition(int currentPage, int pageSize, Brand brand) { //2. 获取SqlSession对象 SqlSession sqlSession factory.openSession(); //3. 获取BrandMapper BrandMapper mapper sqlSession.getMapper(BrandMapper.class); //4. 计算开始索引 int begin (currentPage - 1) * pageSize; // 计算查询条目数 int size pageSize; // 处理brand条件模糊表达式 String brandName brand.getBrandName(); if (brandName ! null brandName.length() 0) { brand.setBrandName(% brandName %); } String companyName brand.getCompanyName(); if (companyName ! null companyName.length() 0) { brand.setCompanyName(% companyName %); } //5. 查询当前页数据 ListBrand rows mapper.selectByPageAndCondition(begin, size, brand); //6. 查询总记录数 int totalCount mapper.selectTotalCountByCondition(brand); //7. 封装PageBean对象 PageBeanBrand pageBean new PageBean(); pageBean.setRows(rows); pageBean.setTotalCount(totalCount); //8. 释放资源 sqlSession.close(); return pageBean;注意brandName 和 companyName 属性值到时候需要进行模糊查询所以前后需要拼接上%。8.1.3 servlet实现在BrandServlet类中定义selectByPageAndCondition()方法。而该方法的逻辑如下获取页面提交的当前页码和每页显示条目数两个数据。这两个参数是在url后进行拼接的格式是url?currentPage1pageSize5。获取这样的参数需要使用requet.getparameter()方法获取。获取页面提交的条件数据并将数据封装到一个Brand对象中。由于这部分数据到时候是需要以 json 格式进行提交的所以我们需要通过流获取数据具体代码如下// 获取查询条件对象 BufferedReader br request.getReader(); String params br.readLine();//json字符串 //转为 Brand Brand brand JSON.parseObject(params, Brand.class);调用 service 的selectByPageAndCondition()方法进行分页查询的业务逻辑处理将查询到的数据转换为 json 格式的数据响应 json 数据servlet 中selectByPageAndCondition()方法代码实现如下/** * 分页条件查询 * param request * param response * throws ServletException * throws IOException */ public void selectByPageAndCondition(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1. 接收 当前页码 和 每页展示条数 url?currentPage1pageSize5 String _currentPage request.getParameter(currentPage); String _pageSize request.getParameter(pageSize); int currentPage Integer.parseInt(_currentPage); int pageSize Integer.parseInt(_pageSize); // 获取查询条件对象 BufferedReader br request.getReader(); String params br.readLine();//json字符串 //转为 Brand Brand brand JSON.parseObject(params, Brand.class); //2. 调用service查询 PageBeanBrand pageBean brandService.selectByPageAndCondition(currentPage,pageSize,brand); //2. 转为JSON String jsonString JSON.toJSONString(pageBean); //3. 写数据 response.setContentType(text/json;charsetutf-8); response.getWriter().write(jsonString); }8.2 前端实现前端代码我们从以下几方面实现查询表单绑定查询条件对象模型这一步在页面上已经实现了页面代码如下点击查询按钮查询数据从上面页面可以看到给查询按钮绑定了onSubmit()函数而在onSubmit()函数中只需要调用selectAll()函数进行条件分页查询。改进 selectAll() 函数子页面加载完成后发送异步请求需要携带当前页码、每页显示条数、查询条件对象。接下来先对携带的数据进行说明当前页码和每页显示条数这两个参数我们会拼接到 URL 的后面查询条件对象这个参数需要以 json 格式提交给后端程序修改selectAll()函数逻辑为var _this this; axios({ method:post, url:http://localhost:8080/brand-case/brand/selectByPageAndCondition?currentPagethis.currentPagepageSizethis.pageSize, data:this.brand }).then(function (resp) { //设置表格数据 _this.tableData resp.data.rows; // {rows:[],totalCount:100} //设置总记录数 _this.totalCount resp.data.totalCount; })9前端代码优化咱们已经将所有的功能实现完毕。而针对前端代码中的发送异步请求的代码如下var _this this; axios({ method:post, url:http://localhost:8080/brand-case/brand/selectByPageAndCondition?currentPagethis.currentPagepageSizethis.pageSize, data:this.brand }).then(function (resp) { //设置表格数据 _this.tableData resp.data.rows; // {rows:[],totalCount:100} //设置总记录数 _this.totalCount resp.data.totalCount; })需要在成功的回调函数也就是then函数中的匿名函数中使用this都需要在外边使用_this记录一下this所指向的对象因为在外边的this表示的是 Vue 对象而回调函数中的this表示的不是 vue 对象。这里我们可以使用ECMAScript6中的新语法箭头函数来简化这部分代码如上面的代码可以简化为:axios({ method:post, url:http://localhost:8080/brand-case/brand/selectByPageAndCondition?currentPagethis.currentPagepageSizethis.pageSize, data:this.brand }).then((resp) { //设置表格数据 this.tableData resp.data.rows; // {rows:[],totalCount:100} //设置总记录数 this.totalCount resp.data.totalCount; })箭头函数语法(参数) { 逻辑代码 }箭头函数的作用替换简化匿名函数。个参数需要以 json 格式提交给后端程序修改selectAll()函数逻辑为var _this this; axios({ method:post, url:http://localhost:8080/brand-case/brand/selectByPageAndCondition?currentPagethis.currentPagepageSizethis.pageSize, data:this.brand }).then(function (resp) { //设置表格数据 _this.tableData resp.data.rows; // {rows:[],totalCount:100} //设置总记录数 _this.totalCount resp.data.totalCount; })9前端代码优化咱们已经将所有的功能实现完毕。而针对前端代码中的发送异步请求的代码如下var _this this; axios({ method:post, url:http://localhost:8080/brand-case/brand/selectByPageAndCondition?currentPagethis.currentPagepageSizethis.pageSize, data:this.brand }).then(function (resp) { //设置表格数据 _this.tableData resp.data.rows; // {rows:[],totalCount:100} //设置总记录数 _this.totalCount resp.data.totalCount; })需要在成功的回调函数也就是then函数中的匿名函数中使用this都需要在外边使用_this记录一下this所指向的对象因为在外边的this表示的是 Vue 对象而回调函数中的this表示的不是 vue 对象。这里我们可以使用ECMAScript6中的新语法箭头函数来简化这部分代码如上面的代码可以简化为:axios({ method:post, url:http://localhost:8080/brand-case/brand/selectByPageAndCondition?currentPagethis.currentPagepageSizethis.pageSize, data:this.brand }).then((resp) { //设置表格数据 this.tableData resp.data.rows; // {rows:[],totalCount:100} //设置总记录数 this.totalCount resp.data.totalCount; })箭头函数语法(参数) { 逻辑代码 }箭头函数的作用替换简化匿名函数。Java作为一个“行业老人”已经有太多人才扑在这条路上国家提倡改革创新我们这样的打工族也要在传统的技术上融入新技巧提升自己的竞争力Java如何“改革创新”呢现如今Java技术更新的核心趋势通过AI能力赋能成熟技术栈实现效率跃迁、功能扩展与生态升级这一融合不仅解决了传统Java在智能化、自动化方面的短板还为其在企业级场景中的长期竞争力提供了新动能。大模型对Java的赋能价值技术栈升级从“代码驱动”到“AI驱动”自动化开发大模型可参与需求分析、架构设计、代码生成全流程。例如用AI辅助设计微服务架构自动生成服务拆分方案和API文档。智能测试通过大模型生成测试用例如基于用户故事自动编写JUnit测试覆盖边缘场景提升测试覆盖率。业务场景扩展从“功能实现”到“价值创造”数据驱动决策大模型可分析Java应用中的业务数据如用户行为日志生成洞察报告如用户流失预测、营销策略优化辅助决策。多模态交互结合Java的多媒体处理能力如FFmpeg集成大模型可实现图像/视频理解如自动审核用户上传内容拓展应用场景。生态竞争力强化从“封闭系统”到“开放生态”插件化架构通过大模型构建AI插件市场允许第三方开发者为Java应用贡献智能功能如自定义聊天机器人、智能报表生成器。跨语言协作大模型可作为中间层实现Java与Python、Rust等语言的无缝协作如Java调用Python训练的模型或Rust优化的推理引擎。AI不是来替代Java的而是来重新定义Java工程师的价值。因此捕获AI掌握技术是关键让AI成为我们最便利的工具.一定要把现有的技术和大模型结合起来而不是抛弃你们现有技术掌握AI能力的Java工程师比纯Java岗要吃香的多。即使现在裁员、降薪、团队解散的比比皆是……但后续的趋势一定是AI应用落地大模型方向才是实现职业升级、提升薪资待遇的绝佳机遇如何学习AGI大模型作为一名热心肠的互联网老兵我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。因篇幅有限仅展示部分资料需要点击下方链接即可前往获取2025最新版CSDN大礼包《AGI大模型学习资源包》免费分享**一、2025最新大模型学习路线一个明确的学习路线可以帮助新人了解从哪里开始按照什么顺序学习以及需要掌握哪些知识点。大模型领域涉及的知识点非常广泛没有明确的学习路线可能会导致新人感到迷茫不知道应该专注于哪些内容。我们把学习路线分成L1到L4四个阶段一步步带你从入门到进阶从理论到实战。L1级别:AI大模型时代的华丽登场L1阶段我们会去了解大模型的基础知识以及大模型在各个行业的应用和分析学习理解大模型的核心原理关键技术以及大模型应用场景通过理论原理结合多个项目实战从提示工程基础到提示工程进阶掌握Prompt提示工程。L2级别AI大模型RAG应用开发工程L2阶段是我们的AI大模型RAG应用开发工程我们会去学习RAG检索增强生成包括Naive RAG、Advanced-RAG以及RAG性能评估还有GraphRAG在内的多个RAG热门项目的分析。L3级别大模型Agent应用架构进阶实践L3阶段大模型Agent应用架构进阶实现我们会去学习LangChain、 LIamaIndex框架也会学习到AutoGPT、 MetaGPT等多Agent系统打造我们自己的Agent智能体同时还可以学习到包括Coze、Dify在内的可视化工具的使用。L4级别大模型微调与私有化部署L4阶段大模型的微调和私有化部署我们会更加深入的探讨Transformer架构学习大模型的微调技术利用DeepSpeed、Lamam Factory等工具快速进行模型微调并通过Ollama、vLLM等推理部署框架实现模型的快速部署。整个大模型学习路线L1主要是对大模型的理论基础、生态以及提示词他的一个学习掌握而L3 L4更多的是通过项目实战来掌握大模型的应用开发针对以上大模型的学习路线我们也整理了对应的学习视频教程和配套的学习资料。二、大模型经典PDF书籍书籍和学习文档资料是学习大模型过程中必不可少的我们精选了一系列深入探讨大模型技术的书籍和学习文档它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。书籍含电子版PDF三、大模型视频教程对于很多自学或者没有基础的同学来说书籍这些纯文字类的学习教材会觉得比较晦涩难以理解因此我们提供了丰富的大模型视频教程以动态、形象的方式展示技术概念帮助你更快、更轻松地掌握核心知识。四、大模型项目实战学以致用当你的理论知识积累到一定程度就需要通过项目实战在实际操作中检验和巩固你所学到的知识同时为你找工作和职业发展打下坚实的基础。五、大模型面试题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我们将提供精心整理的大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。因篇幅有限仅展示部分资料需要点击下方链接即可前往获取2025最新版CSDN大礼包《AGI大模型学习资源包》免费分享

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询