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

来源:互联网 发布:ktv手机点歌软件 编辑:程序博客网 时间:2024/06/07 19:32

环境配置介绍

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;@MappedSuperclasspublic 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")@Datapublic 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;@Repositorypublic 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 jpaspring.jpa.database=MYSQLspring.datasource.username=rootspring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.password=123456spring.datasource.url=jdbc:mysql://localhost:3306/world?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=truespring.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)@SpringBootTestpublic class CustomjpaApplicationTests {    @Autowired    private CityRepository cityRepo;    @Test    public void contextLoads() {        City city = cityRepo.findOne(1l);        System.out.println("city=>" + city);        cityRepo.testAA();    }}

测试的结果图示:
这里写图片描述

总结

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

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果手机打不开流量怎么办 苹果6流量打不开怎么办 苹果笔记本电脑打不开软件怎么办 苹果软件蜂窝打不开怎么办 苹果手机wifi打不开怎么办 苹果app变成韩语怎么办 ipad键盘变成英文怎么办 苹果8商店打不开怎么办 苹果手机不能下载怎么办 天猫魔盒遥控器丢了怎么办 电视盒子声音小怎么办 宽带los亮红灯怎么办 猫的lan灯不亮怎么办 光猫los灯不亮怎么办 移动宽带红灯亮怎么办 ie打不开网页怎么办win10 win10系统ie打不开怎么办 笔记本电脑玩lol卡怎么办 火狐浏览器电脑版打不开怎么办 手机淘宝没密码怎么办 实体店不让退货怎么办 出生公证双认证怎么办 手机淘宝网速慢怎么办 淘宝开店认证不通过怎么办 开网店不会做图怎么办 库乐队上传错误怎么办 淘宝定金不退怎么办 淘宝店激活认证怎么办 淘宝店铺不卖怎么办 唯品会不支持退换货怎么办 pr里面的aep怎么办 开淘宝骗了怎么办 平板ipad已停用怎么办 ipad2卡 反应慢怎么办 无法弹出淘口令怎么办? ipad账户被禁用怎么办 ipad账号被锁定怎么办 苹果平板停用了怎么办 pad忘记id密码怎么办 京东实名开小差怎么办 路由器信号太强怎么办