1. 程式人生 > >springboot操作資料庫總結(流程圖+程式碼)

springboot操作資料庫總結(流程圖+程式碼)

       springboot提供了很多種操作資料庫的方式,大致思路都差別不大,只是使用的一些細節存在差異。

1.JpaRepository

    spring data有一個分支為spring data JPA,是專門針對JPA操作資料庫的模組。下圖是官方網站:

    裡面封裝了大量的核心庫,比如 JpaRepository,我們只需要進行繼承介面使用就行,不用對介面進行實現,直接就可以使用增刪改查等操作,使用起來超級方便。下圖為執行流程:

程式碼:

controller:

@RequestMapping("/getById")
public User getById(Integer id) {
		return crudService.getById(id);
}

service: 

public User getById(Integer id) {
Optional<User> f=resitory.findById(id);
		return f.get();
}

 Resitory:

public interface Resitory extends JpaRepository<User, Integer>{

}

注:這裡是寫的程式碼是很簡答的,裡面的方法是封裝好的方法,故在Resitory看似沒有執行邏輯。實際上,如果我使用的方法,在裡面不存在,那麼還是需要寫抽象方法的,只不過,我們還是不用去寫實現,比如模糊查詢,只需要在方法後面加Like,系統是可以辨別是進行模糊查詢的,因為內部有其識別機制。再比如多條件查詢,可以加And,And後面的首字母要大寫。

模糊查詢:

Resitory層:

public interface Resitory extends JpaRepository<User, Integer>{
	List<User> findByUserNameLike(String userName);
}

多條件查詢:

Resitory層:

public interface Resitory extends JpaRepository<User, Integer>{
	List<User> findByUserNameAndPassword(String userName, String password);
}

 

2.PagingAndSortingRepository

    分頁查詢下,顧名思義,就是講資料庫內容進行分頁顯示,顯示在不同的頁面上。

 程式碼:

service:

public List<User> sort() {
		Sort sort=new Sort(Direction.DESC,"id");
		return (List<User>) resitory.findAll(sort);
	}
public Page<User> page(Integer pageindex) {
		Sort sort=new Sort(Direction.DESC,"id");
		PageRequest pageable=PageRequest.of(pageindex-1, 2,sort);
		return resitory.findAll(pageable);
	}

 

3.Query查詢

上面的查詢都是單表查詢,我們在現實中,操作的表多為多表,使用Query註解進行查詢,操作十分方便。

程式碼:

Resitory層:

public interface StudentRepository extends JpaRepository<Student, Integer>{
	@Query("select c.name from Clazz c inner join c.students s "
			+ "where s.name = ?1 ")
	String getClazzByStuName(String name);
}

 

4.NamedQuery查詢

NamedQuery查詢查詢與Query查詢幾乎一致的,只是註解的位置不同。

程式碼:

domian:

@NamedQuery(name="Student.getStuByClazzName",
            query="select s from Student s where s.clazz.name like ?1")
public class Student implements Serializable{

........................這裡的程式碼省略了

}

 

5.Specification動態查詢

    動態查詢的思路也是蠻好理解,因為是動態查詢所以需要提供能提供的條件,供使用者可以進行隨意組合,達到“動態”的目的,這裡的動態實際上可以理解為“靈活使用”。因此,我們需要在業務層停供儘可能提供的條件,每一個條件都要分為有(存在這個條件)或者無(不存在這個條件),因為我們可能不會使用或者使用這個條件,所以需要進行非空判斷,然後具體到Specification來說,就是進行具體類似sql的java邏輯實現。具體的執行過程如下:

程式碼:

service層:

List<Student> students = 
	studentRepository.findAll(new Specification<Student>() {

@Override
public Predicate toPredicate(Root<Student> root,
	CriteriaQuery<?> query, CriteriaBuilder cb) {
	List<Predicate> predicates = new ArrayList<Predicate>(); 
	if (student!=null) {	
	if(!StringUtils.isEmpty(student.getName())){
	predicates.add(cb.like(root.<String> get("name"),
					"%" + student.getName() + "%"));
}
							
	if(!StringUtils.isEmpty(student.getAddress())){
	predicates.add(cb.like(root.<String> get("address"),
				 "%" + student.getAddress() + "%"));
}
							
	if(student.getSex() != '\0'){
	predicates.add(cb.equal(root.<String> get("sex"),
					student.getSex()));
}
							
	if(student.getClazz()!=null && !StringUtils.
	 isEmpty(student.getClazz().getName())){
	root.join("clazz", JoinType.INNER);
	predicates.add(cb.like(root.get("clazz").get("name"), 
				"%"+student.getClazz().getName()+"%"));
}
							
}
	return query.where(predicates.toArray
(new Predicate[predicates.size()])).getRestriction();
}										
});

這裡只是使用的java代替的sql語句,將條件全部封裝在predicates中,然後查詢(query.where())的時候進行組裝成完整的sql

6.JDBCTemplate

    雖然我們使用hibernate的全自動操作用起來很爽,但是畢竟hibernate會產生大量冗餘的sql語句,導致系統的效能會受到影響,故springboot提供了一個我們自己寫SQL的jdbc的template,使用起來更加靈活一些。具體的執行過程如下:

 程式碼:

(這裡只寫插入操作,其餘操作類似,程式碼只給了repository層的,因為其他層比較簡單)

Repository層:

@Repository
public class UserRepository {
	@Resource
	private JdbcTemplate jdbcTemplate;
	public int insertUser(){
		String sql = "insert into tb_user(login_name ,user_name ,password) "
				+ "values (?,?,?),(?,?,?),(?,?,?)";
		Object[] args = new Object[]{"zgl","諸葛亮","123","smy","司馬懿","456"
				,"sq","孫權","789"};
		return jdbcTemplate.update(sql, args);
	}
}

 application.properties:

# url
spring.datasource.url=jdbc:mysql://localhost:3306/jdbctemplate
# username
spring.datasource.username=root
# password
spring.datasource.password=
# driver
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

新增的pom依賴:

<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

7.整合mybatis

   使用註解做的時候,用法與@query方法一致,都是在Resitory層加帶sql的註解,若使用mappering檔案,只是不加註解,其他使用都一致。

 

 

宣告:本文的內容主要借鑑的資料《SpringBoot2企業應用實戰》,感謝作者無償奉獻程式碼及其視訊,特別收益。