当前位置: 移动技术网 > IT编程>开发语言>Java > Spring Boot下如何自定义Repository中的DAO方法

Spring Boot下如何自定义Repository中的DAO方法

2019年07月22日  | 移动技术网IT编程  | 我要评论

濮阳日报电子版,呼伦贝尔学院教务处,谁能百里挑一薛梅

 环境配置介绍

jdk 1.8, spring boot 1.5.3.release, mysql, spring data, jpa

问题描述

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

目标描述

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

数据库表的定义

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

数据库表定义:

这里写图片描述

import java.util.date;
import javax.persistence.column;
import javax.persistence.generatedvalue;
import javax.persistence.generationtype;
import javax.persistence.id;
import javax.persistence.mappedsuperclass;
import javax.persistence.temporal;
import javax.persistence.temporaltype;
import javax.persistence.version;
@mappedsuperclass
public abstract class baseentity implements java.io.serializable {
 private static final long serialversionuid = -2420979951576787924l;
 @id
 @generatedvalue(strategy=generationtype.identity)
 @column(name = "id")
 private long id;
 @version
 private long version;
 @temporal(temporaltype.timestamp)
 @column(name = "create_time",columndefinition="timestamp default current_timestamp")
 private date createtime;
 @temporal(temporaltype.timestamp)
 @column(name = "update_time",columndefinition="timestamp default current_timestamp on update current_timestamp")
 private date updatetime;
}

mycity的定义如下:

import javax.persistence.column;
import javax.persistence.entity;
import javax.persistence.table;
import lombok.data;
@entity
@table(name="mycity")
@data
public class city extends baseentity {
 private static final long serialversionuid = -7510771121759944670l;
 @column(name="name")
 private string name;
 @column(name="country_code")
 private string countrycode;
 @column
 private string district;
 @column
 private int population;
}

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

定义repository

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

import org.springframework.data.jpa.repository.jparepository;
import org.springframework.stereotype.repository;
import com.rose.money.city;
@repository
public interface cityrepository extends jparepository<city, long>, cityrepositorycustom{
}

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

public interface cityrepositorycustom {
 public void testaa();
}

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

自定义方法的实现类:

import java.util.list;
import javax.persistence.entitymanager;
import javax.persistence.persistencecontext;
import org.springframework.beans.factory.annotation.autowired;
public class cityrepositoryimpl implements cityrepositorycustom {
 @autowired
 @persistencecontext
 private entitymanager entitymanager;
 @override
 public void testaa() {
  list<object[]> cities = entitymanager.createnativequery("select id, name, district from mycity").getresultlist();
  for (object[] objs : cities) {
   system.out.print("location 1:" + objs[0]);
   system.out.print("location 2:" + objs[1]);
   system.out.print("location 3:" + objs[2]);
  }
 }
}

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

配置信息

application.properties:

spring.application.name=custom jpa
spring.jpa.database=mysql
spring.datasource.username=root
spring.datasource.driver-class-name=com.mysql.jdbc.driver
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/world?useunicode=true&characterencoding=utf-8&zerodatetimebehavior=converttonull&allowmultiqueries=true&usessl=true
spring.jpa.hibernate.naming.strategy=org.hibernate.cfg.improvednamingstrategy 
spring.jpa.show-sql=true

测试

测试用例:

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 com.rose.money.repository.cityrepository;
@runwith(springrunner.class)
@springboottest
public class customjpaapplicationtests {
 @autowired
 private cityrepository cityrepo;
 @test
 public void contextloads() {
  city city = cityrepo.findone(1l);
  system.out.println("city=>" + city);
  cityrepo.testaa();
 }
}

测试的结果图示:

这里写图片描述

总结

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

以上所述是小编给大家介绍的spring boot下如何自定义repository中的dao方法,希望对大家有所帮助

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网