SpringBoot开发案例之整合Spring-data-jpa

什么是spring-data

为了简化程序与数据库交互的代码,spring提供了一个现成的dao层框架,spring家族提供的spring-data适用于关系型数据库和nosql数据库

什么是jpa

JPA全称为Java持久性API(Java Persistence API),JPA是java EE 5标准之一,是一个ORM规范,由厂商来实现该规范,目前有hibernate、OpenJPA、TopLink、EclipseJPA等实现。

如何使用JPA

查询

  • 查询所有数据 findAll()
  • 分页查询 findAll(new PageRequest(0, 2))
  • 根据id查询 findOne()
  • 根据实体类属性查询: findByProperty (type Property); 例如:findByAge(int age);
  • 排序: findAll(sort )
  • Sort sort = new Sort(Sort.Direction.DESC, "age").and (new Sort(Sort.Direction.DESC, "id"));
  • 条件查询 and/or/findByAgeLessThan/LessThanEqual 等,
  • 例如: findByUsernameAndPassword(String username , String password)
  • 总数 查询 count() 或者 根据某个属性的值查询总数countByAge(int age);
  • 是否存在某个id exists()

修改,删除,新增

  • 新增:直接使用 save(T) 方法
  • 删除: delete() 或者 deleteByProperty 例如:deleteByAge(int age) ;
  • 更新:
    @Modifying 
    @Query("update Customer u set u.age = ?1 where u.id = ?2")
    int update(int age1 , long id);

项目结构

spring_data_jpa

相关配置

pom.xml(部分代码,详见源码):

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

application.properties:

# 项目contextPath
server.context-path=/jpa
# 服务端口
server.port=8080
# session最大超时时间(分钟),默认为30
server.session-timeout=60
# 该服务绑定IP地址,启动服务器时如本机不是该IP地址则抛出异常启动失败,只有特殊需求的情况下才配置
#server.address=192.168.1.66# tomcat最大线程数,默认为200
server.tomcat.max-threads=100
# tomcat的URI编码
server.tomcat.uri-encoding=UTF-8#注意中文乱码
spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# Specify the DBMS
spring.jpa.database = MYSQL
# Show or not log for each sql query
spring.jpa.show-sql = true
# DDL mode. This is actually a shortcut for the "hibernate.hbm2ddl.auto" property. Default to "create-drop" when using an embedded database, "none" otherwise.
spring.jpa.hibernate.ddl-auto = update
# Hibernate 4 naming strategy fully qualified name. Not supported with Hibernate 5.
spring.jpa.hibernate.naming.strategy = org.hibernate.cfg.ImprovedNamingStrategy
# stripped before adding them to the entity manager)
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

spring.jpa.properties.hibernate.hbm2ddl.auto是hibernate的配置属性,其主要作用是:自动创建、更新、验证数据库表结构。该参数的几种配置如下:

  • create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
  • create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
  • update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。
  • validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

实体类 User.java:

package com.itstyle.jpa.model;
import java.io.Serializable;
import javax.persistence.*;
/*** 用户实体(此处注意引用的注解包为javax.persistence*下面的)* 创建者 科帮网* 创建时间    2017年7月25日**/
@Entity
@Table(name = "sys_user")
public class User implements Serializable{private static final long serialVersionUID = 1L;@Id@GeneratedValue(strategy = GenerationType.AUTO)@Column(name = "id", nullable = false)private Long id;@Column(nullable = false, name = "name")private String name;@Column(nullable = false, name = "age")private Integer age;--- 省略 get set 方法
}

数据操作UserRepository.java:

/*** 数据操作层* 创建者 科帮网* 创建时间    2017年7月25日**/
public interface UserRepository extends JpaRepository<User, Long> {User findByName(String name);User findByAge(Integer age);User findByNameAndAge(String name, Integer age);List<User> findByNameLike(String name);@Query("from User u where u.name=:name")User findUser(@Param("name") String name);}

小伙伴没有没有发现,我们只是定义了一个方法而已,怎么就这么奇妙的实现的对应功能?其实这是Spring-data-jpa的新特性,通过解析方法名创建查询。更多解析说明如下:

And => 等价于 SQL 中的 and 关键字 例如:findByUsernameAndPassword(String user, Striang pwd);
Or => 等价于 SQL 中的 or 关键字,例如:findByUsernameOrAddress(String user, String addr);
Between => 等价于 SQL 中的 between 关键字,例如:SalaryBetween(int max, int min);
LessThan => 等价于 SQL 中的 "<",例如: findBySalaryLessThan(int max);
GreaterThan => 等价于 SQL 中的">",例如: findBySalaryGreaterThan(int min);
IsNull => 等价于 SQL 中的 "is null",例如: findByUsernameIsNull();
IsNotNull => 等价于 SQL 中的 "is not null",例如: findByUsernameIsNotNull();
NotNull=> 与 IsNotNull 等价;
Like => 等价于 SQL 中的 "like",例如: findByUsernameLike(String user);
NotLike => 等价于 SQL 中的 "not like",例如: findByUsernameNotLike(String user);
OrderBy => 等价于 SQL 中的 "order by",例如: findByUsernameOrderBySalaryAsc(String user);
Not => 等价于 SQL 中的 "! =",例如: findByUsernameNot(String user);
In => 等价于 SQL 中的 "in",例如: findByUsernameIn(Collection userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数;
NotIn => 等价于 SQL 中的 "not in",例如: findByUsernameNotIn(Collection userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数;
创建一个按单字段排序的Sort对象: new Sort(Sort.Direction.DESC, "description").and(new Sort(Sort.Direction.ASC, "id"))

最终测试类SpringbootJpaApplication.java:

package com.itstyle.jpa;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;import com.itstyle.jpa.model.User;
import com.itstyle.jpa.repository.UserRepository;@SpringBootApplication
public class SpringbootJpaApplication implements CommandLineRunner {@Autowiredprivate UserRepository userRepository;public static void main(String[] args) {SpringApplication.run(SpringbootJpaApplication.class, args);}@Overridepublic void run(String... args) throws Exception {try {User user = new User();user.setName("张三");user.setAge(20);userRepository.save(user);List<User> u = userRepository.findByNameLike("%张三%");System.out.println(u.size());User  us =  userRepository.findByAge(20);System.out.println(us.getAge());us =  userRepository.findByName("这是你干");} catch (Exception e) {e.printStackTrace();}}
}

偶遇问题

No identifier specified for entity:

检查一下包是否引入正确,引入一下:

import javax.persistence.*;

中文乱码问题:

spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8

在高版本mysql中需要指定是否进行SSL连接

spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&useSSL=false

代码:https://git.oschina.net/52itstyle/spring-data-jpa

作者: 小柒

出处: https://blog.52itstyle.com

转载于:https://www.cnblogs.com/walblog/articles/9483296.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465249.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

细说路由器

介绍以太网交换机工作在第二层即数据链路层&#xff0c;用于在同一网络内部转发以太网帧。但是&#xff0c;当源和目的IP地址位于不同网络时&#xff0c;以太网帧必须发送给路由器。路由器负责在不同网络间传输报文&#xff0c;通过路由表来决定最佳转发路径。当主机将报文发送…

时隔一年俺又回来了..

今年很不顺啊。。。各个方面。。。也有顺的。。。还是在平安做项目。。。私人项目有J2EE/PHP等&#xff0c;由于开发效率等问题&#xff0c;最后还是换上.NET。。批下JAVA。。开发效率太TMD低了。。不得不换。。。哈哈。。总的来说俺回来了。。今后更关注安全和嵌入式行业。。。…

java 动态转换器,Java 编程的动态性,第 5 部分: 动态转换类

Java 编程的动态性&#xff0c;第 5 部分: 动态转换类在经过一段时间的休息之后&#xff0c;Dennis Sosnoski 又回来推出了他的Java 编程的动态性系列的第 5 部分。您已在前面的文章中看到了如何编写用于转换 Java 类文件以改变代码行为的程序。在本期中&#xff0c;Dennis将展…

乔布斯,影响了一个时代的人

2011年10月5日&#xff0c;苹果公司的创始人史蒂夫乔布斯&#xff0c;因患胰腺神经内分泌肿瘤病逝&#xff0c;享年56岁&#xff0c;一代传奇人物&#xff0c;与世长辞乔布斯被认为是计算机业界与娱乐业界的标志性人物&#xff0c;同时人们也把他视作麦金塔计算机、iPod、iPhon…

考试能帮助我什么?

我毕业三年&#xff0c;毕业于师范计算机系&#xff0c;游走了两年的时间&#xff0c;做专业相关的工作&#xff0c;两次更换工作是感觉以后没有多大的攻势&#xff0c;处于一种服务低端用户的格局&#xff0c;作为我依然心高气盛的&#xff0c;总想着自个的人生辉煌、庞大&…

C++ 版本ORM访问数据库之ODB访问oracle的Demo(三)

ODB的组成部分: 1: 操作系统的ODB编译器 2: odb核心库libodb 3: 各种数据库的相关链接库 使用ODB访问数据需要的库和头文件(不懂, 请看https://www.cnblogs.com/hul201610101100/p/9482311.html): lib库: odb-oracle-d.lib, odb-d.lib (由libodb-oracle-2.4.0编译成功后产生的l…

在8080端口输出php的输出,端口8080上的PHP错误

我安装了Apaache并配置为侦听端口8080已经使用过PHP runner&#xff0c;并将其放在/ apache24 / htdocs下的htdocs文件夹中当我浏览网站locahost&#xff1a;8085时&#xff0c;它工作正常但是当我浏览网站localhost&#xff1a;8080时&#xff0c;它显示下面的错误我想在安装和…

平均年薪60.8万,Linux开发拿下这个证书有多吃香?

互联网行业竞争一年比一年严峻&#xff0c;随着互联网的发展和进步&#xff0c;很多人都是想要进军到编程行业中去&#xff0c;作为工程师的我们唯有不停地学习&#xff0c;不断的提升自己才能保证自己的核心竞争力&#xff0c;打破内卷。从而拿到更好的薪水&#xff0c;进入心…

Linux新手必须掌握的命令(2)

一、输入输出重定向 输入重定向是指把文件导入到命令中&#xff0c;而输出重定向则是指把原本要输出到屏幕的数据信息写入到指定文件中。 在日常的学习和工作中&#xff0c;相较于输入重定向&#xff0c;我们使用输出重定向的频率更高。 所以又将输出重定向分为了标准输出重定向…

极限编程与敏捷开发(4)

解决方案一&#xff1a; 下面图1是一种最简单的解决方案&#xff0c;Switch对象可以轮询真实开关的状态&#xff0c;并且可以发送相应的turnOn和turnOff消息给Light。 图1解决方案二&#xff1a; 上面这个设计违反了两个设计原则&#xff1a;依赖倒置原则(DIP)和开放封闭原则(O…

mm1 matlab,(高质)MM1排队系统仿真matlab实验报告.doc

M/M/1排队系统实验报告一、实验目的本次实验要求实现M/M/1单窗口无限排队系统的系统仿真&#xff0c;利用事件调度法实现离散事件系统仿真&#xff0c;并统计平均队列长度以及平均等待时间等值&#xff0c;以与理论分析结果进行对比。二、实验原理根据排队论的知识我们知道&…

虚拟机四种网络连接模式比较

虚拟机一直用&#xff0c;但选择网络时的四种模式总是搞不清楚&#xff0c;只知道选择bridge最好用。为了能更深入了了解&#xff0c;查询了些资料&#xff0c;总结如下 第一种 NAT模式 Vhost访问网络的所有数据都是由主机提供的&#xff0c;vhost并不真实存在于网络中&#xf…

CPU加了缓存后,有人急了~

Hi&#xff0c;我是CPU一号车间的阿Q&#xff0c;还记得我吗&#xff0c;真是好久不见了&#xff5e;我所在的CPU是一个八核CPU&#xff0c;就有八个工作车间&#xff0c;那运行起来速度杠杆的&#xff5e;虚拟地址翻译一大早&#xff0c;我们一号车间MMU&#xff08;内存管理单…

redis -- 学习

redis 安装 就不细说了。 可以看这个 地址 https://www.cnblogs.com/feijl/p/6879929.html 配置完成之后 连接不上redis 如果报错守护模式 解决办法 1.修改redis配置 redis.conf 守护模式不启用 如下 2.第二种 启动redis后 设置密码 先查看是否设置了 config get requirepass…

一个学妹写的按键检测函数把我秀翻了!

摘要&#xff1a;今年实验室来了三个学妹&#xff0c;其中一个学妹以前是物联网专业的&#xff0c;进了实验室老师二话没说&#xff1a;先把STM32单片机过一遍上来第一个例程就是使用按键点亮一个LED灯&#xff0c;好家伙。点灯小师弟比较在行&#xff0c;毕竟32、FPGA、Linux的…

java请求servlet,[Java]Servlet发送Post请求

演示实例&#xff1a;AServlet发送一个Student对象到BServlet#### 1.AServlet部分首先造一个学生stu&#xff0c;然后通过fastjson的toJSONString方法把对象转换成字符串&#xff0c;再通过MyHttpUtils的sendPost方法把数据发送到BServlet核心部分是MyHttpUtils类&#xff0c;还…

活动选择

D14554. 活动选择 时间限制&#xff1a;1.0s 内存限制&#xff1a;256.0MB 代码提交间隔&#xff1a;1分钟(现在可以提交) 输入文件名&#xff1a;test.in 输出文件名&#xff1a;test.out 问题描述 假设有一个需要使用某一资源的n个活动组成的集合S&#xff0c;S&…

怎样安装联想慧盾

1.如果是刚买的新计算机里面什么都没有&#xff0c;必须要有联想慧盾盘&#xff0e;&#xff12;.在启动时&#xff0c;按&#xff26;&#xff14;键进行安装&#xff0c;按F10键进行卸载&#xff0e;&#xff13;.联想慧盾安装过程&#xff1a;T1 200000G NTFS 902(暂…

我爸开车撞人

国庆收假回来的最后一天&#xff0c;我哥给我发消息&#xff0c;给我发了个视频&#xff0c;里面里面有一辆救护车&#xff0c;救护车在呼呼呼的发出声音。然后我以为是我哥出了什么事&#xff0c;就打电话过去&#xff0c;我哥着急的说&#xff0c;是爸妈开车撞人了。之后我打…

Adobe CTO:Android将超预期获50%份额

Adobe首席技术官凯文•林奇近日在《财富》杂志的采访中表达了他对Android操作系统的看法和期望。按照官凯文•林奇的预测&#xff0c;Android将超过业界的预期&#xff0c;在未来半年内将其智能手机份额提升至50%。Adobe凯文•林奇表示&#xff0c;苹果iPhone和黑莓手机的市场份…