1. 程式人生 > 其它 >Spring Data Jpa 基本使用

Spring Data Jpa 基本使用

前言:

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);
		}
	}
}
無論風雨,和自己一決勝負吧