入门

初始化springboot

依赖引入

org.springframework.boot

spring-boot-starter-data-jpa

org.springframework.boot

spring-boot-starter-web

com.alibaba

druid

1.1.16

mysql

mysql-connector-java

runtime

org.projectlombok

lombok

true

org.springframework.boot

spring-boot-starter-test

test

配置文件

spring:

datasource:

driver-class-name: com.mysql.cj.jdbc.Driver

url: jdbc:mysql://127.0.0.1:3306/blog?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8

username: root

password: xx

type: com.alibaba.druid.pool.DruidDataSource

#JPA配置

jpa:

database-platform: org.hibernate.dialect.MySQL5Dialect

# 自动更新数据库表结构,也可以是 validate | update | create | create-drop

properties:

hibernate:

hbm2ddl:

auto: update

# 显示sql语句

show-sql: true

实体类

package com.learn.springdata.pojo;

import lombok.*;

import org.hibernate.Hibernate;

import javax.persistence.*;

import java.util.Date;

import java.util.Objects;

/**

* 测试用户实体类

*

* @author itdragon

*/

@Table(name = "itdragon_user")

@Entity

@Getter

@Setter

@ToString

@NoArgsConstructor

@AllArgsConstructor

public class UserTest {

@Id

//GeneratedValue(生成的值)

//strategy代表主键生成策略

@GeneratedValue(strategy = GenerationType.AUTO)

private Long id; // 自增长主键

private String account; // 登录的账号

//Column对一个字段进行标注,nullable:是否可为NULL

//unique:值是否不能重复

//name:数据库中的字段名

@Column(nullable = false,unique = false,name = "user_name")

private String userName; // 注册的昵称

//transient(暂时的) 标注此注解后在创建数据表的时候将会忽略该属性

@Transient

private String isTest;

// Temporal(时间的) :向数据库映射日期(Date)属性时用来调整映射的精度。Date 类型的数据有 DATE, TIME, 和 TIMESTAMP 三种精度(即单纯的日期,时间,或者两者兼备).

@Temporal(TemporalType.DATE)

private Date birth;

@Temporal(TemporalType.TIMESTAMP)

private Date createTime;

@Override

public boolean equals(Object o) {

if (this == o) return true;

if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false;

UserTest userTest = (UserTest) o;

return id != null && Objects.equals(id, userTest.id);

}

@Override

public int hashCode() {

return getClass().hashCode();

}

}

效果

接口的springdata的书写(重点)

知识点2

* 重点知识:SpringData 查询方法定义规范

* 1. 查询方法名一般以 find | read | get 开头,建议用find

* findByAccount : 通过account查询User

* account是User的属性,拼接时首字母需大写

* 2. 支持的关键词有很多比如 Or,Between,isNull,Like,In等

* findByEmailEndingWithAndCreatedDateLessThan : 查询在指定时间前注册,并以xx邮箱结尾的用户

* And : 并且

* EndingWith : 以某某结尾

* LessThan : 小于

* 注意

* 若有User(用户表) Platform(用户平台表) 存在一对一的关系,且User表中有platformId字段

* SpringData 为了区分:

* findByPlatFormId 表示通过platformId字段查询

* findByPlatForm_Id 表示通过platform实体类中id字段查询

*

* 开发建议

* 表的设计,尽量做单表查询,以确保高并发场景减轻数据库的压力。

知识点3

重点知识:使用 @Query 注解 * * 上面的方法虽然简单(不用写sql语句),但它有最为致命的问题-----不支持复杂查询,其次是命名太长 * 1. 使用@Query 注解实现复杂查询,设置 nativeQuery=true 使查询支持原生sql * 2. 配合@Modifying 注解实现创建,修改,删除操作 * 3. SpringData 默认查询事件为只读事务,若要修改数据则需手动添加事务注解 * * 注意 * 若@Query 中有多个参数,SpringData 提供两种方法: * 第一种 ?1 … ?2 要求参数顺序一致 * 第二种 :xxx … :yyy xxx 和 yyy 必须是实体类对应的属性值,不要求参数顺序但参数前要加上@Param(“xxx”) * 模糊查询可使用 %xxx% * * 开发建议 * 1. 参数填写的顺序要保持一致,不要给自己添加麻烦 * 2. 建议使用@Query,可读性较高

接口清单

JpaRepository接口提供的方法与说明

方法 描述 List findAll(); 查找所有实体。 List findAll(Sort var1); 排序、查找所有实体。 List findAllById(Iterable var1); 返回制定一组ID的实体。 List saveAll(Iterable var1); 保存集合。 void flush(); 执行缓存与数据库同步。 S saveAndFlush(S var1); 强制执行持久化。 void deleteInBatch(Iterable var1); 删除一个实体集合。 void deleteAllInBatch(); 删除所有实体。 T getOne(ID var1); 返回ID对应的实体。如果不存在,则返回空值。 List findAll(Example var1); 查询满足Example的所有对象。 List findAll(Example var1, Sort var2); 查询满足Example的所有对象,并且进行排序返回

CrudRepository接口提供的方法与说明:

方法 说明 S save(S var1); 保存实体。当实体中包含主键时,JPA会进行更新操作。 Iterable saveAll(Iterable var1); 保存所有实体。实体必须不为空。 Optional findById(ID var1); 根据主键ID检索实体。 boolean existsById(ID var1); 根据主键ID检索实体,返回是否存在。值为布尔类型。 Iterable findAll(); 返回所有实体。 Iterable findAllById(Iterable var1); 根据给定的一组ID值返回一组实体。 long count(); 返回实体的数量 void deleteById(ID var1); 根据ID删除数据。 void delete(T var1); 删除给定的实体。 void deleteAll(Iterable var1); 删除实体。 void deleteAll(); 删除所有实体。 开发建议

这里列出的是常用方法CrudRepository 中的findAll() 方法要慎用。当数据库中数据量大,多线程脚本调用findAll方法,系统可能会宕机。CrudRepository 中的deletAll()方法要慎用。这是物理删除,现在企业一般采用逻辑删除。PagingAndSortingRepository 和 JpaSpecificationExecutor 能满足大部分业务需求。

简单的增删查改

接口

public interface UserRepository extends PagingAndSortingRepository,

JpaSpecificationExecutor {

}

测试代码

@Autowired

UserRepository us;

//查找所有用户

@Test

public void findAllUser() {

Iterable usAll = us.findAll();

usAll.forEach(System.out::println);

}

// 新增用户

@Test

public void saveUser() {

UserTest u=new UserTest();

u.setUserName("张三四次");

u.setAccount("你爹");

UserTest byAccount = us.save(u);

System.out.println(byAccount);

}

//删除用户

@Test

public void deleteUser(){

//方法1

Optional us1 = us.findById(1L);

UserTest test;

//Present为存在之意,isPresent表示us1中是否存在值

if (us1.isPresent()) {

//没有返回值奥,和mp不一样

us.deleteById(1L);

System.out.println("删除成功!");

}

else {

System.out.println("删除失败!");

}

//方法2

try

{

us.deleteById(1L);

System.out.println("删除成功!");

}

catch(Exception ex)

{

System.out.println("删除失败!");

}

}

//更新用户

@Test

public void updateUser(){

UserTest u=new UserTest();

u.setUserName("张fd三四次");

u.setAccount("你df爹");

u.setId(2L);

//使用的方法和新增一样

UserTest save = us.save(u);

System.out.println(save);

}

使用类SQL(注解开发)

适用于复杂的业务场景

使用JPQL语句(HQL)

1 查询时使用的是实体类的字段,而不是数据库中的字段

2 变量使用:变量名的形式,在方法参数中还有使用@Param("xx")

3 更新操作需要加上 @Modifying

–接口代码–

//查找用户id通过用户名

@Query("select id from UserTest where userName=:name")

List findUserIdByName(@Param("name") String name);

//查找所有用户并排序(升)

@Query("select userName from UserTest order by userName")

List findAllUserNameSort();

//查找所有用户并排序(降)

@Query("select userName from UserTest order by userName desc ")

List findAllUserNameSortDesc();

//模糊加分页查询

@Query("select u from UserTest u where u.userName like %:name%")

Page findUserByLikeName(String name, Pageable pageable);

–测试代码–

//查找用户id通过用户名

@Test

void findUserIdByName(){

List ids = us.findUserIdByName("张fd三四次");

System.out.println(ids);

}

//查找所有用户名并对用户名排序

@Test

void findAllUserName(){

List userSort = us.findAllUserNameSort();

List userSort2 = us.findAllUserNameSortDesc();

System.out.println(userSort);

System.out.println(userSort2);

}

//模糊加分页查询

@Test

void findTest(){

//构建排序

Sort sort= Sort.by(Sort.Direction.ASC,"id");

//构建分页

int pageIndex=0;

int pageSize=2;

PageRequest pageRequest = PageRequest.of(pageIndex, pageSize,sort);

//执行分页+排序+模糊

Page lists = us.findUserByLikeName("张",pageRequest);

//获取结果

List content = lists.getContent();

System.out.println(content);

}

使用SQL语句

提示: 1这里的占位符使用的是?与jdbc相似,1表示第几个参数 2使用sql查询是SQL语句中的字段必须要和数据库对应 –接口代码–

//使用SQL

@Query(value = "select id from itdragon_user where user_name=?1",nativeQuery = true)

List findUserIdByNameUserSQL(String name);

–测试代码–

//使用SQL语句

@Test

void UserSQLTest(){

List sql = us.findUserIdByNameUserSQL("张fd三四次3");

System.out.println(sql);

}

使用接口查询语法

献上一张图,内容全在其中 –接口–

//使用接口查询语法

// 1 通过账号查用户信息

List findByAccount(String account);

//2 对用户名模糊查询

List findByUserNameLike(String name);

//3 批量查找特定id的用户

List findByIdIn(List ids);

//4 查找用户名为:张fd三四次1,昵称为你df爹的用户

UserTest findByUserNameAndAccount(String userName, String account);

–测试–

@Test

void UserTSTest(){

List a = us.findByAccount("你df爹");

System.out.println(a);

List a1 = us.findByUserNameLike("你");

System.out.println(a1);

UserTest b = us.findByUserNameAndAccount("张fd三四次3", "你df爹");

System.out.println(b);

List ids=new ArrayList<>();

ids.add(2L);

ids.add(3L);

List c = us.findByIdIn(ids);

System.out.println(c);

}

参考阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: