1、jpa、spring data jpa、hibernate、spring data jdbc之間的關係
jpa是java提供持久化的一套規範,一套接口,而接口是需要實現才能工作的,而Hibernate就是實現了這套規範的orm框架
spirng data jpa是spring提供的一套簡化JPA開發的框架,按照約定好的【方法命名規則】寫dao層接口,就可以在不寫接口實現的情況下,實現對數據庫的訪問和操作。同時提供了很多除了CRUD之外的功能,如分頁、排序、複雜查詢等等。
Spring Data JPA 可以理解爲 JPA 規範的再次封裝抽象,底層還是使用了 Hibernate 的 JPA 技術實現
spring data jdbc和spring data jpa是同級關係
Spring Data 項目的目的是爲了簡化構建基於 Spring 框架應用的數據訪問計數,包括非關係數據庫、Map-Reduce 框架、雲數據服務等等;另外也包含對關係數據庫的訪問支持。
Spring Data 包含多個子項目:
- Commons - 提供共享的基礎框架,適合各個子項目使用,支持跨數據庫持久化
- Hadoop - 基於 Spring 的 Hadoop 作業配置和一個 POJO 編程模型的 MapReduce 作業
- Key-Value - 集成了 Redis 和 Riak ,提供多個常用場景下的簡單封裝
- Document - 集成文檔數據庫:CouchDB 和 MongoDB 並提供基本的配置映射和資料庫支持
- Graph - 集成 Neo4j 提供強大的基於 POJO 的編程模型
- Graph Roo AddOn - Roo support for Neo4j
- JDBC Extensions - 支持 Oracle RAD、高級隊列和高級數據類型
- JPA - 簡化創建 JPA 數據訪問層和跨存儲的持久層功能
- Mapping - 基於 Grails 的提供對象映射框架,支持不同的數據庫
- Examples - 示例程序、文檔和圖數據庫
-
Guidance - 高級文檔
2、spring data jdbc
<!-- maven依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
配置數據源:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springdata?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=ok
dao層代碼:
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import com.asiainfo.group.dao.UserDao;
@Repository
public class UserDaoImpl implements UserDao{
@Autowired
private JdbcTemplate JdbcTemplate;
@Override
public void listUser() {
List<Map<String, Object>> users = JdbcTemplate.queryForList("select * from user");
for (Map<String, Object> user : users) {
System.err.println(user.get("id"));
System.err.println(user.get("username"));
System.err.println(user.get("birthday"));
System.err.println(user.get("sex"));
}
}
}
3、spring data jpa
spring data jpa提供的接口
- Repository 接口
- CrudRepository 接口
- pagingAndSortingRepository 接口
- JpaRepository 接口
- JpaSpecificationExecutor 接口
這些接口的底層原理是JPA的規範EntityManager
配置文件:
spring.datasource.type = com.alibaba.druid.pool.DruidDataSource
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/springdata
spring.datasource.username = root
spring.datasource.password = ok
spring.jpa.hibernate.ddl-auto = none
spring.jpa.show-sql = true
實體類:
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="user")
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id")
private int id;
@Column(name="username")
private String username;
@Column(name="birthday",nullable=true)
private Date birthday;
@Column(name="sex")
private String sex;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
利用spring data jpa提供的接口方式
我們只用寫dao接口,不用寫實現類了,因爲會生成代理實現類
UserDao類:
import org.springframework.data.repository.CrudRepository;
import com.asiainfo.group.entity.User;
public interface UserDao extends CrudRepository<User, Integer>{
}
自定義方式
另外,也可以自定義BaseDao和BaseDaoImpl,實現類裏依賴注入EntityManager即可:
BaseDao類:
import java.io.Serializable;
public interface BaseDao<T,ID extends Serializable> {
void saveOrUpdate(T entity);
}
BaseDaoImpl類:
import java.io.Serializable;
import javax.persistence.EntityManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
@Transactional
@Repository
public class BaseDaoImpl<T, ID extends Serializable> implements BaseDao<T,ID>{
@Autowired
private EntityManager em;
@Override
public void saveOrUpdate(T entity) {
em.persist(entity);
}
}
UserDao類:
import com.asiainfo.group.entity.User;
public interface UserDao extends BaseDao<User,Integer>{
}
UserDaoImpl類:
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import com.asiainfo.group.entity.User;
@Repository("baseUserDao")
@Transactional
public class UserDaoImpl extends BaseDaoImpl<User,Integer> implements UserDao {
}