JPA入门

一、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);
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值