之前打算把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功底,如果开发经验不足可以放到后面一点进行学习。