Spring和SpringDataJpa整合详解

Spring和SpringDataJpa整合详解

一、概述

SpringBoot操作数据库有多种方式,如

  • JDBC直接操作:太古老了,没人愿意这样玩

  • Mybatis插件:比较时髦,比较适合sql复杂,或者对性能要求高的应用,因为sql都是自己写的。

  • Spring-data-jpa: 使用hibernate作为实现,基本上不需要写sql,因为sql都是统一的,总是会产生多余的查询,性能上相对而言会低,但不绝对,影响性能的因素是多种的,这里说的性能是 从最终的查询的sql来对比的,毕竟生成的sql没有经过深思熟虑写出来的性能好。

  • JdbcTemplate:spring在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中。Spring-data-jpa引入的时候,JdbcTemplate必然会被引入的。

当然还有其他中间件,主流使用的就是Mybatis和Spring-data-jpa。

首发地址:

  • 品茗IT-同步发布

  • 品茗IT 提供在线支持:

  • 一键快速构建Spring项目工具

  • 一键快速构建SpringBoot项目工具

  • 一键快速构建SpringCloud项目工具

  • 一站式Springboot项目生成

如果大家正在寻找一个java的学习环境,或者在开发中遇到困难,可以加入我们的java学习圈,点击即可加入,共同学习,节约学习时间,减少很多在学习中遇到的难题。

二、环境配置

本文假设你已经引入Spring必备的一切了,已经是个Spring项目了,如果不会搭建,可以打开这篇文章看一看《Spring和Spring Mvc 5整合详解》。

2.1 maven依赖

使用Spring-data-jpa需要引入spring-data-jpa,因为是非Springboot项目,我们不能通过starter引入,需要引入spring-data-jpa、javax.transaction-api、hibernate-core。



    4.0.0
    
        cn.pomit
        SpringWork
        0.0.1-SNAPSHOT
    
    SpringDataJpa
    jar
    SpringDataJpa
    http://maven.apache.org
    
        
            org.springframework
            spring-web
        
        
            org.springframework
            spring-context
        
        
            org.springframework
            spring-orm
        
        
            mysql
            mysql-connector-java
        
        
            log4j
            log4j
        
        
            org.apache.commons
            commons-dbcp2
        
        
            org.springframework.data
            spring-data-jpa
            2.0.10.RELEASE
        
        
            javax.transaction
            javax.transaction-api
            1.2
        
        
            org.hibernate
            hibernate-core
            5.2.17.Final
            compile
            
                
                    jboss-transaction-api_1.2_spec
                    org.jboss.spec.javax.transaction
                
            
        
    
    
        SpringDataJpa
    


父模块可以在https://www.pomit.cn/spring/SpringWork/pom.xml获取。

2.2 Spring配置

需要配置数据源、jdbcTemplate、entityManagerFactory、transactionManager和jpa:repositories。




    
    
    

    
        
        
        
            
                classpath:db.properties
            
        
    


    
        
        
        
        

        
        
        

        
        
        
        
    

    
    
        
    

    
        
        
        
            
                
            
            
        
    
    
    
    
        
    
    
    

这里面,需要注意的是:

  • entityManagerFactory,是实体和数据库选择信息。

  • jpa:repositories,指明Spring-data-jpa的repositories地址。就是我们的数据库交互层。

  • transactionManager,事务处理器。

  • tx:annotation-driven:开启事务注解。

db.properties中存放数据库的地址端口等连接信息。

db.properties:

db.url=jdbc:mysql://127.0.0.1:3306/boot?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
db.username=cff
db.password=123456
db.dirverClass=com.mysql.cj.jdbc.Driver

三、数据访问Dao层

我们直接使用Spring-data-jpa, 一切都会变的特别简单。Spring-data-jpa支持快速查询,也支持@Query自定义查询,只需要新建接口继承JpaRepository或者CrudRepository等接口即可。

UserInfoDao :

package cn.pomit.springwork.springdatajpa.dao;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import cn.pomit.springwork.springdatajpa.domain.UserInfo;

@Repository
public interface UserInfoDao extends JpaRepository {
    UserInfo findByUserName(String userName);
}

注意加上@Repository注解。实体要加上@Entity和@Table注解。

四、测试业务逻辑

我们定义一个service和web接口来做测试。

UserInfoService :

package cn.pomit.springwork.springdatajpa.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import cn.pomit.springwork.springdatajpa.dao.UserInfoDao;
import cn.pomit.springwork.springdatajpa.domain.UserInfo;

@Service
public class UserInfoService {
    @Autowired
    UserInfoDao userInfoDao;
    public UserInfo getUserInfoByUserName(String userName){
        return userInfoDao.findByUserName(userName);
    }
}

SpringDataJpaRest:

package cn.pomit.springwork.springdatajpa.web;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import cn.pomit.springwork.springdatajpa.domain.UserInfo;
import cn.pomit.springwork.springdatajpa.service.UserInfoService;

@RestController
@RequestMapping("/springdatajpa")
public class SpringDataJpaRest {

    @Autowired
    UserInfoService userInfoService;
    
    @RequestMapping(value = "/test/{name}", method = { RequestMethod.GET })
    public UserInfo testMybatis(@PathVariable("name") String name) {
        return userInfoService.getUserInfoByUserName(name);
    }
}

五、过程中用到的实体

UserInfo:


详细完整的实体,可以访问品茗IT-博客《Spring和SpringDataJpa整合详解》进行查看

全部代码可以在Spring组件化构建https://www.pomit.cn/java/spring/spring.html中的SpringDataJpa组件中查看,并下载。

快速构建项目

Spring组件化构建

SpringBoot组件化构建

SpringCloud服务化构建

喜欢这篇文章么,喜欢就加入我们一起讨论Spring技术吧!


Spring和SpringDataJpa整合详解_第1张图片
品茗IT交流群

你可能感兴趣的:(Spring和SpringDataJpa整合详解)