springboot+jpa項目演示

dao層只要繼承Jpa的接口,就有了封裝好的增刪改查
支持本地查詢,自定義查詢,jpql等
實體類加@Entity,@Table,主鍵註解,主鍵策略,列註解,關聯映射註解,忽略json序列化爲空的值的註解等等,基本都是註解,就可以完成映射

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 http://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.1.3.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.xyy</groupId>
	<artifactId>cache</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>cache</name>
	<description>Demo project for Spring Boot</description>
    <packaging>jar</packaging>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<!--web-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
		</dependency>
		<!--mysql-->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>
		<!--alibb數據源-->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid-spring-boot-starter</artifactId>
			<version>1.1.10</version>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.31</version>
		</dependency>
		<!--ceshi-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<!--自動提示-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-configuration-processor</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-logging</artifactId>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

以shiro的User,role,permission,user_role,role_permission五張表爲例子,user_role表有兩個外鍵,role_permission也有兩個外鍵,分別對應他們的主鍵
user
role
在這裏插入圖片描述

在這裏插入圖片描述
User

package com.xyy.cache.bean.mysqljpa;

import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

import javax.persistence.*;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.List;

@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" })
@Entity
@Table(name = "user")
public class User implements Serializable {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer uid;

    @NotEmpty(message = "賬號不能爲空")
    @Size(min=3, max=20)
    @Column(name = "username",nullable = false, length = 20, unique = true)
    private String username;

    @NotEmpty(message = "密碼不能爲空")
    @Size(max=100)
    @Column(name = "password")
    private  String password;

    //1、關係維護端,負責多對多關係的綁定和解除
    //2、@JoinTable註解的name屬性指定關聯表的名字,joinColumns指定外鍵的名字,關聯到關係維護端(User)
    //3、inverseJoinColumns指定外鍵的名字,要關聯的關係被維護端(Authority)
    //4、其實可以不使用@JoinTable註解,默認生成的關聯表名稱爲主表表名+下劃線+從表表名,
    //即表名爲user_authority
    //關聯到主表的外鍵名:主表名+下劃線+主表中的主鍵列名,即user_id
    //關聯到從表的外鍵名:主表中用於關聯的屬性名+下劃線+從表的主鍵列名,即authority_id
    //主表就是關係維護端對應的表,從表就是關係被維護端對應的表
    @ManyToMany(fetch = FetchType.LAZY)   //多對多
    @JoinTable(	//jointable維護方加此註釋
           name="user_role",		//name是表名,
//joincolumns需要將此entity中的什麼字段添加到表的什麼字段,name是存儲在多對多關係表中的字段名,referencedColumnName爲此外鍵
            joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")},
//inverseJoinColumns,name字段是關係entity Role的id以role_id存儲在關係表user_role中
            inverseJoinColumns={@JoinColumn(name="role_id", referencedColumnName="id")})
    private List<Role> roles;


    public Integer getUid() {
        return uid;
    }

    public void setUid(Integer uid) {
        this.uid = uid;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
    @JsonBackReference
    public List<Role> getRoles() {
        return roles;
    }

    public void setRoles(List<Role> roles) {
        this.roles = roles;
    }

    public User(@NotEmpty(message = "賬號不能爲空") @Size(min = 3, max = 20) String username, @NotEmpty(message = "密碼不能爲空") @Size(max = 100) String password) {
        this.username = username;
        this.password = password;
    }

    public User() {
    }

    @Override
    public String toString() {
        return "User{" +
                "uid=" + uid +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", roles=" + roles +
                '}';
    }
}

UserRepository

package com.xyy.cache.repository;

import com.xyy.cache.bean.mysqljpa.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Transactional
@Repository
public interface UserRepository extends JpaRepository<User,Integer> {

    //1.Jpa命名規範,查詢
    //通過賬戶和密碼查詢用戶
    User findByUsernameAndPassword(String username,String password);

    User findByUsername(String username);

    //本地查詢,命名參數查詢
    @Modifying
    @Query(value = "update user set username = ?1 where id = ?2",nativeQuery = true)
    int updateUsernameById(String userName,Integer id);

    //自定義repository。手寫sql,nativeQyery指是否使用原生sql查詢
    //在更新數據的情況下不能單獨使用query,要加modify註解
    //更好的支持多表查詢的工具框架 QueryDSL
    //2.本地查詢

    //3.使用倉庫封裝的常見增刪改查
    //List<User> findAll();
    //4.分頁和排序
    void deleteById(Integer id);

    List<User> findAll();

    Page<User> findAll(Pageable pageable);

    List<User> findAll(Sort sort);

    @Query(value = "select * from user u where u.id in (select user_id from user_role where role_id > ?1)",nativeQuery = true)
    List<User> findByUidGreaterThan(@Param(value = "id") Integer id);







}

UserService

package com.xyy.cache.service;

import com.xyy.cache.bean.mysqljpa.Role;
import com.xyy.cache.bean.mysqljpa.User;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.repository.query.Param;

import java.util.List;

public interface UserService {

    public void deleteById(Integer id);

    User findByUsername(String username);
    /** 增加*/
    public void save(User user);
    /** 更新*/
    public int updateUsernameById(String username,Integer id);
    /** 查詢單個*/
    public User findById(Integer id);

    List<User> findAll();

    User findByUsernameAndPassword(String username,String password);

    Page<User> findAll(Pageable pageable);

    List<User> findAll(Sort sort);
    List<User> findByUidGreaterThan(@Param(value = "id") Integer id);
}

實現

package com.xyy.cache.service.Impl;

import com.alibaba.fastjson.JSON;
import com.xyy.cache.repository.UserRepository;
import com.xyy.cache.bean.mysqljpa.User;
import com.xyy.cache.service.UserService;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;


    @Override
    public void deleteById(Integer id) {
        userRepository.deleteById(id);
    }

    @Override
    public User findByUsername(String username) {
       return userRepository.findByUsername(username);
    }

    @Override
    public void save(User user) {
        User user1=userRepository.save(user);
        System.out.println(user1);
    }

    @Override
    public int updateUsernameById(String username,Integer id) {
        return userRepository.updateUsernameById(username,id);
    }

    @Override
    public User findById(Integer id) {
        Optional<User> one = userRepository.findById(id);
        if(one.isPresent()){
            System.out.println(one.get());
            return one.get();
        }else {
            return null;
        }
    }


    @Override
    public User findByUsernameAndPassword(String userName, String password) {
        return userRepository.findByUsernameAndPassword(userName,password);
    }

    @Override
    public Page<User> findAll(Pageable pageable) {
        Page<User> p=userRepository.findAll(pageable);
        return p;
    }

    @Override
    public List<User> findAll(Sort sort) {
        return userRepository.findAll(sort);
    }

    @Override
    public List<User> findByUidGreaterThan(Integer id) {
        return userRepository.findByUidGreaterThan(id);
    }

}

application.yml

服務端口
server:
  port: 8082
#連接數據庫
spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/blog?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2B8
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource    #使用阿里數據源
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
    database-platform:

role

package com.xyy.cache.bean.mysqljpa;

import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

import javax.persistence.*;
import java.util.List;
import java.util.Set;

@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" })
@Entity
@Table(name = "role")
public class Role {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer rid;

    @Column(name = "name")
    private String rname;

    @ManyToMany(fetch = FetchType.LAZY)   //多對多
    @JoinTable(	//jointable維護方加此註釋
            name="role_permission",		//name是表名,
//joincolumns需要將此entity中的什麼字段添加到表的什麼字段,name是存儲在多對多關係表中的字段名,referencedColumnName爲此外鍵
            joinColumns={@JoinColumn(name="role_id", referencedColumnName="id")},
//inverseJoinColumns,name字段是關係entity Role的id以role_id存儲在關係表user_role中
            inverseJoinColumns={@JoinColumn(name="permission_id", referencedColumnName="id")})
    private Set<Permission> permissions;

    public Set<Permission> getPermissions() {
        return permissions;
    }

    public void setPermissions(Set<Permission> permissions) {
        this.permissions = permissions;
    }

    public Integer getRid() {
        return rid;
    }

    public void setRid(Integer rid) {
        this.rid = rid;
    }
    @JsonBackReference
    public String getRname() {
        return rname;
    }

    public void setRname(String rname) {
        this.rname = rname;
    }

    @Override
    public String toString() {
        return "Role{" +
                "rid=" + rid +
                ", rname='" + rname + '\'' +
                '}';
    }
}

Permission

package com.xyy.cache.bean.mysqljpa;

import javax.persistence.*;

@Entity
@Table(name = "permission")
public class Permission {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer pid;

    @Column(name = "name")
    private String name;

    @Column(name = "url")
    private String url;

    public Integer getPid() {
        return pid;
    }

    public void setPid(Integer pid) {
        this.pid = pid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }
}

roleDao

package com.xyy.cache.repository;

import com.xyy.cache.bean.mysqljpa.Role;
import com.xyy.cache.bean.mysqljpa.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface RoleRepositoty extends JpaRepository<Role,Integer> {

    @Query(value = "select * from role r where r.id in (select role_id from user_role where user_id > ?1)",nativeQuery = true)
    List<Role> findByUidGreaterThan(@Param(value = "id") Integer id);

    @Query(value = "select * from role inner join user_role on role.id=user_role.role_id inner join user on user.id=user_role.user_id",nativeQuery = true)
    List<Role> findByUser(User user);
}

perssionDao

package com.xyy.cache.repository;

import com.xyy.cache.bean.mysqljpa.Permission;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface PermissionRepositity extends JpaRepository<Permission,Integer> {
}

UserController

package com.xyy.cache.controller;

import com.xyy.cache.repository.RoleRepositoty;
import com.xyy.cache.bean.mysqljpa.User;
import com.xyy.cache.service.Impl.UserServiceImpl;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpSession;
import java.util.List;

@Controller
public class UserController {
    @Autowired
    private UserServiceImpl userService;
    @Autowired
    private RoleRepositoty roleRepositoty;
   
     @RequestMapping("/login")
    @ResponseBody
    public User login(User user, ModelAndView model) throws Exception{
        String username = user.getUsername();
        String password = user.getPassword();
        User user1 = userService.findByUsernameAndPassword(username,password);
        if(user1!=null){
            return user1;
        }
       else {
            user.setUsername("請檢查用戶名和密碼");
            return user;
        }
    }
    @ResponseBody
    @GetMapping("/findByUserNameAndPassword")
    public User findByUserNameAndPassword(String username,String password){
        User user = userService.findByUsernameAndPassword(username, password);
        System.out.println(user);
        return user;
    }

    @ResponseBody
    @RequestMapping("/findAllUser")
    public List<User> findAll(){
        List<User> stuList = userService.findAll();
        return stuList;
    }

    @ResponseBody
    @RequestMapping("/findById/{id}")
    public User findById(@PathVariable Integer id){
        return userService.findById(id);
    }

    @ResponseBody
    @RequestMapping("/page")
    public Page<User> findAlls(){
        //Pageable是接口,PageRequest是接口實現
        // PageRequest的對象構造函數有多個,page是頁數,初始值是0,size是查詢結果的條數,
        // 後兩個參數參考Sort對象的構造方法Pageable pageable = new PageRequest(0,3, Sort.Direction.DESC,"id");
       Page<User> page=userService.findAll(new PageRequest(0,3, Sort.Direction.DESC,"uid"));
        //查詢結果總行數
        System.out.println(page.getTotalElements());
        //按照當前分頁大小,總頁數
        System.out.println(page.getTotalPages());
        //按照當前頁數、分頁大小,查出的分頁結果集合
       return page;
    }


    @ResponseBody
    @RequestMapping("/gts/{id}")
    public List<User> findByUidGreaterThan(@PathVariable Integer id){
        System.out.println(id);
        return userService.findByUidGreaterThan(id);
    }
}

演示結果:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
自定義的方法
在這裏插入圖片描述
rolecontroller
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
其他要說的話,看註解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章