[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-public-QsKwbDX7":3,"public-project-articles-QsKwbDX7":17},{"id":4,"uuid":5,"project_id":6,"title":7,"content":8,"type":9,"status":10,"public_enabled":10,"views":11,"sort":12,"created_at":13,"updated_at":14,"project_title":15,"project_slug":16},516,"QsKwbDX7",47,"09. SpringBoot3集成Mybatis","## Mybatis 官网\n\n[https:\u002F\u002Fmybatis.org\u002Fmybatis-3\u002Fzh_CN\u002Findex.html](https:\u002F\u002Fmybatis.org\u002Fmybatis-3\u002Fzh_CN\u002Findex.html)\n\n\u003Cfont style=\"color:rgb(51, 51, 51);\">MyBatis 是一款优秀的持久层框架，它支持自定义 SQL，MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java 对象为数据库中的记录。\u003C\u002Ffont>\n\n\u003Cfont style=\"color:rgb(51, 51, 51);\">Mybatis 依赖\u003C\u002Ffont>\n\n```xml\n\u003Cdependency>\n  \u003CgroupId>org.mybatis.spring.boot\u003C\u002FgroupId>\n  \u003CartifactId>mybatis-spring-boot-starter\u003C\u002FartifactId>\n  \u003Cversion>3.0.3\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\nJava 表示属性一般使用驼峰的形式：departmentId\n\n数据库里面表示字段一般使用下划线的形式：department_id\n\n## Springboot 配置 Mybatis\n\n```yaml\n# 配置mybatis实体和xml映射\nmybatis:\n  ## 映射xml\n  mapper-locations: classpath:mapper\u002F*.xml\n  configuration:\n    # 配置日志\n    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n    map-underscore-to-camel-case: true\n```\n\n基本的 xml 格式\n\n```xml\n\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003C!DOCTYPE mapper\n        PUBLIC \"-\u002F\u002Fmybatis.org\u002F\u002FDTD Mapper 3.0\u002F\u002FEN\"\n        \"http:\u002F\u002Fmybatis.org\u002Fdtd\u002Fmybatis-3-mapper.dtd\">\n\u003Cmapper namespace=\"\">\n  \n\u003C\u002Fmapper>\n```\n\nxml 是跟 mapper 接口一一对应的\n\n**告诉 Springboot 如何扫描 mapper 包**\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2024\u002Fpng\u002F751015\u002F1729148491396-2de69f20-9616-4bff-8313-471e05255a06.png)\n\n创建 Service 并且标注为 Springboot 里面的一个 bean\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2024\u002Fpng\u002F751015\u002F1729148680980-c7d75e71-666a-43ee-b4d0-366aee7d8853.png)\n\n\n\n下载插件 MybatisX\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2024\u002Fpng\u002F751015\u002F1729149306862-dad38834-f7b5-43f7-9785-544e57cb817c.png)\n\n\n\nMapper 和 Mapper.xml 的对应关系\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2024\u002Fpng\u002F751015\u002F1729149535445-02baeafa-fa96-47b9-9aec-8d4f0b689d82.png)\n\n\n\n接口路径表示\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2024\u002Fpng\u002F751015\u002F1729149695131-d555b477-02ff-42b2-ab04-f90a670abbfd.png)\n\n\n\n完整的接口请求路径：\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2024\u002Fpng\u002F751015\u002F1729149854154-a4e48413-2367-430e-a3fd-69d5ce3d8865.png)\n\nhttp:\u002F\u002F{ip}:{port}\u002F{path}\n\n\n\n推荐浏览器安装 jsonView 插件\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2024\u002Fpng\u002F751015\u002F1729149923979-9bad727a-eb82-491d-91e0-210952f5b63e.png)\n\n数据请求流程：\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2024\u002Fpng\u002F751015\u002F1729150126476-955dec2d-a017-427b-b7b7-c4c06d3d108a.png)\n\n## 注解语法\n\n```java\n@Select(\"select * from employee where id = #{id}\")\nEmployee selectById(Integer id);\n```\n\n## 接口传参的方式\n\n### @PathVariable\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2024\u002Fpng\u002F751015\u002F1729150578019-99840e60-44f7-4c7b-b85d-073b01a6209e.png)\n\n### @RequestParam\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2024\u002Fpng\u002F751015\u002F1729150554127-52a7bc4d-6c42-4463-9085-63daf4c5a16a.png)\n\n传递多个参数\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2024\u002Fpng\u002F751015\u002F1729150656239-9383362b-ea13-4a5c-bfd9-e2767a0b7c87.png)\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2024\u002Fpng\u002F751015\u002F1729150661737-5e29eaed-727a-4c29-aa68-61fea3de382e.png)\n\n对象参数\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2024\u002Fpng\u002F751015\u002F1729150973885-948e9763-79c7-4ba2-9f24-500d4bb3fb32.png)\n\n## 分页查询\n\n引入 pagehelper 这个插件\n\n```xml\n\u003C!-- 分页插件pagehelper -->\n\u003Cdependency>\n    \u003CgroupId>com.github.pagehelper\u003C\u002FgroupId>\n    \u003CartifactId>pagehelper-spring-boot-starter\u003C\u002FartifactId>\n    \u003Cversion>1.4.6\u003C\u002Fversion>\n    \u003Cexclusions>\n        \u003Cexclusion>\n            \u003CgroupId>org.mybatis\u003C\u002FgroupId>\n            \u003CartifactId>mybatis\u003C\u002FartifactId>\n        \u003C\u002Fexclusion>\n    \u003C\u002Fexclusions>\n\u003C\u002Fdependency>\n```\n\n\n\n在 Service 里面通过三行代码实现了分页查询\n\n```java\npublic PageInfo\u003CEmployee> selectPage(Integer pageNum, Integer pageSize) {\n    PageHelper.startPage(pageNum, pageSize);\n    List\u003CEmployee> list = employeeMapper.selectAll();\n    return PageInfo.of(list);\n}\n```\n\n分页接口\n\n```java\n\u002F**\n * 分页查询的数据\n * pageNum: 当前页码\n * pageSize: 每页的个数\n *\u002F\n@GetMapping(\"\u002FselectPage\")\npublic Result selectPage(@RequestParam(defaultValue = \"1\") Integer pageNum,\n                         @RequestParam(defaultValue = \"10\") Integer pageSize) {\n    PageInfo\u003CEmployee> pageInfo = employeeService.selectPage(pageNum, pageSize);\n    return Result.success(pageInfo);\n}\n```\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2024\u002Fpng\u002F751015\u002F1729151666013-542ede17-1500-4934-9cf9-dc1d3bcfc782.png)\n\n## 使用 Mybatis 实现数据库的增删改\n\nget: 查询操作\n\npost：新增操作\n\nput：修改操作\n\ndelete：删除操作\n\n\n\n**@RequestBody： 可以把前端传来的 json 字符串映射出 java 的对象、或者数组**\n\n****\n\n**mybatis 里面写 sql 使用下划线，涉及到绑定 java 对象值，就写驼峰**\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2024\u002Fpng\u002F751015\u002F1729152184719-50ac0dac-adb4-4700-af2e-c195451da0ec.png)\n\n### 新增\n\n```plsql\n\u003Cinsert id=\"insert\" parameterType=\"com.example.entity.Employee\">\n    insert into `employee` (name, sex, no, age, description, department_id)\n    values (#{name}, #{sex}, #{no},  #{age}, #{description}, #{departmentId})\n\u003C\u002Finsert>\n```\n\n### 更新\n\n```sql\n\u002F**\n * 更新数据\n *\u002F\n@PutMapping(\"\u002Fupdate\")\npublic Result update(@RequestBody Employee employee) {\n    employeeService.update(employee);\n    return Result.success();\n}\n```\n\n更新的 sql\n\n```sql\n\u003Cupdate id=\"updateById\" parameterType=\"com.example.entity.Employee\">\n    update `employee` set name = #{name}, sex = #{sex}, no = #{no}, age = #{age},\n    description = #{description}, department_id = #{departmentId}\n    where id = #{id}\n\u003C\u002Fupdate>\n```\n\n### 删除\n\n```java\n\u002F**\n * 删除单个数据\n *\u002F\n@DeleteMapping(\"\u002FdeleteById\u002F{id}\")\npublic Result deleteById(@PathVariable Integer id) {\n    employeeService.deleteById(id);\n    return Result.success();\n}\n```\n\n删除 sql\n\n```java\n@Delete(\"delete from `employee` where id = #{id}\")\nvoid deleteById(Integer id);\n```\n\n## 使用 Postman 测试接口\n\n下载 postman：[https:\u002F\u002Fwww.postman.com\u002F](https:\u002F\u002Fwww.postman.com\u002F)\n\n发送 post 请求\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2024\u002Fpng\u002F751015\u002F1729152693299-1c0a0669-9da5-414b-a3b4-9cb5386db26f.png)\n\n\n\n发送 put 请求\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2024\u002Fpng\u002F751015\u002F1729153331246-35fe310a-575c-4e98-977c-6ab77f5517ff.png)\n\n发送 delete 请求\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2024\u002Fpng\u002F751015\u002F1729153703856-6ed64280-3e75-4ecc-a605-282a5e5992f6.png)\n\n## 学会使用断点来帮你排查问题\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2024\u002Fpng\u002F751015\u002F1729152811103-9095219e-974a-4ecf-88e7-290e4e5fbd16.png)\n\nno 重复了\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2024\u002Fpng\u002F751015\u002F1729152858720-caa5b001-5198-4a7c-83ce-d40256bc5bbb.png)\n\n405 错误\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2024\u002Fpng\u002F751015\u002F1729153668856-626b77de-1b58-42b5-821f-0a7d9adee3fb.png)\n\n","coding",1,10348,1004,"2024-10-17 16:36:15","2026-05-03 22:49:02","1天学会SpringBoot3+Vue3实战项目开发","learn-springboot-vue",{"project":18,"items":19},{"id":6,"title":15,"slug":16},[20,27,34,42,49,56,63,70,77,78,85,92,99,106,113,120],{"id":21,"uuid":22,"project_id":6,"title":23,"type":9,"status":10,"public_enabled":10,"views":24,"sort":25,"created_at":26,"updated_at":14,"project_title":15,"project_slug":16},475,"OgrBbww7","01. 1天学会SpringBoot3+Vue3实战项目课程介绍",17862,910,"2024-10-11 16:50:50",{"id":28,"uuid":29,"project_id":6,"title":30,"type":9,"status":10,"public_enabled":10,"views":31,"sort":32,"created_at":33,"updated_at":14,"project_title":15,"project_slug":16},476,"U58ISSFR","02. 从0带你搭建Vue3工程",12899,911,"2024-10-11 16:47:49",{"id":35,"uuid":36,"project_id":6,"title":37,"type":9,"status":10,"public_enabled":10,"views":38,"sort":39,"created_at":40,"updated_at":41,"project_title":15,"project_slug":16},478,"tK3YUYq8","03. Vue3集成Element-Plus",9899,919,"2024-10-14 22:18:17","2026-05-07 15:33:28.189425+00",{"id":43,"uuid":44,"project_id":6,"title":45,"type":9,"status":10,"public_enabled":10,"views":46,"sort":47,"created_at":48,"updated_at":14,"project_title":15,"project_slug":16},488,"J2MV6UAG","04. Element-Plus组件使用速成",8093,938,"2024-10-11 16:49:40",{"id":50,"uuid":51,"project_id":6,"title":52,"type":9,"status":10,"public_enabled":10,"views":53,"sort":54,"created_at":55,"updated_at":14,"project_title":15,"project_slug":16},489,"zGi4XJsb","05. Vue3集成Vue-Router实现路由跳转",7443,939,"2024-10-12 15:44:41",{"id":57,"uuid":58,"project_id":6,"title":59,"type":9,"status":10,"public_enabled":10,"views":60,"sort":61,"created_at":62,"updated_at":14,"project_title":15,"project_slug":16},499,"cwsTdvo9","06. Vue3搭建后台管理系统",7421,964,"2024-10-14 16:02:49",{"id":64,"uuid":65,"project_id":6,"title":66,"type":9,"status":10,"public_enabled":10,"views":67,"sort":68,"created_at":69,"updated_at":14,"project_title":15,"project_slug":16},501,"JlXltpKA","07. Mysql语法简介（速成）",5208,973,"2024-10-15 16:52:18",{"id":71,"uuid":72,"project_id":6,"title":73,"type":9,"status":10,"public_enabled":10,"views":74,"sort":75,"created_at":76,"updated_at":14,"project_title":15,"project_slug":16},509,"c3XrOTcU","08. 从0带你搭建SpringBoot3工程",9397,992,"2024-10-16 15:43:13",{"id":4,"uuid":5,"project_id":6,"title":7,"type":9,"status":10,"public_enabled":10,"views":11,"sort":12,"created_at":13,"updated_at":14,"project_title":15,"project_slug":16},{"id":79,"uuid":80,"project_id":6,"title":81,"type":9,"status":10,"public_enabled":10,"views":82,"sort":83,"created_at":84,"updated_at":14,"project_title":15,"project_slug":16},519,"qKG13ySo","10. SpringBoot3+Vue3实现基本的增删改查功能",9572,1013,"2024-10-18 16:34:55",{"id":86,"uuid":87,"project_id":6,"title":88,"type":9,"status":10,"public_enabled":10,"views":89,"sort":90,"created_at":91,"updated_at":14,"project_title":15,"project_slug":16},527,"7uED9n7e","11. Vue3开发登录注册页面",7106,1031,"2024-10-21 17:35:30",{"id":93,"uuid":94,"project_id":6,"title":95,"type":9,"status":10,"public_enabled":10,"views":96,"sort":97,"created_at":98,"updated_at":14,"project_title":15,"project_slug":16},535,"poUfWrWc","12. Vue3管理系统开发个人信息、修改密码页面",5777,1050,"2024-10-22 17:50:30",{"id":100,"uuid":101,"project_id":6,"title":102,"type":9,"status":10,"public_enabled":10,"views":103,"sort":104,"created_at":105,"updated_at":14,"project_title":15,"project_slug":16},542,"FxHR3hNR","13. SpringBoot3+Vue3实现文件上传下载功能",4489,1057,"2024-10-23 17:31:02",{"id":107,"uuid":108,"project_id":6,"title":109,"type":9,"status":10,"public_enabled":10,"views":110,"sort":111,"created_at":112,"updated_at":14,"project_title":15,"project_slug":16},548,"VPZNSTxr","14. SpringBoot3+Vue3实现富文本编辑器功能",3931,1072,"2024-10-24 17:38:21",{"id":114,"uuid":115,"project_id":6,"title":116,"type":9,"status":10,"public_enabled":10,"views":117,"sort":118,"created_at":119,"updated_at":14,"project_title":15,"project_slug":16},555,"nal0yVxM","15. SpringBoot3+Vue3实现数据批量导入导出功能",3577,1090,"2024-10-28 17:39:21",{"id":121,"uuid":122,"project_id":6,"title":123,"type":9,"status":10,"public_enabled":10,"views":124,"sort":125,"created_at":126,"updated_at":14,"project_title":15,"project_slug":16},564,"XxSPPFGi","16. SpringBoot3+Vue3实现数据统计图表功能",4236,1109,"2025-01-09 09:40:57"]