Spring Data Jpa 基本使用
阿新 • • 發佈:2021-12-21
前言:
Spring Data JPA 是 spring data 專案下的一個模組。提供了一套基於 JPA標準操作資料庫的簡化方案。底層預設的是依賴 Hibernate JPA 來實現的。
一、建立Spring Data Jpa專案
1、匯入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
2、配置資料來源資訊
spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useSSL=false spring.datasource.username=root spring.datasource.password=tianya spring.jpa.hibernate.ddl-auto=none spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect server.port=8010 logging.level.org.springframework=error #spring.jpa.generate-ddl= spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true spring.jpa.properties.hibernate.type=trace spring.jpa.properties.hibernate.use_sql_comments=true spring.jpa.properties.hibernate.jdbc.batch_size=50 logging.level.org.hibernate.type.descriptor.sql=trace
3、編寫Dao層
public interface UsersDao extends JpaRepository<Users, Integer> {}
4、User
@Entity @Table(name="t_users") public class Users implements Serializable{ @Id @GeneratedValue(strategy=GenerationType.IDENTITY)//strategy=GenerationType.IDENTITY 自增長 @Column(name="userid") private Integer userid; @Column(name="username") private String username; @Column(name="userage") private Integer userage; 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 Integer getUserage() { return userage; } public void setUserage(Integer userage) { this.userage = userage; } @Override public String toString() { return "Users [userid=" + userid + ", username=" + username + ", userage=" + userage + "]"; } }
5、編寫測試程式碼
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class UsersDaoImplTest {
@Autowired
private UsersDao usersDao;
/**
* 新增使用者
*/
@Test
@Transactional// 在測試類對於事務提交方式預設的是回滾。
@Rollback(false)//取消自動回滾
public void testInsertUsers(){
Users users = new Users();
users.setUserage(24);
users.setUsername("張三");
this.usersDao.save(users);
}
}
二、Spring Data Jpa 介面繼承結構
三、Spring Data Jpa 執行原理
@PersistenceContext(name="entityManagerFactory")
private EntityManager em;
@Test
public void test1(){
//org.springframework.data.jpa.repository.support.SimpleJpaRepositor y@fba8bf
//System.out.println(this.usersDao);
//class com.sun.proxy.$Proxy29 代理物件 是基於 JDK 的動態代理方式建立的
//System.out.println(this.usersDao.getClass());
JpaRepositoryFactory factory = new JpaRepositoryFactory(em);
//getRepository(UsersDao.class);可以幫助我們為介面生成實現類。而 這個實現類是 SimpleJpaRepository 的物件
//要求:該介面必須要是繼承 Repository 介面
UsersDao ud = factory.getRepository(UsersDao.class);
System.out.println(ud);
System.out.println(ud.getClass());
}
四、Repository 介面
Repository 介面是 Spring Data JPA 中為我我們提供的所有介面中的頂層介面 Repository 提供了兩種查詢方式的支援
1)基於方法名稱命名規則查詢
2)基於@Query 註解查詢
1、方法命名規則查詢
規則:
findBy(關鍵字)+屬性名稱(屬性名稱的首字母大寫)+查詢條件(首字母大寫)
關鍵字 | 方法命名 | sql where 字句 |
---|---|---|
And | findByNameAndPwd | where name= ? and pwd =? |
Or | findByNameOrSex | where name= ? or sex=? |
Is,Equal | findById, | findByIdEquals |
Between | findByIdBetween | where id between ? and ? |
LessThan | findByIdLessThan | where id < ? |
LessThanEqual | findByIdLessThanEquals | where id <= ? |
GreaterThan | findByIdGreaterThan | where id > ? |
GreaterThanEqual | findByIdGreaterThanEquals | where id > = ? |
After | findByIdAfter | where id > ? |
Before | findByIdBefore | where id < ? |
IsNull | findByNameIsNull | where name is null |
isNotNull,Not Null | findByNameNotNull | where name is not |
Like | findByNameLike | where name like ? |
NotLike | findByNameNotLike | where name not like ? |
StartingWith | findByNameStartingWith | where name like '?%' |
EndingWith | findByNameEndingWith | where name like '%?' |
Containing | findByNameContaining | where name like '%?%' |
OrderBy | findByIdOrderByXDesc | where id=? order by x desc |
Not | findByNameNot | where name <> ? |
In | findByIdIn(Collection<?> c) | where id in (?) |
NotIn | findByIdNotIn(Collection<?> c) | where id not in (?) |
True | findByAaaTue | where aaa = true |
False | findByAaaFalse | where aaa = false |
IgnoreCase | findByNameIgnoreCase | where UPPER(name)=UPPER(?) |
建立介面
/**
* Repository介面講解
* @author Administrator
*
*/
public interface UsersDao extends Repository<Users, Integer> {
//方法名稱命名規則
List<Users> findByUsernameIs(String string);
List<Users> findByUsernameLike(String string);
List<Users> findByUsernameAndUserageGreaterThanEqual(String name,Integer age);
}
測試類
/**
* Repository介面測試
* @author Administrator
*
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class RepositoryTest {
@Autowired
private UsersDao usersDao;
/**
* 需求:使用使用者名稱作為查詢條件
*/
@Test
public void test1(){
/**
* 判斷相等的條件,有三種表示方式
* 1,什麼都不寫,預設的就是做相等判斷
* 2,Is
* 3,Equal
*/
List<Users> list = this.usersDao.findByUsernameIs("王五");
for (Users users : list) {
System.out.println(users);
}
}
/**
* 需求:根據使用者姓名做Like處理
* Like:條件關鍵字
*/
@Test
public void test2(){
List<Users> list = this.usersDao.findByUsernameLike("王%");
for (Users users : list) {
System.out.println(users);
}
}
/**
* 需求:查詢名稱為王五,並且他的年齡大於等於22歲
*/
@Test
public void test3(){
List<Users> list = this.usersDao.findByUsernameAndUserageGreaterThanEqual("王五", 22);
for (Users users : list) {
System.out.println(users);
}
}
}
2、基於@Query註解查詢
JPQL:
通過 Hibernate 的 HQL 演變過來的。他和 HQL 語法及其相似。
建立介面
/**
* Repository介面講解
* @author Administrator
*
*/
public interface UsersDao extends Repository<Users, Integer> {
//使用@Query註解查詢
@Query(value="from Users where username = ?")
List<Users> queryUserByNameUseJPQL(String name);
@Query("from Users where username like ?")
List<Users> queryUserByLikeNameUseJPQL(String name);
@Query("from Users where username = ? and userage >= ?")
List<Users> queryUserByNameAndAge(String name,Integer age);
}
測試類
/**
* Repository介面測試
* @author Administrator
*
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class RepositoryTest {
@Autowired
private UsersDao usersDao;
/**
* 測試@Query查詢 JPQL
*/
@Test
public void test4(){
List<Users> list = this.usersDao.queryUserByNameUseJPQL("王五");
for (Users users : list) {
System.out.println(users);
}
}
/**
* 測試@Query查詢 JPQL
*/
@Test
public void test5(){
List<Users> list = this.usersDao.queryUserByLikeNameUseJPQL("王%");
for (Users users : list) {
System.out.println(users);
}
}
/**
* 測試@Query查詢 JPQL
*/
@Test
public void test6(){
List<Users> list = this.usersDao.queryUserByNameAndAge("王五", 22);
for (Users users : list) {
System.out.println(users);
}
}
}
3、通過 SQL 語句查詢
/**
* Repository介面講解
* @author Administrator
*
*/
public interface UsersDao extends Repository<Users, Integer> {
//使用@Query註解查詢SQL
//nativeQuery:預設的是false.表示不開啟sql查詢。是否對value中的語句做轉義。
@Query(value="select * from t_users where username = ?",nativeQuery=true)
List<Users> queryUserByNameUseSQL(String name);
@Query(value="select * from t_users where username like ?",nativeQuery=true)
List<Users> queryUserByLikeNameUseSQL(String name);
@Query(value="select * from t_users where username = ? and userage >= ?",nativeQuery=true)
List<Users> queryUserByNameAndAgeUseSQL(String name,Integer age);
}
4、通過@Query 註解完成資料更新
/**
* Repository介面講解
* @author Administrator
*
*/
public interface UsersDao extends Repository<Users, Integer> {
@Query("update Users set userage = ? where userid = ?")
@Modifying //@Modifying當前語句是一個更新語句
void updateUserAgeById(Integer age,Integer id);
}
五、JpaRepository 介面
JpaRepository 介面是我們開發時使用的最多的介面。其特點是可以幫助我們將其他介面的方法的返回值做適配處理。可以使得我們在開發時更方便的使用這些方法。
1、建立介面
/**
* JpaRepository介面
* @author Administrator
*
*/
public interface UsersDao extends JpaRepository<Users, Integer>{
}
2、測試類
/**
* JpaRepository介面測試
* @author Administrator
*
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class RepositoryTest {
@Autowired
private UsersDao usersDao;
/**
* 查詢全部資料
*/
@Test
public void test1(){
List<Users> list = this.usersDao.findAll();
for (Users users : list) {
System.out.println(users);
}
}
}
無論風雨,和自己一決勝負吧