springboot中JPA的应用
1.JPA
JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据。他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate,TopLink,JDO等ORM框架各自为营的局面。值得注意的是,JPA是在充分吸收了现有Hibernate,TopLink,JDO等ORM框架的基础上发展而来的,具有易于使用,伸缩性强等优点。JPA是一套规范,不是一套产品,那么像Hibernate,TopLink,JDO他们是一套产品,如果说这些产品实现了这个JPA规范,那么我们就可以叫他们为JPA的实现产品。
2.项目搭建
本文采用IDEA搭建Spring Boot的JPA应用,Demo结构图如下:
3.具体实现
(1)配置文件
- pom.xml里加入spring-boot-starter-data-jpa以及mysql-connector-java的依赖,如下所示。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency>
- application.yml里加入hibernate、jpa的配置,以及返回json对日期字段的特殊处理配置,注意time-zone的设置,须与mysql的url配置一致,否则会引起时间相差8小时的问题。jpa里的show-sql作用,如果设置为true,执行程序后可以看在控制台里看到sql语句,如下所示。
spring:
profiles:
active: product
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/saascrm?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
username: root
password: snail123
jpa:
hibernate:
ddl-auto: update
show-sql: true
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: UTC
(2)分层
为了区别各个模块,为项目建立几个包:controller、Entity、respository、service,这是典型的MVC架构,各个层次的代表意义在此不再赘述。
(3)Respository层
spring data jpa让我们解脱了DAO层的操作,基本上所有CRUD都可以依赖于它来实现,需要实现JpaRepository接口
public interface UserRepository extends JpaRepository<UserInfo,Long> {
}
(4)Entity层
定义了用户信息表实体UserInfo,通过Hibernate与数据库形成映射关系,如下:
@Entity
@Component
public class UserInfo {
public UserInfo() {
}
@Id
@GeneratedValue
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getJobNumber() {
return jobNumber;
}
public void setJobNumber(String jobNumber) {
this.jobNumber = jobNumber;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
private Long id; //ID
private String name; //姓名
private String jobNumber; //工号
private Date createTime; //创建时间
}
(5)service层
定义了服务层接口以及服务层接口实现类,如下:
- UserService.java
public interface UserService {
List<UserInfo> getUserList();
UserInfo getUserByName(String name);
UserInfo addUserInfo(UserInfo userInfo);
UserInfo updateUserInfoById(UserInfo userInfo);
void deleteUserInfoById(Long Id);
List<UserInfo>getCurrentUserList();
Page<UserInfo> getPageUserList();
}
- UserServiceImpl.java
其中涉及单表的增删改查,还有分页查询等
@Service
public class UserServiceImpl implements UserService{
@Autowired
private UserRepository userRepository;
/**
* 获取所有用户列表
* @return
*/
public List<UserInfo> getUserList(){
List<UserInfo> userList=new ArrayList<UserInfo>();
userList=userRepository.findAll();
return userList;
}
/**
* 通过姓名获取用户信息
* @param name 用户姓名
* @return
*/
public UserInfo getUserByName(String name) {
return userRepository.findByName(name);
}
/**
* 新增用户信息
* @param userInfo 用户信息
* @return
*/
public UserInfo addUserInfo(UserInfo userInfo) {
return userRepository.save(userInfo);
}
/**
* 更新用户信息
* @param userInfo 用户信息
* @return
*/
public UserInfo updateUserInfoById(UserInfo userInfo) {
return userRepository.save(userInfo);
}
/**
* 删除用户信息
* @param id 主键Id
*/
public void deleteUserInfoById(Long id) {
userRepository.delete(id);
}
/**
* 获取最新的用户
* @return
*/
public List<UserInfo> getCurrentUserList() {
Sort sort=new Sort(Sort.Direction.DESC,"createTime");
return userRepository.findAll(sort);
}
/**
* 获取分页的用户
* @return
*/
public Page<UserInfo> getPageUserList() {
Sort sort=new Sort(Sort.Direction.DESC,"createTime");
Pageable pageable=new PageRequest(0,5,sort);
return userRepository.findAll(pageable);
}
}
(6)Controller层
其中,日期格式需要做转换,在需要日期转换的Controller中使用SpringMVC的注解@initbinder和Spring自带的WebDateBinder类来操作。WebDataBinder是用来绑定请求参数到指定的属性编辑器.由于前台传到controller里的值是String类型的,当往Model里Set这个值的时候,如果set的这个属性是个对象,Spring就会去找到对应的editor进行转换,然后再SET进去。
@RestController
@RequestMapping(value = "/test")
public class TestController {
@Autowired
private UserInfo userInfo;
@Resource
private UserService userService;
/**
* 获取所有用户
* @return
*/
@GetMapping(value = "/getUserList")
public List<UserInfo> getUserList() {
return userService.getUserList();
}
@GetMapping(value = "/getUserInfo")
public UserInfo getUserInfoByName(@RequestParam("name") String name) {
return userService.getUserByName(name);
}
@GetMapping(value = "/getCurrentUserList")
public List<UserInfo> getCurrentUserList(){
return userService.getCurrentUserList();
}
@GetMapping(value="/getPageUserList")
public Page<UserInfo> getPageUserList(){
return userService.getPageUserList();
}
@PutMapping(value = "/addUserInfo")
public UserInfo addUserInfo(UserInfo userInfo) {
return userService.addUserInfo(userInfo);
}
@PostMapping(value ="/updateUserInfo")
public UserInfo updateUserInfo(UserInfo userInfo){
return userService.updateUserInfoById(userInfo);
}
@PostMapping(value="/deleteUserInfo")
public void deleteUserInfo(@RequestParam("id") Long id){
userService.deleteUserInfoById(id);
}
@InitBinder
protected void init(HttpServletRequest request, ServletRequestDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));/*TimeZone时区,解决差8小时的问题*/
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
}
Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。
springboot中JPA的应用的更多相关文章
- SpringBoot中JPA的学习
SpringBoot中JPA的学习 准备环境和项目配置 写一下学习JPA的过程,主要是结合之前SpringBoot + Vue的项目和网上的博客学习一下. 首先,需要配置一下maven文件,有这么两个 ...
- SpringBoot 中 JPA 的使用
详细连接 简书https://www.jianshu.com/p/c14640b63653 新建项目,增加依赖 在 Intellij IDEA 里面新建一个空的 SpringBoot 项目.具体步骤参 ...
- SpringBoot中JPA使用动态SQL查询
https://www.jianshu.com/p/f72d82e90948 可以重点关注方法二,把原生sql传入数据库去查询 好处是:更加灵活坏处是:拼接sql比较痛苦,也容易出问题,比如拼接的sq ...
- SpringBoot中JPA,返回List排序
这里简单示例,利用query,根据“createtime”字段,进行 desc 排序,最近日期的数据在最前面. public List<StatusEvent> findAll(Speci ...
- SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法
软件152 尹以操 首先谢谢大佬的简书文章:http://www.jianshu.com/p/45ad65690e33# 这篇文章中讲的是spring中使用spring data jpa,使用了xml ...
- Spring Data JPA系列2:SpringBoot集成JPA详细教程,快速在项目中熟练使用JPA
大家好,又见面了. 这是Spring Data JPA系列的第2篇,在上一篇<Spring Data JPA系列1:JDBC.ORM.JPA.Spring Data JPA,傻傻分不清楚?给你个 ...
- 【极简版】SpringBoot+SpringData JPA 管理系统
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 在上一篇中已经讲解了如何从零搭建一个SpringBo ...
- 带你搭一个SpringBoot+SpringData JPA的环境
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 不知道大家对SpringBoot和Spring Da ...
- 二、springboot使用jpa
花了几天时间,好好看了看springboot的jpa部分,总结了常用的形式. 1.通过STS工具添加jpa的依赖项 要连mysql,测试的时候需要web,顺便添加了lombok不写set和get方法了 ...
随机推荐
- alias 创建别名
在我们的"/home/用户名/"的目录下,会有一个“.bashrc”文件,修改步骤如下: 在文件的末尾添加: alias 想要的别名=文件路径(文件路劲加引号)例如:alias p ...
- golang 查看代码调用关系图
go-callvis 是github上一个开源项目,可以用来查看golang代码调用关系. 安装 安装graphviz $ brew install graphviz 安装go-callvis go ...
- MapReduce案例:统计共同好友+订单表多表合并+求每个订单中最贵的商品
案例三: 统计共同好友 任务需求: 如下的文本, A:B,C,D,F,E,OB:A,C,E,KC:F,A,D,ID:A,E,F,LE:B,C,D,M,LF:A,B,C,D,E,O,MG:A,C,D,E ...
- Linux tee命令详解
Linux tee命令 Linux tee命令用于读取标准输入的数据,并将其内容输出成文件.如果文件指定为"-",则将输入内容复制到标准输出 tee指令会从标准输入设备读取数据,将 ...
- [转]Python中yield的解释
转自: http://python.jobbole.com/83610/ 本文作者: 伯乐在线 - wklken .未经作者许可,禁止转载!欢迎加入伯乐在线 专栏作者. 翻译 来源于stackover ...
- 大数据时代——为什么用HADOOP?
转载自:http://www.daniubiji.cn/archives/538 什么叫大数据 “大”,说的并不仅是数据的“多”!不能用数据到了多少TB ,多少PB 来说. 对于大数据,可以用四个词来 ...
- MySQL5.7(5.6)GTID环境下恢复从库思路方法(转发)
要讨论如何恢复从库,我们得先来了解如下一些概念: GTID_EXECUTED:它是一组包含已经记录在二进制日志文件中的事务集合 GTID_PURGED:它是一组包含已经从二进制日志删除掉的事务集合. ...
- CentOS 7下NFS Server作rootfs时的兼容性问题
最近新装CentOS 7,发现原先CentOS 6.3下可用的一块ARM Dev board不能用了,表现为VFS mount挂载rootfs失败. 使用WireShark发现,服务器对client发 ...
- 【idea】之取消@param注释参数错误提示
改为
- 【NIO】之IO和NIO的区别
在Java1.4之前的版本,Java对I/O的支持并不完善,开发人员在开发高性能I/O程序的时候,会面临以下几个问题: 1.没有数据缓存区,I/O性能存在问题 2.没有C/C++通道的概念,输入和输出 ...