赞
踩
前言:这里是我对于前后端spring boot + vue3的学习过程收纳整理以及知识分享。
目录
打开IDEA,新建一个项目:
选择spring initalizr,设置项目存储位置,JDK选17,项目名称可以自行更改,类型选择Maven:
版本按照默认,添加依赖项web->spring web:
在sql中添加依赖项MySQL Driver和MyBatis Framework:
点击create进行创建,创建后点开项目,等待各种依赖项、文件自动下载完毕
目录结构为:
打开MySQL或者Navicat,创建新的数据库及表,并向表内增添用于测试的数据。
示例:
创建数据库schema为db,并创建user表:
其中user表包含属性:用户ID(id),用户名(username),年龄(age),职业(job),爱好(hobby)
- -- 建数据库
- create schema db;
- use db;
-
- -- 建表
- create table user(
- id int primary key,
- username varchar(20),
- age int,
- job varchar(100),
- hobby varchar(100));
-
- -- 插入数据
- insert into user
- values(1,'张三',30,'前端开发工程师','睡觉');
- insert into user
- values(2,'李四',25,'产品助理','打篮球');
- insert into user
- values(3,'王五',40,'后端开发工程师','旅行');
-
- -- 查看数据
- select * from user;
插入数据成功后:
在application.properties文件中,配置数据库,其中url中的db为数据库名称:
- server.port=8080
- spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
- spring.datasource.url=jdbc:mysql://localhost:3306/db?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=false
- spring.datasource.username=root
- spring.datasource.password=123456
对于端口号,一般写成8080,如果端口号已经被其他进程占用,可以改成8081等等,数据库名称,其他配置,用户名和密码,以及要连接的数据库名称,需要根据自己的情况更改:
此时,点击绿色小三角运行,在浏览器输入http://localhost:8080(设置的端口号),出现如下页面:
在test中:
更改Java类的内容
DemoApplicationTests:
- @SpringBootTest
- class DemoApplicationTests {
-
- @Autowired
- DataSource dataSource;
-
- @Test
- void contextLoads() throws Exception{
- System.out.println("获取的数据库链接为:"+dataSource.getConnection());
- }
-
- }
右击运行DemoApplicationTests.java:
出现红框内容即连接成功:
要实现在网页中展示表中数据
在java中创建如下五个包:
其中,controller用于编写方法类,entity用于储存实体类,service中存放接口,mapper中用于衔接数据库,result用于统一规范输出结果形式
在每个package包中分别创建如下Java类:
(mapper下的UserMapper前方黑色小鸟图标是因为我在file->settings->plugins中添加了MyBatisX插件,便于将xxMapper.xml文件下的sql语句与xxMapper.java中的方法对应起来,可以不添加)如果要添加的话是下面这里:
在resources中创建如下结构,.xml文件中用于书写mysql语句:
最终目录结构:
每个文件代码:
User.java:
- package com.example.demo.entity;
-
- public class User {
- private int id;
- private String username;
- private int age;
- private String job;
- private String hobby;
-
- public void setId(int id) {
- this.id = id;
- }
-
- public int getId() {
- return id;
- }
-
- public void setUsername(String username) {
- this.username = username;
- }
- public String getUsername() {
- return username;
- }
-
- public void setAge(int age) {
- this.age = age;
- }
-
- public int getAge() {
- return age;
- }
-
- public void setJob(String job) {
- this.job = job;
- }
-
- public String getJob() {
- return job;
- }
-
- public void setHobby(String hobby) {
- this.hobby = hobby;
- }
-
- public String getHobby() {
- return hobby;
- }
- }
-
UserController.java:
- package com.example.demo.controller;
-
- import com.example.demo.result.Result;
- import com.example.demo.service.UserService;
- import jakarta.annotation.Resource;
- import org.springframework.web.bind.annotation.*;
-
- import java.util.List;
-
- @RestController
- @RequestMapping("/user")
- public class UserController {
- @Resource
- UserService userService;
-
- @CrossOrigin
- @GetMapping(value = "/findAll")
- @ResponseBody
- public Result findAllUser(){
- try {
- return Result.success(userService.findAllUser());
- }catch (Exception e){
- return Result.failure(500,"服务器异常");
- }
-
- }
-
- }
UserMapper.java:
- package com.example.demo.mapper;
-
- import com.example.demo.entity.User;
- import org.apache.ibatis.annotations.Mapper;
- import org.springframework.stereotype.Repository;
-
- import java.util.List;
-
- @Mapper
- public interface UserMapper {
- public List<User> findAllUser();//查找所有用户
- }
UserService.java:
- package com.example.demo.service;
-
- import com.example.demo.entity.User;
- import org.springframework.stereotype.Service;
-
- import java.util.List;
-
- public interface UserService {
- public List<User> findAllUser();
- }
UserServiceImpl.java:
- package com.example.demo.service;
-
- import com.example.demo.entity.User;
- import com.example.demo.mapper.UserMapper;
- import jakarta.annotation.Resource;
- import org.springframework.stereotype.Service;
-
- import java.util.List;
-
- @Service
- public class UserServiceImpl implements UserService {
- @Resource
- private UserMapper userMapper;
- @Override
- public List<User> findAllUser(){
- return userMapper.findAllUser();
- }
-
- }
Result.java:
- package com.example.demo.result;
-
- public class Result {
- private int code; //接口状态码
- private String msg; //接口返回消息2、User.java
- private Object data; //响应内容
-
- public Result(){
- super();
- }
- public Result(int code,String msg,Object data){
- this.code=code;
- this.msg=msg;
- this.data=data;
- }
- public static Result success(Object data){
- Result item=new Result(200,"success",data);
- return item;
- }
- public static Result failure(int errCode,String errorMessage){
- Result item=new Result(errCode,errorMessage,null);
- return item;
- }
- public int getCode(){
- return code;
- }
- public void setCode(int code){
- this.code=code;
- }
-
- public String getMsg() {
- return msg;
- }
-
- public void setMsg(String msg) {
- this.msg = msg;
- }
-
- public Object getData() {
- return data;
- }
-
- public void setData(Object data) {
- this.data = data;
- }
- }
UserMapper.xml:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
-
- <mapper namespace="com.example.demo.mapper.UserMapper" >
- <resultMap id="result" type="com.example.demo.entity.User">
- <result property="id" column="id" />
- <result property="username" column="username" />
- <result property="age" column="age" />
- <result property="job" column="job" />
- <result property="hobby" column="hobby"/>
- </resultMap>
-
- <!-- 查找所有用户-->
- <select id="findAllUser" resultMap="result">
- select * from user
- </select>
-
- </mapper>
还需要在application.properties中设置文件路径:
- #mybatis配置
- mybatis.typeAliasesPackage=org.spring.springboot.domain
- mybatis.mapper-locations=classpath:mapper/*.xml
- mybatis.type-aliases-package= com.example.demo.entity
先在右上角的configuration中选择Demo1Application(前面有绿色图标的),然后点击绿色小三角运行程序:
控制台:
此时在浏览器中输入http://localhost:8080/user/findALL
以下内容按我的理解来解释整个过程,比较口语化,也可能不太专业,如有不当敬请指出
刚才已经粗略解释过一部分:controller用于编写方法类,entity用于储存实体类,service中存放接口,mapper中用于衔接数据库,result用于统一规范输出结果形式
要知道它的执行过程需要一步一步来,一层一层看,先看的是controller里面的注解:
1)controller中,对整个UserController类使用了RequestMapping注解,findAllUser()函数之上对应的注解GetMapping:/findALL,所以,findAllUser注解可以视为/user/findAll
浏览器输入链接http://localhost:8080/user/findALL时,启用8080端口,/user/findALL的请求会由findAllUser()来处理
该函数内部有一条语句:userService.findAllUser(),调用了service包下UserService.java里面的findAllUser()函数
2)再来看service文件,这里定义了UserService接口,接口中没有定义具体的实现方法体:
里面正是findAllUser()函数被调用,这个函数返回值为list形式的user对象集合,无需输入
3)接下来就是到了UserServiceImpl了,UserServiceImpl为UserService的接口实现类,定义了findAllUser()的具体方法体:
到这里算是java方法和mysql语句衔接的一个重要转折点啦,在UserServiceImpl中,调用了UserMapper.java中的findAllUser()方法
4)具体UserMapper.java:
也拥有findAllUser(),这里的函数名字不是随便起的,一切的根源都在resources->mapper->UserMapper.xml中:
4)这里mysql语句中,设置的id为:findAllUser
UserMapper.java中的对应方法名和UserMapper.xml中mysql语句id的命名要完全一致(包括大小写)
比如:
.xml文件替换为(id更换为getListUser):
<select id="getListUser" resultMap="result"> select * from user </select>
那么UserMapper.java中对应方法就换为(方法名更换为getListUser):
public List<User> getListUser();//查找所有用户
而其他包中java类为了协调一致不搞混,也同样用getListUser命名对应函数
那么UserMapper.java中的函数又是怎么找到UserMapper.xml文件中对应的id呢?这就是路径配置问题了
在resources->mapper->UserMapper.xml中,
namespace="com.example.demo.mapper.UserMapper"
这一句指明了.xml文件对应的.java文件路径,是在src->main->java->com.example.demo.mapper->UserMapper.java
再加上application.properties中针对mybatis路径配置:
mybatis.mapper-locations=classpath:mapper/*.xml
指明访问.xml文件的路径为resources->mapper->*.xml
如果没有这些设置的话,是找不到数据库表信息的。
简单来说整体流程大致为:
方法请求->controller注解->service接口->service实现接口(具体方法实现)->mapper包中的**Mapper.java->根据路径配置找到resources中的**Mapper.xml->实现具体sql语句,获得返回值->将返回值再倒着传递出去
可以视为:
controller、service包中的内容都是与java后端方法调用有关的,
而mapper包中,不管是src->main->java->mapper下的.java文件,还是resources->***下的.xml文件,都是与数据库调用有关的
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。