从啥也不会开始学java和相关的框架,又是一个胎教系列哈哈哈
原链接:
https://segmentfault.com/a/1190000023120991
我只在原作者基础上做了很小很小的修改,原文已经写得很好了,有点基础的建议去看原教程~!
胎教开始
-
新建项目->选择spring initializr项目
-
贴pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>改成自己的包名 我用的com.nana</groupId>
<artifactId>改成自己的项目名 我用的cloud2021</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cloud2021</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!--
<scope>runtime</scope>
-->
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
-
把resource下的application改成yml格式->yml文件中包含:server port/spring/mybatis具体如下
// 遇到的坑:如果建立的是maven项目 小绿叶有可能不出现 一般的解决办法:https://www.pianshen.com/article/12311050998/
// 要注意: application.yml要在resources文件夹下
// 用Spring Initailzr永久解决此问题
// 严格对齐 讲究缩进
// 以下配置数据库:username&password:数据库的用户名密码
// url:一般是复制的链接的数据库地址 其中jdbc:使用jdbc驱动方式连接数据库;mysql:链接的数据类型是mysql;localhost:数据库具体地址;3306:数据库端口号;testpay数据库名;characterEncoding:编码格式;serveTimezone设置时区;useSSL = true并提供信任库以进行服务器证书验证
// driver-class-name: 一般是这个不会改
// mybatis映射
// logging记录
server:
port: 8080 //也可以改 测试的时候写相应的端口号就行
spring:
datasource:
username: //换成自己的数据库
password: //换成自己的数据库
url: jdbc:mysql://localhost:3306/换成自己的数据名?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:mapping/*Mapper.xml
type-aliases-package: com.nana.cloud2021.entity.User //改成自己的包名
logging:
level:
com:
example:
mapper : debug
/
-
创建表:这个也很简单 在mybatis里创建好链接然后右键“运行sql文件”
// 删除已存在的表格 DROP TABLE IF EXISTS `表格名`
// USING BTREE:搜索用b树
// AUTO_INVCREMENT = 1 设定新表从1开始自增
// 编码是utf8
// ROW_FORMAT行记录结构类型
DROP TABLE IF EXISTS `表格名`;
CREATE TABLE `表格名` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
/
-
写主启动类:为了让程序引用得出mysql表
//为了让程序和mysql联系起来
// @MapperScan("com.nana.cloud2021.mapper") 扫描的mapper
package 包名;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan("包名.mapper") //扫描的mapper
@SpringBootApplication
public class Cloud2021Application {
public static void main(String[] args) {
SpringApplication.run(程序名Application.class, args);
}
}
/
- 写ENTITY层或POJO层
// 第一步:定义User类
// 第二步:写一写这个类可以进行的一些操作
// 这里面id username password address都是和数据库表相对应的
// 下面一些函数的操作在本次项目中其实没用到
package 包名.entity;
public class User {
private Integer id;
private String username;
private String password;
private String address;
public User(Integer id, String username, String password, String address) {
this.id = id;
this.username = username;
this.password = password;
this.address = address;
}
public Integer getId()
{
return id;
}
public String getUsername()
{
return username;
}
public String getPassword()
{
return password;
}
public String getAddress()
{
return address;
}
public void setId(Integer id)
{
this.id = id;
}
public void setUsername(String username)
{
this.username = username;
}
public void setPassword(String password)
{
this.password = password;
}
public void setAddress(String address)
{
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", address='" + address + '\'' +
'}';
}
}
/
- 写DAO层或MAPPER层
// *要用到:entity层
// 本质是数据库与程序的接口
package com.nana.cloud2021.entity;
public class User {
private Integer id;
private String username;
private String password;
private String address;
public User(Integer id, String username, String password, String address) {
this.id = id;
this.username = username;
this.password = password;
this.address = address;
}
public Integer getId()
{
return id;
}
public String getUsername()
{
return username;
}
public String getPassword()
{
return password;
}
public String getAddress()
{
return address;
}
public void setId(Integer id)
{
this.id = id;
}
public void setUsername(String username)
{
this.username = username;
}
public void setPassword(String password)
{
this.password = password;
}
public void setAddress(String address)
{
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", address='" + address + '\'' +
'}';
}
}
/
- 配置MAPPER
/
// xml格式->前面写了<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 这些,所以后面用到的这些都是与mybatis相应的格式,resultMap:结果格式;select对应mysql语句中的SELECT;相互对应
// 踩过的坑:程序找不到对应的mysql表
// 解决方法:重新建程序 把名字改得统一一点 问题主要是程序名称类型不匹配,但是实在查不出哪里不匹配
// trim标签的功能简单来说就是自定义格式拼凑SQL语句
// prefix:表示在trim包裹的SQL前添加指定内容
// suffix:表示在trim包裹的SQL末尾添加指定内容
// prefixOverrides:表示去掉(覆盖)trim包裹的SQL的指定首部内容
// suffixOverrides:表示去掉(覆盖)trim包裹的SQL的指定尾部内容
<?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="包名.mapper.UserMapper">
<resultMap id="BaseResultMap" type="包名.entity.User">
<result column="id" jdbcType="INTEGER" property="id"/>
<result column="userName" jdbcType="VARCHAR" property="username"/>
<result column="passWord" jdbcType="VARCHAR" property="password"/>
<result column="realName" jdbcType="VARCHAR" property="address"/>
</resultMap>
<select id="Sel" resultType="包名.entity.User">
select * from user where 1=1
<if test="user.id != null">
AND id = #{user.id}
</if>
</select>
<insert id="Add" parameterType="包名.entity.User">
INSERT INTO user
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="user.username != null">
username,
</if>
<if test="user.password != null">
password,
</if>
<if test="user.address != null">
address,
</if>
</trim>
<trim prefix="VALUES (" suffix=")" suffixOverrides=",">
<if test="user.username != null">
#{user.username,jdbcType=VARCHAR},
</if>
<if test="user.password != null">
#{user.password,jdbcType=VARCHAR},
</if>
<if test="user.address != null">
#{user.address,jdbcType=VARCHAR},
</if>
</trim>
</insert>
<update id="Update" parameterType="包名.entity.User">
UPDATE user
<set>
<if test="user.username != null">
username = #{user.username},
</if>
<if test="user.password != null">
password = #{user.password},
</if>
<if test="user.address != null">
address = #{user.address},
</if>
</set>
WHERE
id=#{user.id}
</update>
<delete id="Delete" parameterType="包名.entity.User">
DELETE FROM user WHERE id = #{user.id}
</delete>
</mapper>
/
- 写SERVICE与SERVICEIMPL
// 一般来说SERVICE是一个接口而具体的功能实现在SERVICEIMPL中
// 即SERVICE叫接口层 SERVICEIMPL叫实现类
// SERVICE层中:是个接口所以是interface
// *要用到entity层
package 包名.service;
import 包名.entity.User;
public interface UserService {
User Sel(User user);
String Add(User user);
String Update(User user);
String Delete(User user);
}
// IMPL层中:是具体的实现类 所以是CLASS 然后implements
// 本质还是对接口函数进行实现,在这里可以给项目添加许多具体功能
// *用到了service entity mapper
package 包名.service.serviceImpl;
import 包名.entity.User;
import 包名.mapper.UserMapper;
import 包名.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService
{
@Autowired
UserMapper userMapper;
public User Sel(User user)
{
return userMapper.Sel(user);
}
public String Add(User user)
{
/* System.out.println(user.getUsername());
user.setUsername("lj"+"====");*/
int a = userMapper.Add(user);
if (a == 1) {
return "添加成功";
} else {
return "添加失败";
}
}
public String Update(User user)
{
int a = userMapper.Update(user);
if (a == 1) {
return "修改成功";
} else {
return "修改失败";
}
}
public String Delete(User user)
{
int a = userMapper.Delete(user);
if (a == 1) {
return "删除成功";
} else {
return "删除失败";
}
}
}
/
- 写CONTROLLER
// 处理前台发送的语句
// 用到的包entity service
// @RestControler = @ResponseBody+@Controller
// 其中Controller处理http请求
//
// @RequestMapping仅作用在处理器方法上
// @RequestMapping仅作用在类级别上
// @RequestMapping作用在类级别和处理器方法上
package 包名.controller;
import 包名.entity.User;
import 包名.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/test")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/selectUserByid", produces = "application/json;charset=UTF-8", method = RequestMethod.GET)
@ResponseBody
public String GetUser(User user){
return userService.Sel(user).toString();
}
@RequestMapping(value = "/add", produces = "application/json;charset=UTF-8", method = RequestMethod.GET)
public String Add(User user){
return userService.Add(user);
}
@RequestMapping(value = "/update", produces = "application/json;charset=UTF-8", method = RequestMethod.GET)
public String Update(User user){
return userService.Update(user);
}
@RequestMapping(value = "/delete", produces = "application/json;charset=UTF-8", method = RequestMethod.GET)
public String Delete(User user){
return userService.Delete(user);
}
}
到这里整个程序的代码就都贴上去了,先看看有没有贴错或者手滑打错,有红色bug的话可以百度改一改,然后打开网页开始测试
增:localhost:8080/test/add?username=username&password=1111&address=1111
删:localhost:8080/test/delete?id=1
改:localhost:8080/test/update?id=1&username=newname&password=1111&address=1111
查:localhost:8080/test/selectUserByid?id=1
没有问题的话还是可以得到相应反馈的。
总结一下网页端的处理过程:
这张图是从网页用户角度做的,很清晰
图源这里: https://blog.youkuaiyun.com/congweijing/article/details/82499627
总结:Controller层调用Service层的具体功能方法,Service层调用Mapper层的方法,其中调用的参数是使用Entity层进行传递的
所以从建立工程的角度上,过程是反过来的
布置完pom,小改启动类之后,先entity再mapper再service最后controller
下面这个链接讲了一下这些层之间的联系和作用,很适合胎教学习
https://zhuanlan.zhihu.com/p/109164753
以上。
欢迎大家指教讨论!