浅谈Spring Data JPA的使用

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-data-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 {

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

波波老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值