<!-- springdata-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 阿里巴巴数据库池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
<!-- mysql引擎-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
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;
/**
@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 查询方法定义规范
* 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字段查询
* <p>
* 开发建议
* 表的设计,尽量做单表查询,以确保高并发场景减轻数据库的压力。
重点知识:使用 @Query 注解
* <p>
* 上面的方法虽然简单(不用写sql语句),但它有最为致命的问题-----不支持复杂查询,其次是命名太长
* 1. 使用@Query 注解实现复杂查询,设置 nativeQuery=true 使查询支持原生sql
* 2. 配合@Modifying 注解实现创建,修改,删除操作
* 3. SpringData 默认查询事件为只读事务,若要修改数据则需手动添加事务注解
* <p>
* 注意
* 若@Query 中有多个参数,SpringData 提供两种方法:
* 第一种 ?1 ... ?2 要求参数顺序一致
* 第二种 :xxx ... :yyy xxx 和 yyy 必须是实体类对应的属性值,不要求参数顺序但参数前要加上@Param("xxx")
* 模糊查询可使用 %xxx%
* <p>
* 开发建议
* 1. 参数填写的顺序要保持一致,不要给自己添加麻烦
* 2. 建议使用@Query,可读性较高接口清单
CrudRepository接口提供的方法与说明:
方法 说明
\<S extends T> S save(S var1); 保存实体。当实体中包含主键时,JPA会进行更新操作。
\<S extends T> Iterable\<S> saveAll(Iterable\<S> var1); 保存所有实体。实体必须不为空。
Optional\<T> findById(ID var1); 根据主键ID检索实体。
boolean existsById(ID var1); 根据主键ID检索实体,返回是否存在。值为布尔类型。
Iterable\<T> findAll(); 返回所有实体。
Iterable\<T> findAllById(Iterable\<ID> var1); 根据给定的一组ID值返回一组实体。
long count(); 返回实体的数量
void deleteById(ID var1); 根据ID删除数据。
void delete(T var1); 删除给定的实体。
void deleteAll(Iterable\<? extends T> var1); 删除实体。
void deleteAll(); 删除所有实体。
开发建议
这里列出的是常用方法 CrudRepository 中的findAll() 方法要慎用。当数据库中数据量大,多线程脚本调用findAll方法,系统可能会宕机。 CrudRepository 中的deletAll()方法要慎用。这是物理删除,现在企业一般采用逻辑删除。
PagingAndSortingRepository 和 JpaSpecificationExecutor 能满足大部分业务需求。
public interface UserRepository extends PagingAndSortingRepository<UserTest, Long>,
JpaSpecificationExecutor<UserTest> {
}
@Autowired
UserRepository us;
//查找所有用户
@Test
public void findAllUser() {
Iterable<UserTest> 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<UserTest> 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);
}
适用于复杂的业务场景
1 查询时使用的是实体类的字段,而不是数据库中的字段
2 变量使用:变量名的形式,在方法参数中还有使用@Param("xx")
3 更新操作需要加上 @Modifying
--接口代码--
//查找用户id通过用户名
@Query("select id from UserTest where userName=:name")
List<Long> findUserIdByName(@Param("name") String name);
//查找所有用户并排序(升)
@Query("select userName from UserTest order by userName")
List<String> findAllUserNameSort();
//查找所有用户并排序(降)
@Query("select userName from UserTest order by userName desc ")
List<String> findAllUserNameSortDesc();
//模糊加分页查询
@Query("select u from UserTest u where u.userName like %:name%")
Page<UserTest> findUserByLikeName(String name, Pageable pageable);
--测试代码--
//查找用户id通过用户名
@Test
void findUserIdByName(){
List<Long> ids = us.findUserIdByName("张fd三四次");
System.out.println(ids);
}
//查找所有用户名并对用户名排序
@Test
void findAllUserName(){
List<String> userSort = us.findAllUserNameSort();
List<String> 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<UserTest> lists = us.findUserByLikeName("张",pageRequest);
//获取结果
List<UserTest> content = lists.getContent();
System.out.println(content);
}
提示:
1这里的占位符使用的是?与jdbc相似,1表示第几个参数
2使用sql查询是SQL语句中的字段必须要和数据库对应
--接口代码--
//使用SQL
@Query(value = "select id from itdragon_user where user_name=?1",nativeQuery = true)
List<Long> findUserIdByNameUserSQL(String name);
--测试代码--
//使用SQL语句
@Test
void UserSQLTest(){
List<Long> sql = us.findUserIdByNameUserSQL("张fd三四次3");
System.out.println(sql);
}
献上一张图,内容全在其中
--接口--
//使用接口查询语法
// 1 通过账号查用户信息
List<UserTest> findByAccount(String account);
//2 对用户名模糊查询
List<UserTest> findByUserNameLike(String name);
//3 批量查找特定id的用户
List<UserTest> findByIdIn(List<Long> ids);
//4 查找用户名为:张fd三四次1,昵称为你df爹的用户
UserTest findByUserNameAndAccount(String userName, String account);
--测试--
@Test
void UserTSTest(){
List<UserTest> a = us.findByAccount("你df爹");
System.out.println(a);
List<UserTest> a1 = us.findByUserNameLike("你");
System.out.println(a1);
UserTest b = us.findByUserNameAndAccount("张fd三四次3", "你df爹");
System.out.println(b);
List<Long> ids=new ArrayList<>();
ids.add(2L);
ids.add(3L);
List<UserTest> c = us.findByIdIn(ids);
System.out.println(c);
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。