简介:使用springboot-jpa能够简化在idea中向数据库拿取数据的操作,白话:(不用再idea中写sql语句了)
目录
一,引用JPA到项目中
1,新建一个springboot项目后打开pom.xml文件,将下面这个引用到<dependencies>中
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
2,顺便引用mysql连接
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
二,编写application配置文件
整体就写这些,如果前后端分离的话端口可以自行更改。例如我前端向8443端口get数据,这个时候就改为server.port=8443
spring.application.name=ymz1login
# 应用服务 WEB 访问端口
server.port=8080
#数据库连接
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/white_jotter?characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=123
#数据库连接的生命周期
spring.datasource.hikari.max-lifetime=120000
三,创建实体类
1,首先创建一个实体类,我的叫User表下方贴代码了,可以参考
package com.example.ymz1login.pojo;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import javax.persistence.*;
//表明这个是一个实体类
@Entity
//映射数据库表名
@Table(name = "user")
//JsonIgnoreProperties是类注解,作用是json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。就会忽略类中不存在的字段。
@JsonIgnoreProperties({"handler", "hibernateLazyInitializer"})
public class User {
@Id
//@GeneratedValue注解存在的意义主要就是为一个实体生成一个唯一标识的主键、@GeneratedValue提供了主键的生成策略。
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
int id;
String name;
String password;
int age;
//需要写一个无参的构造方法,不写好像也没关系。。。
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
", age=" + age +
'}';
}
@Id
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
四,创建返回给前端的code码类
1,一般前后分离项目肯定是需要这么规定的,这样简明方便。为了省事我就只写一个code码不写返回数据了。
2,创建一个Result响应码类。
package com.example.ymz1login.result;
public class Result {
//定义响应码
private int code;
public Result(int code) {
this.code = code;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
}
五,创建UserDao接口类,继承JPA
package com.example.ymz1login.dao;
import com.example.ymz1login.pojo.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserDao extends JpaRepository<User,Integer> {
//默认有很多方法,可以按住alt键点JpaRepository查看已定义好的方法,
//当然也可以自己创建方法,只需要按照规范提供方法的名字即可实现对数据库的增删改查。
//通过用户名and密码查询登录,并返回给User类
User getByUsernameAndPassword(String userName,String userPW);
}
接口类创建完成后就可以在封装一层server服务类了,相当于二次封装dao层
六,创建service
package com.example.ymz1login.service;
import com.example.ymz1login.dao.UserDao;
import com.example.ymz1login.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
public UserDao userDao;
//封装dao层里的getByUsernameAndPassword方法向数据库中查询是否存在一条数据,
//这里密码我没有做加密直接放进数据库中了所以后续也不用解密什么的了
public User get(String user,String pass) {
return userDao.getByUsernameAndPassword(user,pass);
}
}
七,编写controller
1,引用server服务层,向数据库拿数然后反馈给前端,写到这才发现没有写code响应码的封装,懒得重写了,正常来说是需要传给前端code码,一般code会是200,400等等,然后带一些自定义的数据,比如咱们登录其实就是需要后端判断完是否一致然后返回给前端code码200,这样前端接收到200时就知道是正确的,算了我还是写下吧。
package com.example.demo.controller;
import com.example.demo.pojo.ResultJson;
import com.example.demo.result.Result;
import com.example.demo.pojo.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.util.HtmlUtils;
import javax.servlet.http.HttpSession;
@Controller
public class LoginController {
@Autowired
public UserService userService;
//@CrossOrigin是用来处理跨域请求的注解
//跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。
//@CrossOrigin(origins = "http://domain2.com", maxAge = 3600)
// origins : 允许可访问的域列表 maxAge:准备响应前的缓存持续的最大时间(以秒为单位)
@CrossOrigin
@PostMapping(value = "api/login")
//@ResponseBody返回json格式的结果
@ResponseBody
public Result login(@RequestBody User requestUser, HttpSession session) {
// 对 html 标签进行转义,防止 XSS 攻击
String username = requestUser.getUsername();
username = HtmlUtils.htmlEscape(username);
//赋值给User
User user =userService.get(username,requestUser.getPassword());
//正常判断service返回的是否为空
if (null == user) {
String message = "账号密码错误";
System.out.println("test");
return new Result(400);
} else {
//将用户登录的信息存放到session中
session.setAttribute("user",user);
return new Result(200);
}
}
// @CrossOrigin
// @PostMapping(value = "api/register")
// @ResponseBody
// public Result save(@RequestBody User user) {
// User user1 = userService.add(user);
// if (null == user1) {
// String message = "添加失败";
// return new Result(400);
// } else {
// return new Result(200);
// }
//
// }
@CrossOrigin
@PostMapping(value = "api/register")
@ResponseBody
public ResultJson save(@RequestBody User user) {
User user1 = userService.add(user);
if (null == user1) {
return ResultJson.success(400,"注册失败");
} else {
return ResultJson.success(200,"注册成功");
}
}
}
八,测试数据
然后使用postman测试一下能否拿到数据
如下图所示能看到返回code码为200即是正确的