spring jpa集成依赖的环境准备及实体类仓库编写教程

网友投稿 310 2022-08-18


spring jpa集成依赖的环境准备及实体类仓库编写教程

目录一、SpringBoot集成Hibernate JPA的依赖二、环境准备1.配置文件2.创建data.sql和schema.sql三、实体类四、编写仓库1.代码编写2.CRUD基础操作3.稍微复杂操作4.更复杂一点的操作

一、SpringBoot集成Hibernate JPA的依赖

compile(

//hibernate

'org.springframework.boot:spring-boot-starter-data-jpa',

'org.hibernate:hibernate-java8',

'mysql:mysql-connector-java',

//springmvc

'org.springframework.boot:spring-boot-starter-web',

"com.fasterxml.jackson.datatype:jackson-datatype-jsr310",

"com.kingboy:common:$commonVersion"

)

二、环境准备

1.配置文件

server:

port: 8080

spring:

application:

name: kingboy-springboot-data

datasource:

driver-class-name: com.mysql.jdbc.Driver

url: jdbc:mysql:///jpa?useUnicode=true&characterEncoding=utf-8&useSSL=false

username: root

password: 123456

schema: classpath:shema.sql

data: classpath:data.sql

jpa:

hibernate:

ddl-auto: none

2.创建data.sql和schema.sql

scheme.sql:建表语句,我没有使用hibernate的建表

CREATE TABLE IF NOT EXISTS `user` (

`id` bigint(20) NOT NULL,

`age` int(11) DEFAULT NULL,

`birth` datetime DEFAULT NULL,

`password` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,

`realname` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,

`username` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

data.sql:一些假数据,每次重启清空重新插入

DELETE FROM `user`;

INSERT INTO `user`

VALUES

('1', '56', '2016-09-12 12:12:00', 'king123', '小明', 'boy'),

('2', '12', '1993-08-12 07:12:00', 'king123', '小南', 'kingboy'),

('3', '11', '1992-05-12 23:12:00', 'king123', '小孩', 'boyking'),

('4', '2', '2006-12-13 20:12:00', 'king123', '金子', 'kiboy'),

('5', '66', '2012-09-12 05:12:00', 'king123', '哈喽小金', 'baby'),

('6', '12', '2000-02-13 06:12:00', 'king123', 'Baby', 'xiaohong'),

('7', '24', '2017-12-12 11:12:00', 'king123', '小金', 'king');

三、实体类

@Entity

public class User {

@Id

private Long id;

private String username;

private String realname;

private String password;

private Integer age;

@JsonFormat(pattern = "yyyy-MM-dd HH:mm")

private LocalDateTime birth;

//Setter Getter ...

}

四、编写仓库

1.代码编写

写一个类继承JpaRepository,需要写两个泛型,第一个代表要存储的实体类型,第二个代表主键类型,例如写一个User类的仓储如下:

public interface UserRepository extends JpaRepository {

}

我们来看一下JpaRepository的继承结构(如下),其实就可以发现仍然是JPA的一套Reposiroty,那我们其实就可以用JPA的一套接口操作进行数据的增删改查,spring会自动根据方法名为我们生成对应的代理类去实现这些方法。

2.CRUD基础操作

先来看看JpaRepository已经实现的一些基础方法,这些方法的名称已经具有很好的说明解释了,那么大家自己看看,很容易就能理解

3.稍微复杂操作

jpa自带的这些方法肯定是不能满足我们的业务需求的,那么我们如何自定义方法呢?我们只要使用特定的单词对方法名进行定义,那么Spring就会对我们写的方法名进行解析,生成对应的实例进行数据处理,有木有很简单?那么接下来就使用Spring官方文档中的实例进行演示。

先来看下官方关键字的说明

逻辑操作在定义方法时使用的关键词ANDAndOROrAFTERAfter , IsAfterBEFOREBefore , IsBeforeCONTAININGContaining , IsContaining , ContainsBETWEENBetween , IsBetweenENDING_WITHEndingWith , IsEndingWith , EndsWithEXISTSExistsFALSEFalse , IsFalseGREATER_THANGreaterThan , IsGreaterThanGREATER_THAN_EQUALSGreaterThanEqual , IsGreaterThanEqualINIn , IsInISIs , Equals , (or no keyword)IS_EMPTYIsEmpty , EmptyIS_NOT_EMPTYIsNotEmpty , NotEmptyIS_NOT_NULLNotNull , IsNotNullIS_NULLNull , IsNullLESS_THANLessThan , IsLessThanLESS_THAN_EQUALLessThanEqual , IsLessThanEqualLIKELike , IsLikeNEARNear , IsNearNOTNot , IsNotNOT_INNotIn , IsNotInNOT_LIKENotLike , IsNotLikeREGEXRegex , MatchesRegex , MatchesSTARTING_WITHStartingWith , IsStartingWith , StartsWithTRUETrue , IsTrueWITHINWithin , IsWithin

举几个方法的栗子:

使用示例说明findByNameAndPrice(String name,Double price)根据用户名和价格进行查询findByNameOrPrice(String name,Double price)根据用户名或者价格进行查询findByName(String name)根据用户名进行查找findByNameNot(String name)查找用户名!=name的用户findByPriceBetween(Double a, Double b)查询价格区间findByPriceLessThan(Double price)查询价格小于price,不包含pricefindByPriceGreaterThan(Double price)查询价格大于price,不包含pricefindByPriceBefore(Double price)查询价格小于price,包含pricefindByPriceAfterDouble price查询价格大于price,包含pricefindByNameLike(String name)根据用户名查询??????这个我实验了下,是完全匹配查询,并没有模糊查询findByNameStartingWith(String name)用户名以name开头的用户findByNameEndingWith(String name)用户名以name结尾的用户findByNameContaining(String name)用户名包含name的用户,相当于sql中的like %name%findByNameIn(Collectionnames)查询用户名在名称列表的用户findByNameNotIn(Collectionnames)查询用户名不在名称列表的用户findByAvailableTrue查询avaliable属性为true的用户findByAvailableFalse查询avaliable属性为false的用户findByAvailableTrueOrderByNameDesc()查询avaliable属性为true的用户,并按用户名排序

如果需要分页功能的话,只需要在方法的最后一个参数加上Pageable就可以了,下面的示例中有演示

下面写几个示例进行演示,只把仓储层的列出来了,整体运行是测试过的,没问题,如果需要整体代码请到本文顶部的github仓库查看。

public interface UserRepository extends JpaRepository {

/**

* 查询用户名为username的用户

* @param username

* @return

*/

List findByUsername(String username);

/**

* 查询用户名为username的用户,带分页

* @param username

* @return

*/

List findByUsername(String username, Pageable pageable);

/**

* 查询用户名为username并且真实姓名为realname的用户

* @param username

* @param realname

*/

LidCVDvEst findByUsernameAndRealname(String username, String realname);

/**

* 查询用户名为username或者姓名为realname的用户

*/

List findByUsernameOrRealname(String username, String realname);

/**

* 查询用户名不是username的所有用户

* @param username

* @return

*/

List findByUsernameNot(String username);

/**

* 查询年龄段为ageFrom到ageTo的用户

* @param ageFrom

* @param ageTo

* @return

*/

List findByAgeBetween(Integer ageFrom, Integer ageTo);

/**

* 查询生日小于birthTo的用户

*/

List findByBirthLessThan(LocalDateTime birthTo);

/**

* 查询生日段大于birthFrom的用户

* @param birthFrom

* @return

*/

List findByBirthGreaterThan(LocalDateTime birthFrom);

/**

* 查询年龄小于或等于ageTo的用户

*/

List findByAgeBefore(Integer ageTo);

/**

* 查询年龄大于或等于ageFrom的用户

* @param ageFrom

* @return

*/

List findByAgeAfter(Integer ageFrom);

/**

* 用户名模糊查询

* @param username

* @return

*/

List<User> findByUsernameLike(String username);

/**

* 查询以start开头的用户

* @param start

* @return

*/

List findByUsernameStartingWith(String start);

/**

* 查询以end结尾的用户

* @return

*/

List findByUsernameEndingWith(String end);

/**

* 查询用户名包含word的用户

* @param word

* @return

*/

List findByUsernameContaining(String word);

/**

* 查询名字属于usernames中的用户

* @param usernames

* @return

*/

List findByUsernameIn(Collection usernames);

/**

* 查询名字不属于usernames中的用户

* @param usernames

* @return

*/

List findByUsernameNotIn(Collection usernames);

/**

*最后来个复杂点的:查询年龄小于ageTo,姓名以start开头,id大于idTo的用户,并且按照年龄倒序

* @return

*/

List findByAgeBeforeAndUsernameStartingWithAndIdGreaterThanOrderByAgeDesc(Integer ageTo, String start, Long idTo);

}

4.更复杂一点的操作

我们可以使用@Query注解进行查询,这样要求我们自己写查询语句,需要会hqlS查询才可以,其实也很简单,不会写查就是了。

注意:hql的方式仍然可以在参数最后一个加Pageable进行分页,但是nativeQuery不可以。

publhttp://ic interface BookRepository extends ElasticsearchRepository {

/**

* 使用@Query和hql进行查询

* @param name

* @return

*/

@Query("from User where username = :name")

List findByNameHQL(@Param(value = "name") String name, Pageable pageable);

/**

* 使用原生sql进行查询

* @param name

* @return

*/

@Query(value = "select * from user where username = :name", nativeQuery = true)

List findByNameNative(@Param(value = "name") String name);

}

5.这种通过接口方法的方式也可以进行联表查询,以后有机会再补充

以上就是spring jpa集成依赖的环境准备及实体类仓库编写教程的详细内容,更多关于spring jpa集成环境实体类仓库编写教程的资料请关注我们其它相关文章!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java 细致图解带你分析汉诺塔
下一篇:深入浅出分析Java 类和对象
相关文章

 发表评论

暂时没有评论,来抢沙发吧~