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企業應用實戰》,感謝作者無償奉獻程式碼及其視訊,特別收益。