一、JPA入门教程
首先JPA(相当于通用接口)是Java Persistence API的简称,中文名Java持久层API;JPA的总体思想和现有Hibernate、TopLink、JDO等ORM框架统一。在JPA中默认的实现方式是Hibernate(全自动映射关系),在编程时我们只要准备实体类即可,无需关心具体sql语句怎么写,更多是关心业务层方法实现。
1.准备工作:idea 2019.3(极限版本)+SQLyog(数据库操作的可视化工具)+jdk1.8(这是基于SpringBoot的程序)
2.项目搭建:步骤截图
!](https://img-blog.csdnimg.cn/20200817203053775.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzEzMzYx,size_16,color_FFFFFF,t_70#pic_center)
!](https://img-blog.csdnimg.cn/20200817203203960.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzEzMzYx,size_16,color_FFFFFF,t_70#pic_center)
pom依赖
!](https://img-blog.csdnimg.cn/20200817203314309.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzEzMzYx,size_16,color_FFFFFF,t_70#pic_center)
项目的目录结构
yml文件
实体类编写
package com.my.entity;
import javax.persistence.*;
import java.util.Date;
@Entity//表明这个类是一个实体类
@Table(name = "user_info")//进行实体类与数据库表进行对应
public class User {
@Id//表明当前属性字段是主键
@GeneratedValue(strategy = GenerationType.IDENTITY) //表明主键为数据库自增方式
@Column(name = "user_id")
private Integer userId; // 用户编号
@Column(name = "login_phone_number")
private String loginPhoneNumber; //登录手机号码
@Column(name = "user_real_name")
private String userRealName; //真实姓名
@Column(name = "last_login_time")
private Date lastLoginDateTime; //最后登录时间
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getLoginPhoneNumber() {
return loginPhoneNumber;
}
public void setLoginPhoneNumber(String loginPhoneNumber) {
this.loginPhoneNumber = loginPhoneNumber;
}
public String getUserRealName() {
return userRealName;
}
public void setUserRealName(String userRealName) {
this.userRealName = userRealName;
}
public Date getLastLoginDateTime() {
return lastLoginDateTime;
}
public void setLastLoginDateTime(Date lastLoginDateTime) {
this.lastLoginDateTime = lastLoginDateTime;
}
}
数据访问层DAO
package com.my.dao;
import com.my.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
//用户数据访问层接口
/*
1.该接口需要继承自JpaResitory接口
2.通过泛型指定实体类的名称
这里面jpa为我们写好了对应的常见操作方法
*/
@Repository
public interface IUserDAO extends JpaRepository<User,Integer>{//该泛型表示的是实体类是谁,实体类对应的主键是
//通过手机号码进行精准查询用户的信息,注意方法名字不能写错
List<User> findUsersByLoginPhoneNumber(String phoneNumber);
//通过手机号码进行模糊查询
List<User> findUsersByLoginPhoneNumberLike(String phoneNumber);
}
用户业务层接口
package com.my.service;
import com.my.entity.User;
import java.util.List;
public interface IUserService {
//查询所有的用户
List<User> listAllUser();
//通过用户的主键进行用户信息的查询
User queryUserById(int id);
//通过用户手机号码查询用户信息
List<User> listAllUserByPhoneNumber(String phoneNumber);
//通过用户手机号码进行模糊查询用户信息
List<User> listAllUserByPhoneNumberLike(String phoneNumber);
//插入与更新操作,传入一个User对象作为参数,因为在Hibernate的底层插入与更新操作是一个save方法
//区分它们是看是否传入用户的主键id,这个id是封装在User对象里,所以传入参数是一个User
int insertAndUpdate(User user);
//根据用户的id进行删除操作,因为delete方法是没有返回值的
int deleteUserById(int uid);
}
用户业务层接口实现类
package com.my.service.impl;
import com.my.dao.IUserDAO;
import com.my.entity.User;
import com.my.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
@Service
public class UserServiceImpl implements IUserService {
//注入DAO层接口
@Autowired
private IUserDAO iUserDAO;
@Override
public List<User> listAllUser() {
return iUserDAO.findAll();
}
@Override
public User queryUserById(int id) {
//注意此方法返回的是一个Optional对象,注意泛型
Optional<User> userOptional=iUserDAO.findById(id);
User user =userOptional.get();//返回是一个泛型
/*
public T get() {
if (value == null) {
throw new NoSuchElementException("No value present");
}
return value;
}
*/
return user;
}
@Override
public List<User> listAllUserByPhoneNumber(String phoneNumber) {
return iUserDAO.findUsersByLoginPhoneNumber(phoneNumber);
}
@Override
public List<User> listAllUserByPhoneNumberLike(String phoneNumber) {
return iUserDAO.findUsersByLoginPhoneNumberLike(phoneNumber);
}
@Override
public int insertAndUpdate(User user) {
//使用try...catch...进行插入成功与否的判断,由于save方法的返回值原因,(这是hibernate底层的设计)
try{
iUserDAO.save(user) ;
return 0;//成功返回0
}catch (Exception e){
//失败返回-1
return -1;
}
}
@Override
public int deleteUserById(int uid) {
//使用try...catch...进行插入成功与否的判断,由于deleteById方法的返回值原因,(这是hibernate底层的设计)
try{
iUserDAO.deleteById(uid);//注意此方法的返回值为void
return 0;//成功返回0
}catch (Exception e){
//失败返回-1
return -1;
}
}
}
控制器
package com.my.controller;
import com.my.entity.User;
import com.my.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
import java.util.List;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private IUserService iUserService;
//http://localhost/my/user/list_user.do
@GetMapping("/list_user.do")
public List<User> findAllUser(){
return iUserService.listAllUser();
}
@GetMapping("/find_by_id.do/{u_id}")
public User findByUserId(@PathVariable("u_id")int uid){
return iUserService.queryUserById(uid);
}
//通过手机号码记性精准查询
@GetMapping("/find_by_phone_number.do/{phone_number}")
public List<User> findByUserPhoneNumber(@PathVariable("phone_number")String phoneNumber){
return iUserService.listAllUserByPhoneNumber(phoneNumber);
}
//通过手机号码记性模糊查询
@GetMapping("/find_by_phone_number_like.do")
public List<User> findByUserPhoneNumberLike(){
return iUserService.listAllUserByPhoneNumberLike("%678%");//注意不能忘记加通配符%
}
//进行用户信息的插入
@GetMapping("/insert_user.do")
public String insertUser(User user){
//进行用户数据的设置,没有设置主键,所以执行insert操作
user.setUserRealName("甄子丹");
user.setLoginPhoneNumber("13672401138");
user.setLastLoginDateTime(new Date());//util的日期
//进行插入操作
int status=iUserService.insertAndUpdate(user);
return status==0?"插入数据成功":"插入数据失败";
}
//进行用户信息的更新操作
@GetMapping("/update_user.do")
public String updateUser(User user){
//进行用户数据的设置,设置主键了,所以执行更新操作
user.setUserId(2);
user.setUserRealName("陈冠希");
user.setLoginPhoneNumber("13652401588");
user.setLastLoginDateTime(new Date());//util的日期
//进行插入操作
int status=iUserService.insertAndUpdate(user);
return status==0?"修改数据成功":"修改数据失败";
}
//根据用户的id进行删除操作,传参时用占位符{}里面的替换下面方法的user_id,并且值赋给uid
//http://localhost/my/user/delete_user.do/5,只能删除新添加的信息,带有外键约束的如:编号3,1,2是删不掉的
@GetMapping("/delete_user.do/{user_id}")//
public String deleteUserById(@PathVariable("user_id")int uid){
//进行删除操作,调用业务层方法,实际也就是调用DAO
int status=iUserService.deleteUserById(uid);
return status==0?"删除数据成功":"删除数据失败";
}
}
SpringBoot程序的入口
package com.my;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringJpaApplication {
public static void main(String[] args) {
SpringApplication.run(SpringJpaApplication.class, args);
}
}