Springboot 入门
开始记录一点springboot的学习记录,不定期记录。供自己以后看,今晚先起个头就咕咕咕,明天还要训练。
遇到的问题
Annotations are not allowed here
原因是注解后面加了分号,很尴尬
MYSQL 依赖
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
阿里云镜像
//添加到settings文件mirrors里
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
Update
跟着做完了简单项目(可能算不上),不紧不慢,最后成功登录。下面是我对Springboot代码的一些理解
我觉得数据库是springboot的前置知识,大一下那会就想学,可怎么也看不懂,真的烦操,可能是我太笨。学完数据库好多了,言归正传,我们下边来讲一下入门知识。
如图建立springboot项目,至于怎么快速建立项目,自行百度。
这边说一下各个层的作用:
- DAO层:包括XxxMapper.java(数据库访问接口类),XxxMapper.xml(数据库链接实现);
- Bean层:也叫model层,模型层,entity层,实体层,就是数据库表的映射实体类,存放POJO对象,和JDBC似;
- Service层:也叫服务层,业务层,包括XxxService.java(业务接口类),XxxServiceImpl.java(业务实现类);(可以在service文件夹下新建impl文件放业务实现类,也可以把业务实现类单独放一个文件夹下,更清晰)
- Web层:就是Controller层,实现与web前端的交互。
不要着急,刚入门我自己看了很久,跟着代码示例做下去就慢慢看懂了,之后我会一个一个讲解自己
我们先介绍几个springboot的文件:
pom.xml
配置文件,用于导入依赖,springboot会自动下载对应的jar包,原理很复杂,有巨巨知道的可以教教我。我们只需根据需求在.xml文件的
< dependencies> < /dependencies>中添加依赖,右击.xml文件选择Maven,先Download,再Reload project,就可以成功导入依赖了。
springboot启动类
package com.example.demo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
//@SpringBootApplication注解告诉程序这是一个springboot启动类
@MapperScan("com.example.demo.mapper")
//指定要变成实现类的接口所在的包,然后包下面的所有接口在编译之后都会生成相应的实现类
//用于之后扫描,查找mapper映射,个人理解是一个框架
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
yml文件
spring:
datasource:
name: booklib #数据库名
url: jdbc:mysql://localhost:3306/booklib?useUnicode=true&useSSL=false&serverTimezone = GMT #url
username: root #用户名
password: root #密码
driver-class-name: com.mysql.cj.jdbc.Driver #数据库链接驱动
mybatis:
mapper-locations: classpath:mapper/*.xml #配置映射文件
type-aliases-package: com.example.demo.bean #配置实体类
用于连接数据库,相当于JDBC的Util,之后mybatis相当于mysql语句,之后会讲解
package cn.edu.zucc.booklib.util;
import java.sql.Connection;
public class DBUtil {
private static final String jdbcUrl="jdbc:mysql://localhost:3306/booklib?useUnicode=true&useSSL=false&serverTimezone = GMT";
// private static final String jdbcUrl="jdbc:mysql://localhost:3306/booklib?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone = GMT";
private static final String dbUser="root";
private static final String dbPwd="root";
static{
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getConnection() throws java.sql.SQLException{
return java.sql.DriverManager.getConnection(jdbcUrl, dbUser, dbPwd);
}
}
同时需要在.xml文件导入数据库和mybatis依赖
<!--数据库connect-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
model层
就是JDBC里的bean,简单贴下
package com.example.demo.bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import java.util.Date;
@Configuration
public class UserBean {
private String userid;
private String username;
private String pwd;
private String usertype;
private Date createDate;
private Date removeDate;
public String getUserid() {return userid;}
public void setUserid(String userid) {this.userid = userid;}
public String getUsername() {return username;}
public void setUsername(String username) {this.username = username;}
public String getPwd() {return pwd;}
public void setPwd(String pwd) {this.pwd = pwd;}
public String getUsertype() {return usertype;}
public void setUsertype(String usertype) {this.usertype = usertype;}
public Date getCreateDate() {return createDate;}
public void setCreateDate(Date createDate) {this.createDate = createDate;}
public Date getRemoveDate() {return removeDate;}
public void setRemoveDate(Date removeDate) {this.removeDate = removeDate;}
}
这边说下IDEA set和get的快捷键,光标选住变量名,Alt+Enter,或者Alter+Insert
(笔记本键盘可能找不到Insert)
@Date注解功能与用法
1、@Data可以为类提供读写功能,从而不用写get、set方法。
2、他还会为类提供 equals()、hashCode()、toString() 方法。
所有就不需要我们写set、get方法了,我们只需在实体类上+@Date注解就可以了
此时我们需要导入依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
//版本号可能不同,我自己使用1.18.8,用1.16.10会报错
</dependency>
Mapper接口
也就是DAO层,实现访问数据库的接口文件,逻辑之后会整体讲解
关于@Mapper注解,可以看这篇博客
package com.example.demo.mapper;
import com.example.demo.bean.UserBean;
import org.apache.ibatis.annotations.Mapper;
@Mapper //在接口类上添加了@Mapper,在编译之后会生成相应的接口实现类
public interface UserMapper {
UserBean getInfo(String name,String password);
}
看到这边会很疑惑,这是啥?不要着急,这就是用来访问数据库的,我们继续看
Usermapper文件
在resources目录下新建一个mapper包,创建UserMapper.xml文件
关于namespace的解释,可以看这篇博客
<?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">
<select id="getInfo" parameterType="String" resultType="com.example.demo.bean.UserBean">
SELECT * FROM beansystemuser WHERE username = #{name} AND pwd = #{password}
</select>
</mapper>
里面写mybatis语句,其中
</mapper namespace=“com.example.demo.mapper.UserMapper” />
用于绑定Dao接口的,即面向接口编程。当你的namespace绑定接口后,你可以不用写接口实现类,mybatis会通过该绑定自动帮你找到对应要执行的SQL语句
所以,UserMapper接口中的getInfo方法就可以调用了
关于mybatis学习,可以看这篇博客,写的是真的好
<select id="getInfo" parameterType="String" resultType="com.example.demo.bean.UserBean">
SELECT * FROM beansystemuser WHERE username = #{name} AND pwd = #{password}
</select>
这部分的意思是,这个sql语句的ID叫做getInfo,与Uermapper接口的方法名对应,parameterType表示传入参数类型为Sring,resultType属性表示返回的类型为UserBean,mybatis会自动将查询出的结果装配成UserBean类,
太牛了,
注意:
如果查询到一个结果就返回一个UserBean类,如果是多个结果,返回一个List
默认情况下,使用 #{} 格式的语法会导致 MyBatis 创建 PreparedStatement 参数并安全地设置参数(就像使用JDBC的 ? 一样)
Usermapper接口中的getInfo方法会将两个参数传入,完成查询
这边有个小疑问,如果有很多个查询,是要创建很多个Mapper接口,还是在UserMapper接口中写很多个方法,然后通过select标签的ID来实现。由于刚入门,经验太少,有知道的巨巨,可以教教
service层
包括XxxService.java(业务接口类),XxxServiceImpl.java(业务实现类)
我们先看Userservice接口
package com.example.demo.service;
import com.example.demo.bean.UserBean;
public interface UserService {
UserBean loginIn(String name, String password);
}
service实现类
package com.example.demo.servicelmpl;
import com.example.demo.bean.UserBean;
import com.example.demo.mapper.UserMapper;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServicelmpl implements UserService {
// @Autowired
private UserMapper userMapper;
@Override
public UserBean loginIn(String name,String password){
return userMapper.getInfo(name,password);
}
}
代码中有 private UserMapper userMapper;,很疑惑接口也能实例化?
原因是,@mapper注解,会自动生成接口的实现类。
Control层
重点
主要用于前后端的交互
package com.example.demo.controller;
import com.example.demo.bean.UserBean;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class LoginController {
@Autowired
UserService userService;
@RequestMapping("/login")
public String show(){
return "login";
}
@RequestMapping(value = "/loginIn",method = RequestMethod.POST)
public String login(String name,String password){
UserBean userBean = userService.loginIn(name,password);
if(userBean!=null){
return "success";
}else {
return "error";
}
}
}
开头@Controller 注解,可以看这边博客
简单来说,springboot会将特定包内的所有类都扫描一遍,并标记带@Controller、@Service、@repository、@Component等注解的类注入到IOC容器中,作为Spring的Bean来管理。
被@Controller标记的类实际上就是个SpringMVC Controller对象,它是一个控制器类,而@Contoller注解在org.springframework.stereotype包下。其中被@RequestMapping 标记的方法会被分发处理器扫描识别,将不同的请求分发到对应的接口上。
@RestController 和 @Conrtoller的区别
@RestController = @Conrtoller + @ResponseBody
使用了@RestController 不会返回html页面,而是直接返回字符串
至此,一个登录程序就完成了,简单总结一下整体的逻辑思路。
整体逻辑
当我们运行springboot启动类,(先睡觉了…明天牛客多校)