环境配置介绍

jdk 1.8, Spring Boot 1.5.3.RELEASE, Mysql, Spring Data, JPA

问题描述

Spring Data提供了一套简单易用的DAO层抽象与封装,覆盖的CURD的基本功能,但是在诸多的情况下,需要用户自定义DAO的实现方法,来实现更为复杂和精细的数据库访问操作,该如何来解决这个问题?

目标描述

这里我们以自定义testAA的方法为例,来介绍如何实现自定义的DAO方法扩展。

数据库表的定义

我们这里定义了一个非常简单的mycity表,来作为示例的实体类BaseEntity:

数据库表定义:

  1. import java.util.Date;
  2. import javax.persistence.Column;
  3. import javax.persistence.GeneratedValue;
  4. import javax.persistence.GenerationType;
  5. import javax.persistence.Id;
  6. import javax.persistence.MappedSuperclass;
  7. import javax.persistence.Temporal;
  8. import javax.persistence.TemporalType;
  9. import javax.persistence.Version;
  10. @MappedSuperclass
  11. public abstract class BaseEntity implements java.io.Serializable {
  12. private static final long serialVersionUID = -2420979951576787924L;
  13. @Id
  14. @GeneratedValue(strategy=GenerationType.IDENTITY)
  15. @Column(name = "ID")
  16. private Long id;
  17. @Version
  18. private Long version;
  19. @Temporal(TemporalType.TIMESTAMP)
  20. @Column(name = "CREATE_TIME",columnDefinition="timestamp default CURRENT_TIMESTAMP")
  21. private Date createTime;
  22. @Temporal(TemporalType.TIMESTAMP)
  23. @Column(name = "UPDATE_TIME",columnDefinition="timestamp default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
  24. private Date updateTime;
  25. }

MyCity的定义如下:

  1. import javax.persistence.Column;
  2. import javax.persistence.Entity;
  3. import javax.persistence.Table;
  4. import lombok.Data;
  5. @Entity
  6. @Table(name="mycity")
  7. @Data
  8. public class City extends BaseEntity {
  9. private static final long serialVersionUID = -7510771121759944670L;
  10. @Column(name="Name")
  11. private String name;
  12. @Column(name="country_code")
  13. private String countryCode;
  14. @Column
  15. private String district;
  16. @Column
  17. private int population;
  18. }

这里的@Data使用了lombok提供的强大标注,来简化冗余Getter/Setter方法的使用。

定义Repository

标准的CityRepository.java,这里完全使用缺省提供的方法:

  1. import org.springframework.data.jpa.repository.JpaRepository;
  2. import org.springframework.stereotype.Repository;
  3. import com.rose.money.City;
  4. @Repository
  5. public interface CityRepository extends JpaRepository<City, Long>, CityRepositoryCustom{
  6. }

这里的CityRepository继承了2个父类,包括用户自定义的接口类,让用户自定义的接口可以暴漏出来。

这里的CityRepsoitoryCustom定义了用户的自定义方法:

  1. public interface CityRepositoryCustom {
  2. public void testAA();
  3. }

Notice: 这里的Custom后缀是约定的,不能随意修改。

自定义方法的实现类:

  1. import java.util.List;
  2. import javax.persistence.EntityManager;
  3. import javax.persistence.PersistenceContext;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. public class CityRepositoryImpl implements CityRepositoryCustom {
  6. @Autowired
  7. @PersistenceContext
  8. private EntityManager entityManager;
  9. @Override
  10. public void testAA() {
  11. List<Object[]> cities = entityManager.createNativeQuery("select id, name, district from mycity").getResultList();
  12. for (Object[] objs : cities) {
  13. System.out.print("location 1:" + objs[0]);
  14. System.out.print("location 2:" + objs[1]);
  15. System.out.print("location 3:" + objs[2]);
  16. }
  17. }
  18. }

这里的实现类就是读取了几条记录,然后打印出来。其实现了Custom的接口类。

配置信息

application.properties:

  1. spring.application.name=custom jpa
  2. spring.jpa.database=MYSQL
  3. spring.datasource.username=root
  4. spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  5. spring.datasource.password=123456
  6. spring.datasource.url=jdbc:mysql://localhost:3306/world?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=true
  7. spring.jpa.hibernate.naming.strategy=org.hibernate.cfg.ImprovedNamingStrategy
  8. spring.jpa.show-sql=true

测试

测试用例:

  1. import org.junit.Test;
  2. import org.junit.runner.RunWith;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.boot.test.context.SpringBootTest;
  5. import org.springframework.test.context.junit4.SpringRunner;
  6. import com.rose.money.repository.CityRepository;
  7. @RunWith(SpringRunner.class)
  8. @SpringBootTest
  9. public class CustomjpaApplicationTests {
  10. @Autowired
  11. private CityRepository cityRepo;
  12. @Test
  13. public void contextLoads() {
  14. City city = cityRepo.findOne(1l);
  15. System.out.println("city=>" + city);
  16. cityRepo.testAA();
  17. }
  18. }

测试的结果图示:

总结

约定大于配置,Custom后缀实现与扩展,非常的简单实用。

Spring Boot下如何自定义Repository中的DAO方法的更多相关文章

  1. spring boot / cloud (四) 自定义线程池以及异步处理@Async

    spring boot / cloud (四) 自定义线程池以及异步处理@Async 前言 什么是线程池? 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线 ...

  2. spring boot下使用logback或log4j生成符合Logstash标准的JSON格式

    spring boot下使用logback或log4j生成符合Logstash标准的JSON格式 一.依赖 由于配置中使用了json格式的日志输出,所以需要引入如下依赖 "net.logst ...

  3. 转-Hive/Phoenix + Druid + JdbcTemplate 在 Spring Boot 下的整合

    Hive/Phoenix + Druid + JdbcTemplate 在 Spring Boot 下的整合 http://blog.csdn.net/balabalayi/article/detai ...

  4. Spring Boot下的一种导入Excel文件的代码框架

    1.前言 ​ Spring Boot下如果只是导入一个简单的Excel文件,是容易的.网上类似的文章不少,有的针对具体的实体类,代码可重用性不高:有的利用反射机制或自定义注解,开发了Excel导入工具 ...

  5. 200. Spring Boot JNDI:在Tomcat中怎么玩JNDI?

      [视频&交流平台] àSpringBoot视频:http://t.cn/R3QepWG à SpringCloud视频:http://t.cn/R3QeRZc à Spring Boot源 ...

  6. Spring Boot下Druid连接池+mybatis

      目前Spring Boot中默认支持的连接池有dbcp,dbcp2, hikari三种连接池.  引言: 在Spring Boot下默认提供了若干种可用的连接池,Druid来自于阿里系的一个开源连 ...

  7. Spring boot 自动配置自定义配置文件

    示例如下: 1.   新建 Maven 项目 properties 2.   pom.xml <project xmlns="http://maven.apache.org/POM/4 ...

  8. 【spring boot】10.spring boot下的单元测试

    spring boot下的单元测试,思前想后还是需要单独用一章篇幅来看看. 然后在看了介绍和使用时候,我感觉并不想多去看了. 但是还是给后来人留下参考的路径: 官网说明:https://spring. ...

  9. 【ActiveMQ】2.spring Boot下使用ActiveMQ

    在spring boot下使用ActiveMQ,需要一下几个条件 1.安装并启动了ActiveMQ,参考:http://www.cnblogs.com/sxdcgaq8080/p/7919489.ht ...

随机推荐

  1. 快速搭建vue脚手架

    https://segmentfault.com/a/1190000011275993

  2. 启动Django服务让其他电脑可访问

    1.修改 Django项目中的settings.py中的 ALLOWED_HOSTS 的值为 [*] # 准许那些地址访问,* 表示任意地址 ALLOWED_HOSTS = ['*'] # ALLOW ...

  3. window下rails4.1 发生TZInfo::DataSourceNotFound 错误

    在官网上学习rails 4.1 ,启动rails server之后发生了如下错误 $ rails serverBooting WEBrickRails 4.1.0 application starti ...

  4. Jsoup学习总结

    Jsoup学习总结 摘要 Jsoup是一款比较好的Java版HTML解析器.可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方 ...

  5. Linux系统服务管理 服务管理

    Linux独立服务管理 启动服务 systemctl start 服务名称.service 设置开机自启动 systemctl enable 服务名称.service 停止开机自启动 systemct ...

  6. RAID详解[RAID0/RAID1/RAID5]

    RAID(Redundant Array of Independent Disk 独立冗余磁盘阵列)技术是加州大学伯克利分校1987年提出,最初是为了组合小的廉价磁盘来代替大的昂贵磁盘,同时希望磁盘失 ...

  7. 毕业一年后的java面试总结

    前言  目前公司闲,没有新产品开发,都是一些维护工作,于是我提出了离职,开始了面试之路,抱着一个面试就是学习的心态去面试的,当然了,也是希望能拿到大公司的offer,大概面试了一个月左右的时间!!! ...

  8. 【Head First Servlets and JSP】笔记 25:JSTL 参考

    <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ t ...

  9. Sybase数据库:两个特别注意的地方

    Sybase数据库:两个特别注意的地方 一.字段别名 字段别名不能为查询条件中的列名,会导致查询出来的数据不准确:最好字段别名为非列名: 二.更新的表名的大小写 update a set .... s ...

  10. Linux下Mysql 操作命令

    Linux下Mysql 操作命令 一.连接MySQL 格式: mysql -h主机地址 -u用户名 -p用户密码 1.例1:连接到本机上的MYSQL. 首先在打开DOS窗口,然后进入目录 mysqlb ...