spring boot 学习手册
  • 介绍
  • 基础教程
    • 1.RESTfull API简单项目的快速搭建
    • 2.配置文件详解:Properties和YAML
    • 3.配置文件-多环境配置
    • 4.日志配置-logback和log4j2
  • web应用开发
    • 1.模板引擎
    • 2.模板引擎FreeMarker
    • 3.模板引擎Thymeleaf
    • 4.模板引擎jsp
    • 5.错误处理
    • 6.Servlets, Filters, listeners
    • 7.CORS支持
    • 8.文件上传
    • 9.Interceptor拦截器
    • 10.AOP统一处理Web请求日志
    • 11.全局统一异常处理
    • 12. Retry重试
    • 13.RestTemplate
  • 关系型数据库
    • 1.JdbcTemplate
    • 2.Spring-data-jpa
      • @Id 和 @GeneratedValue 详解
      • 配置与注解备注
      • 全局统一前缀策略
      • 映射关系详解
      • 查询、分页、排序
      • JPA 资料
      • 进阶:jpa自定义行为方法
      • 进阶:锁
      • 进阶:Hibernate Validator
    • 3.事务处理
  • NoSQL数据库
    • 1.Redis
    • 2.Mongodb
  • Cache
    • 1.EhCache
    • 2.Redis
  • 异步消息服务
    • 1.JMS(ActiveMQ)
    • 2.AMQP(RabbitMQ)
  • Mybatis
    • Mybatis 初使用
    • Mybatis环境搭建
    • Mybatis开发流程
    • 业务开发流程
    • Mybatis资料
  • 进阶
    • 1.调用REST服务-使用代理
    • 2.发送邮件
    • 3.Spring Session实现集群-redis
    • 4.如何进行远程调试
    • 5.生产准备-基于HTTP的监控
    • 6.Spring Boot集成mybatis
    • 7.Spring Boot集成Druid
    • 8.Spring Boot集成Swagger
    • 9.生产部署-注意事项和如何使用脚本
  • 升华
    • Jenkins部署Spring Boot
    • 异步处理Http请求
    • FastDFS
    • Docker
    • 定时任务(corn job)
    • 批处理
    • @Async实现异步调用
  • 单元测试
    • WireMock伪造服务
  • 安全
    • 1.Spring Security
      • 认证
    • 2.Apache Shiro
  • TaskExecutor 异步线程池
  • 其他
    • 1.修改启动时显示
    • 2.获取配置文件中的值
    • 3.嵌入式容器
    • 4.配置SSL
    • 5.websocket
    • 6.Spring IO Platform
  • RESTfull API 开发
  • 附录:Eclipse - Spring Tool Suite工具的安装
  • 附录:Eclipse部署Maven
  • 附录:SpringBoot相关模块
  • 附录:注解笔记
  • 资料
  • 开发技巧
  • maven插件
Powered by GitBook
On this page
  • 一、 配置数据源:
  • 二、 Jpa 配置
  • 三、具体过程
  • 四、 扩展进行自定义的查询
  • 资料

Was this helpful?

  1. 关系型数据库

2.Spring-data-jpa

Previous1.JdbcTemplateNext@Id 和 @GeneratedValue 详解

Last updated 6 years ago

Was this helpful?

Spring Data JPA特点:

高效

可迁移(顶层语句封装)

标准(java官方标准)

采用jdbc方式写的语句有些繁琐,jpa又做了很好的封装

jpa 处在Domain和Respository层

一、 配置数据源:

pom.xml 文件中加入依赖配置

<!-- 数据库 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

可以发现jpa仍然依赖jdbc包

配置mysql

application.properties文件中,可以参考多环境配置根据不同环境配置不同的库

spring.datasource.url=jdbc:mysql://localhost/demodb?useUnicode=true&characterEncoding=utf-8

spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

二、 Jpa 配置

application.properties文件中,可以参考多环境配置根据不同环境配置不同的库

# JPA
spring.jpa.hibernate.ddl-auto=update

#显示 sql 语句
spring.jpa.show-sql=true

三、具体过程

选中的为需要开发文件

1.实体类

bean/DemoUserLog.java

package com.shuju.test2.bean;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import java.util.Date;

@Entity
public class DemoUserLog {

    @Id
    @GeneratedValue
    private Integer id;

    @Column
    private Date createTime;

    @Column
    private String userName;

    @Column
    private String userIp;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserIp() {
        return userIp;
    }

    public void setUserIp(String userIp) {
        this.userIp = userIp;
    }

    @Override
    public String toString() {
        return "RoncooUserLog [id=" + id + ", createTime=" + createTime + ", userName=" + userName + ", userIp=" + userIp + "]";
    }
}

2.定义接口(继承 JpaRepository)

dao/DemoUserLogDao.java

这里继承了JpaRepository,里面封装了一些操作,只需要定义接口,无需写实现类,就可以实现Repository这一层大部分操作

<DemoUserLog, Integer> 泛型,第一个是域对象,也就是需要操作的表对象,第二个是主键的数据类型

package com.shuju.test2.dao;

import com.shuju.test2.bean.DemoUserLog;
import org.springframework.data.jpa.repository.JpaRepository;

public interface DemoUserLogDao extends JpaRepository<DemoUserLog, Integer> {

}

3.测试

package com.shuju.test2;

import com.shuju.test2.bean.DemoUserLog;
import com.shuju.test2.dao.DemoUserLogDao;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.Date;

@RunWith(SpringRunner.class)
@SpringBootTest
public class Test2ApplicationTests {

    @Autowired
    private DemoUserLogDao demoUserLogDao;

    @Test
    public void insert() {
        DemoUserLog entity = new DemoUserLog();
        entity.setUserName("无境");
        entity.setUserIp("192.168.0.1");
        entity.setCreateTime(new Date());
        demoUserLogDao.save(entity);
    }


    @Test
    public void delete() {
        demoUserLogDao.deleteById(2);
    }


    @Test
    public void update() {

        DemoUserLog entity = new DemoUserLog();
        entity.setId(2);
        entity.setUserName("无境 2");
        entity.setUserIp("192.168.0.1");
        entity.setCreateTime(new Date());
        demoUserLogDao.save(entity);
    }


    @Test
    public void select() {
        DemoUserLog result = demoUserLogDao.findById(1).get();
        System.out.println(result);
    }
}

注意有可能因为版本问题jpa方法有所改变。

四、 扩展进行自定义的查询

1.使用内置的关键词查询

如果内置的不能满足,可以使用使用自定义语句查询

2.使用自定义语句查询各种语法,具体查看

这个优先级比第一点的高

@Query(value = "select u from DemoUserLog u where u.userName=?1")

具体示例:

同时实现分页

修改接口文件:dao/DemoUserLogDao.java

import com.shuju.test2.bean.DemoUserLog;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

import java.util.List;

public interface DemoUserLogDao extends JpaRepository<DemoUserLog, Integer> {
    /**
     * @param userName
     * @return
     */
    @Query(value = "select u from DemoUserLog u where u.userName=?1")
    List<DemoUserLog> findByUserName(String userName);

    /**
     * @param string
     * @param string2
     * @return
     */
    List<DemoUserLog> findByUserNameAndUserIp(String string, String string2);

    /**
     * @param userName
     * @param pageable
     * @return
     */
    Page<DemoUserLog> findByUserName(String userName, Pageable pageable);

}

修改测试类

package com.shuju.test2;

import com.shuju.test2.bean.DemoUserLog;
import com.shuju.test2.dao.DemoUserLogDao;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.Date;
import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
public class Test2ApplicationTests {

    @Autowired
    private DemoUserLogDao demoUserLogDao;

    @Test
    public void insert() {
        DemoUserLog entity = new DemoUserLog();
        entity.setUserName("无境");
        entity.setUserIp("192.168.0.1");
        entity.setCreateTime(new Date());
        demoUserLogDao.save(entity);
    }


    @Test
    public void delete() {
        demoUserLogDao.deleteById(2);
    }


    @Test
    public void update() {

        DemoUserLog entity = new DemoUserLog();
        entity.setId(2);
        entity.setUserName("无境 2");
        entity.setUserIp("192.168.0.1");
        entity.setCreateTime(new Date());
        demoUserLogDao.save(entity);
    }


    @Test
    public void select() {
        DemoUserLog result = demoUserLogDao.findById(1).get();
        System.out.println(result);
    }

    @Test
    public void select2() {
        List<DemoUserLog> result = demoUserLogDao.findByUserName("无境");
        System.out.println(result);
    }

    @Test
    public void select3() {
        List<DemoUserLog> result = demoUserLogDao.findByUserNameAndUserIp("无境", "192.168.0.1");
        System.out.println(result);
    }

    // 分页
    @Test
    public void queryForPage() {
        Pageable pageable = new PageRequest.of(0, 20, new Sort(new Sort.Order(Direction.DESC, "id")));
        Page<DemoUserLog> result = demoUserLogDao.findByUserName("无境", pageable);
        System.out.println(result.getContent());
    }

}

资料

http://docs.spring.io/spring-data/jpa/docs/1.10.2.RELEASE/reference/html/
http://docs.spring.io/spring-data/jpa/docs/1.10.2.RELEASE/reference/html/
spring boot 中使用 jpa以及jpa介绍
SpringBoot关于SpringDataJpa中findOne()方法报错问题
springboot(五):spring data jpa的使用
springboot+jpa+thymeleaf增删改查示例