之前打算把Spring Data的整合放在前面給大家分享和交流,但實際操作的時候覺得這塊的知識雖然和之前的jpa有相似之處但用下來發現還是不一樣就找了Spring Data的視頻和資料學了一遍,就像之前說的學習Spring Boot需要懂得Spring體系的框架。
一 推薦使用的學習資料
尚硅谷系列教程:http://www.atguigu.com/download.shtml#springdata
教程講的還是比較詳細,基礎不要太差都能快速上手
二 依賴的引入
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
三 主配置文件配置
#DataBase DataSources
spring.datasource.url = jdbc:mysql://localhost:3306/springboot
spring.datasource.username = root
spring.datasource.password = 123456
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.max-active=20
spring.datasource.max-idle=8
spring.datasource.min-idle=8
spring.datasource.initial-size=10
# Specify the DBMS
spring.jpa.database = MYSQL
# Show or not log for each sql query
spring.jpa.show-sql = true
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update
# Naming strategy
#[org.hibernate.cfg.ImprovedNamingStrategy #org.hibernate.cfg.DefaultNamingStrategy]
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
# stripped before adding them to the entity manager)
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
四 接口和實體類
package com.debug.pojo;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="member")
public class Member {
private int id;
private String name;
private String address;
private int age;
private String phone;
private String email;
private Date birthday;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
Repository的寫法需要按照Spring data的標準規範來寫,可以使用SpringData的方法定義規範、註解@QUery(配合@Modifying)、以及Springdata提供的JpaRepository、CrudRepository等
package com.debug.dao;
import java.util.List;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.Repository;
import org.springframework.data.repository.query.Param;
import com.debug.pojo.Member;
public interface MemberRepository extends CrudRepository<Member,Integer>,JpaSpecificationExecutor<Member>{
//單條件精確查詢
public Member findById(int id);
//多條件精確查詢
public List<Member> getByAgeAndAddress(int age ,String address);
//模糊查詢1
public List<Member> readByNameLike(String name);
//模糊查詢2
public List<Member> readByNameStartingWith(String name);
//in查詢
//public List<Member> readByIdIn(List<Integer> ids);
public List<Member> readByIdIn(int[] ids);
//帶排序條件的in查詢
public List<Member> readByIdInOrderByIdDesc(int[] ids);
@Query("select m from Member m where m.name like %:name%")
public List<Member> getMemberInfoByName(@Param("name")String name);
@Query(value="select m.* from member m where m.name=:name and age>=30",nativeQuery=true)
public List<Member> getMemberInfoByNameAndAge(@Param("name")String name);
@Modifying
@Query("update Member m set m.name=:name where m.id=:id")
public void updateMemberById(@Param("name")String name,@Param("id")int id) ;
@Modifying
@Query("delete from Member m where m.id=:id")
public void deleteMemberById(@Param("id")int id) ;
}
五 service和controller
package com.debug.service;
import java.util.List;
import javax.annotation.Resource;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.domain.Sort.Order;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.debug.dao.MemberRepository;
import com.debug.pojo.Member;
@Service
public class MemberService {
@Resource
private MemberRepository memberRepository;
@Transactional(propagation=Propagation.REQUIRED)
public void updateMemberById(String name,int id) {
memberRepository.updateMemberById(name, id);
}
@Transactional(propagation=Propagation.REQUIRED)
public void deleteMemberById(int id) {
memberRepository.deleteMemberById( id);
}
public Member findById(int id) {
return memberRepository.findById(id);
}
public List<Member> readByIdInOrderByIdDesc(int[] ids){
return memberRepository.readByIdInOrderByIdDesc(ids);
}
public Page<Member> pagingAndSortingMember(int id){
Order o1=new Order(Direction.DESC,"id");
Sort sort=new Sort(o1);
PageRequest pg=new PageRequest(0,5,sort);
Specification<Member> sp=new Specification<Member>() {
public Predicate toPredicate(Root<Member> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
Path path=root.get("id");
Predicate p=builder.gt(path, id);
return p;
}
};
Page<Member> result=memberRepository.findAll(sp, pg);
/*System.out.println("總頁數"+result.getTotalPages());
System.out.println("總記錄數"+result.getTotalElements());
System.out.println("當前頁"+(result.getNumber()+1));
System.out.println("數據"+result.getContent());*/
return result;
}
}
service只是挑了幾個用到的方法,其他方法大家自己研究一下,都是體力活沒什麼難度
package com.debug.controller;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.debug.pojo.Member;
import com.debug.service.MemberService;
@RestController
@RequestMapping("/member")
public class MemberController {
@Resource
private MemberService memberService;
@RequestMapping("/findById")
public Member findById() {
Member m=memberService.findById(1);
return m;
}
@RequestMapping("/readByIdInOrderByIdDesc")
public List<Member> readByIdInOrderByIdDesc(){
int[] ids= {1,4,5};
return memberService.readByIdInOrderByIdDesc(ids);
}
@RequestMapping("/updateMemberById")
public String updateMemberById() {
memberService.updateMemberById("何潤東", 1);
return "數據修改成功";
}
@RequestMapping("/pagingAndSortingMember")
public Page<Member> pagingAndSortingMember(){
return memberService.pagingAndSortingMember(1);
}
}
至此Spring Data的開發學習交流就告一段落了,根據這段時間的學習總結得出這個技術還是比較適合有一定工作經驗的開發人員學習,要想學好Spring Boot需要紮實的Spring功底,如果開發經驗不足可以放到後面一點進行學習。