欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-15 10:08:58
 环境配置介绍 jdk 1.8, spring boot 1.5.3.release, mysql, spring data, jpa 问题描述 sprin...

 环境配置介绍

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

问题描述

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

目标描述

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

数据库表的定义

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

数据库表定义:

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

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();
 }
}

测试的结果图示:

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

总结

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

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