1.入门案例
1.1 项目整体结构
表:sql
DROP TABLE IF EXISTS
t_user
; CREATE TABLEt_user
(user_id
int(0) NOT NULL AUTO_INCREMENT,user_name
varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,real_name
varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, PRIMARY KEY (user_id
) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 35 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;SET FOREIGN_KEY_CHECKS = 1;
1.2 添加依赖包
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>5.1.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.6.RELEASE</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.2</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.8</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.11</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>5.0.7.Final</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.1.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>1.9.0.RELEASE</version> </dependency> </dependencies>
1.3 添加配置文件
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd "> <!-- 引入db.properties文件 --> <context:property-placeholder location="classpath:db.properties" /> <!-- 创建druid 的数据源 --> <bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource"> <property name="url" value="${jdbc.url}" /> <property name="driverClassName" value="${jdbc.driver}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <!-- 配置Hibernate的SessionFactory对象 id必须得是 : entityManagerFactory --> <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> <!-- 关联数据源 --> <property name="dataSource" ref="dataSource"/> <!-- 配置Hibernate的属性信息 --> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <property name="database" value="MYSQL"/> <property name="generateDdl" value="true"/> <property name="showSql" value="true"/> </bean> <!--<props> <prop key="show_sql">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> </props>--> </property> <!-- 扫描路径 --> <property name="packagesToScan"> <list> <value>com.bobo.pojo</value> </list> </property> </bean> <!-- 配置事务管理--> <bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <!-- 配置开启事务注解 --> <tx:annotation-driven transaction-manager="transactionManager" /> <!-- 配置扫描路径 --> <context:component-scan base-package="com.bobo" /> <!-- Spring Data Jpa 配置--> <!-- 配置Dao的扫描 --> <jpa:repositories base-package="com.bobo.dao" /> </beans>
db.properties
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/logistics?characterEncoding=utf-8&serverTimezone=UTC jdbc.username=root jdbc.password=root
1.4 创建POJO对象
package com.bobo.pojo;
/**
* @Auther: cuitao
* @Date: 2023/7/14 - 07 - 14 - 8:58
* @Description: com.bobo.dao
*/
import javax.persistence.*;
import java.io.Serializable;
@Entity
@Table(name = "t_user")
public class Users implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private Integer userId;
@Column(name = "user_name")
private String userName;
@Column(name = "real_name")
private String realName;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
@Override
public String toString() {
return "Users{" +
"userId=" + userId +
", userName='" + userName + '\'' +
", realName='" + realName + '\'' +
'}';
}
}
1.5 创建持久层
import com.bobo.pojo.Users;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserDao extends JpaRepository<Users,Integer> {
}
1.6 单元测试
package com.bobo.test;
import com.bobo.dao.UserDao;
import com.bobo.pojo.Users;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Test1 {
@Autowired
private UserDao dao;
@Test
@Transactional
@Rollback(false)
public void test1(){
Users user = new Users();
user.setUserName("admin-jpa");
user.setRealName("测试");
dao.save(user);
}
}
2. Repository接口
public interface Repository<T, ID extends Serializable> {
}
Repository 接口是 Spring Data JPA 中为我我们提供的所有接口中的顶层接口,而且是个标志接口,Repository 提供了两种查询方式的支持 1)基于方法名称命名规则查询 2)基于@Query 注解查询
2.1 基于方法名称命名规则查询
代码示例:
package com.bobo.dao;
import com.bobo.pojo.Users;
import org.springframework.data.repository.Repository;
import java.util.List;
/**
* Repository接口的使用
*/
public interface UserDaoRepository extends Repository<Users, Integer> {
//后缀Is表示 ==
List<Users> findByUserNameIs(String string);
List<Users> findByUserNameLike(String username);
List<Users> findByUserNameAndRealNameIs(String name, String realName);
List<Users> findByRealNameIs(String name);
Users findByUserNameAndUserId(String userName,Integer userId);
List<Users> findByUserNameOrUserIdIs(String userName,Integer userId);
List<Users> findUsersByRealNameOrAndUserIdIn(String realName,List<Integer>userIdList);
Users findUsersByUserIdEquals(Integer userId);
Users findByUserId(Integer userId);
// List<Users>findByUserIdBetween(List<Integer>userIds);
List<Users>findByUserIdLessThan(Integer userId);
List<Users>findByUserIdLessThanEqual(Integer userId);
List<Users>findByUserIdGreaterThanEqual(Integer userId);
List<Users>findByRealNameIsNull();
List<Users>findByUserNameIsNotNull();
}
package com.bobo.dao;
import com.bobo.pojo.Users;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class 基于方法名称命名规则查询 {
@Autowired
private UserDaoRepository dao;
@Test
@Transactional
@Rollback(false)
public void query1() {
Users user = this.dao.findByUserNameAndUserId("测试", 1);
// select users0_.user_id as user_id1_0_, users0_.real_name as real_nam2_0_, users0_.user_name as user_nam3_0_
// from t_user users0_ where users0_.user_name=? and users0_.user_id=?
Users usersByUserIdEquals = this.dao.findUsersByUserIdEquals(1);//Equals ==sql中的 ==
// select users0_.user_id as user_id1_0_, users0_.real_name as real_nam2_0_, users0_.user_name as user_nam3_0_
// from t_user users0_ where users0_.user_id=?
List<Users> usersList = this.dao.findByRealNameIs("成龙1"); //后缀Is 对应着 sql中的 ==
// select users0_.user_id as user_id1_0_, users0_.real_name as real_nam2_0_, users0_.user_name as user_nam3_0_
// from t_user users0_ where users0_.real_name=?
List<Users> usersList1 = this.dao.findByUserNameOrUserIdIs("admin-jpa", 2);
//select users0_.user_id as user_id1_0_, users0_.real_name as real_nam2_0_, users0_.user_name as user_nam3_0_
// from t_user users0_ where users0_.user_name=? or users0_.user_id=?
List<Users> usersList2 = this.dao.findUsersByRealNameOrAndUserIdIn("测试", Arrays.asList(1, 2));
//select users0_.user_id as user_id1_0_, users0_.real_name as real_nam2_0_, users0_.user_name as user_nam3_0_
// from t_user users0_ where users0_.real_name=? or users0_.user_id in (? , ?)
Users byUserId = this.dao.findByUserId(1);
// select users0_.user_id as user_id1_0_, users0_.real_name as real_nam2_0_, users0_.user_name as user_nam3_0_
// from t_user users0_ where users0_.user_id=?
List<Users> byUserIdLessThan = this.dao.findByUserIdLessThan(10);
// select users0_.user_id as user_id1_0_, users0_.real_name as real_nam2_0_, users0_.user_name as user_nam3_0_
// from t_user users0_ where users0_.user_id<?
List<Users> byUserIdLessThanEqual = this.dao.findByUserIdLessThanEqual(10);
// select users0_.user_id as user_id1_0_, users0_.real_name as real_nam2_0_, users0_.user_name as user_nam3_0_
// from t_user users0_ where users0_.user_id<=?
List<Users> byUserIdGreaterThanEqual = dao.findByUserIdGreaterThanEqual(10);
// select users0_.user_id as user_id1_0_, users0_.real_name as real_nam2_0_, users0_.user_name as user_nam3_0_
// from t_user users0_ where users0_.user_id>=?
List<Users> byRealNameIsNull = dao.findByRealNameIsNull();
// select users0_.user_id as user_id1_0_, users0_.real_name as real_nam2_0_, users0_.user_name as user_nam3_0_
// from t_user users0_ where users0_.real_name is null
List<Users> byUserNameIsNotNull = dao.findByUserNameIsNotNull();
// select users0_.user_id as user_id1_0_, users0_.real_name as real_nam2_0_, users0_.user_name as user_nam3_0_
// from t_user users0_ where users0_.user_name is not null
}}