从.Net到Java学习第十二篇——SpringBoot+JPA提供跨域接口
最近又撸了半个月的前端代码,做app离线存储,然后又花了一周去将过去的wcf项目转webapi,java又被落下了,总感觉我特么像斗地主中的癞子牌,变来变去.....
Spring Data JPA 是Spring Data 的一个子项目,它通过提供基于JPA的Repository极大了减少了操作JPA的代码。我觉得它就是一个封装好了的泛型仓储。
点击JpaRepository进去看下它的源码:
@NoRepositoryBean
public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
List<T> findAll();
List<T> findAll(Sort var1);
List<T> findAll(Iterable<ID> var1);
<S extends T> List<S> save(Iterable<S> var1);
void flush();
<S extends T> S saveAndFlush(S var1);
void deleteInBatch(Iterable<T> var1);
void deleteAllInBatch();
T getOne(ID var1);
<S extends T> List<S> findAll(Example<S> var1);
<S extends T> List<S> findAll(Example<S> var1, Sort var2);
}
关于JPA的详细介绍请移步:spring boot 中使用 jpa以及jpa介绍
有了前面文章的基础之后,下面的操作就信手捏来了,所以就不做过多的解释。
这里用到了mysql数据库,先运行已经准备好mysql脚本,进行数据库初始化。
SET FOREIGN_KEY_CHECKS=0; -- ----------------------------
-- Table structure for `tb_book`
-- ----------------------------
DROP TABLE IF EXISTS `tb_book`;
CREATE TABLE `tb_book` (
`id` bigint(11) NOT NULL AUTO_INCREMENT,
`bookname` varchar(50) DEFAULT NULL COMMENT '书名',
`price` decimal(10,0) DEFAULT '' COMMENT '价格',
`author` varchar(30) DEFAULT NULL COMMENT '作者',
`publishdate` date DEFAULT NULL COMMENT '出版日期',
`pagesize` int(11) DEFAULT '' COMMENT '页数',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of tb_book
-- ----------------------------
INSERT INTO `tb_book` VALUES ('', 'ASP.NET MVC企业级实战', '', '邹琼俊', '2017-04-01', '');
INSERT INTO `tb_book` VALUES ('', 'Java疯狂讲义', '', '李阳', '2016-05-02', '');
修改pom.xml文件,添加jpa引用,当然这里用到了mysql数据库,那么还要添加mysql数据库引用
<!--jpa-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--集成druid,使用连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
修改配置文件application.yml,对数据库和jpa进行配置
spring:
profiles:
active: dev
datasource:
name: demo
url: jdbc:mysql://127.0.0.1:3306/demo?&useSSL=false
username: root
password: yujie
# 使用druid数据源
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
filters: stat
maxActive: 20
initialSize: 1
maxWait: 60000
minIdle: 1
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxOpenPreparedStatements: 20
jpa:
hibernate:
ddl-auto: update
show-sql: true
jackson:
serialization: true
创建实体类Book,创建包model,然后创建类Book,需要注意的是java中没有decimal类型,对,没错,一开始我习惯性的输入decimal,结果果断报错了,然后一查文档,发现要用BigDecimal。
package com.yujie.model; import javax.persistence.*;
import java.math.BigDecimal;
import java.util.Date; @Entity
@Table(name = "tb_book")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public long id;
public String bookname;
public BigDecimal price;
public String author;
public Date publishdate;
public int pagesize; public long getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getBookname() {
return bookname;
} public void setBookname(String bookname) {
this.bookname = bookname;
} public BigDecimal getPrice() {
return price;
} public void setPrice(BigDecimal price) {
this.price = price;
} public String getAuthor() {
return author;
} public void setAuthor(String author) {
this.author = author;
} public Date getPublishdate() {
return publishdate;
} public void setPublishdate(Date publishdate) {
this.publishdate = publishdate;
} public int getPagesize() {
return pagesize;
} public void setPagesize(int pagesize) {
this.pagesize = pagesize;
} @Override
public String toString() {
return "Book{" +
"id=" + id +
", bookname='" + bookname + '\'' +
", price=" + price +
", author='" + author + '\'' +
", publishdate=" + publishdate +
", pagesize=" + pagesize +
'}';
}
}
创建数据库访问接口IBookRepository,这里继承JPA封装的泛型接口JpaRepository
package com.yujie.dao; import com.yujie.model.Book;
import org.springframework.data.jpa.repository.JpaRepository; public interface IBookRepository extends JpaRepository<Book,Long> { }
创建控制器BookController,为了让这个控制器直接变成类似.net 中的webapi,我直接在控制器上面添加注解@RestController,这样返回的就是json数据了。
package com.yujie.controller; import com.yujie.dao.IBookRepository;
import com.yujie.model.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; @RestController
public class BookController {
@Autowired
private IBookRepository repository;
@GetMapping("/book/{id}")
public Book getBookDetail(@PathVariable("id") long id){
return repository.findOne(id);
}
}
添加跨域配置类CorsConfig
package com.yujie.filter; import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; /**
* 解决前端站点(主要为JavaScript发起的Ajax请求)访问的跨域问题
*/
@Configuration
public class CorsConfig extends WebMvcConfigurerAdapter { @Override
public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**")
.allowedOrigins("*") //允许所有前端站点调用
.allowCredentials(true)
.allowedMethods("GET", "POST", "DELETE", "PUT")
.maxAge(1728000);
}
}
运行测试
沿用上一篇vue中引用swiper轮播插件来测试 。
1.安装vue-resource
npm install vue-resource --save
2.在main.js中引入vue-resource
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
import VueResource from 'vue-resource' Vue.config.productionTip = false
Vue.use(VueResource)
/* eslint-disable no-new */
new Vue({
el: '#app',
router,
components: { App },
template: '<App/>',
http:{
root:''
}
})
3.修改BookDetail.vue代码:
<template>
<div class="bookdetail">
<div>书名:<span v-text="bookdata.bookname"></span></div>
<div>作者:<span v-text="bookdata.author"></span></div>
<div>页数:<span v-text="bookdata.pagesize"></span></div>
<div>定价:<span v-text="bookdata.price"></span></div>
<div>出版日期:<span v-text="bookdata.publishdate"></span></div>
</div>
</template> <script>
export default {
name: "BookDetail",
data(){
return{
id:this.$route.params.id,
bookdata:{bookname:'',author:'',price:0,publishdate:'',pagesize:0}
}
},
created(){
var self=this;
this.$http.get("http://localhost:8083/book/"+this.id).then(res=>{
self.bookdata.bookname=res.body.bookname;
self.bookdata.author=res.body.author;
self.bookdata.price=res.body.price;
self.bookdata.publishdate=res.body.publishdate;
self.bookdata.pagesize=res.body.pagesize;
});
},
props:[ ]
}
</script> <style scoped>
.bookdetail div{text-align: left;}
</style>
运行结果:
从.Net到Java学习第十二篇——SpringBoot+JPA提供跨域接口的更多相关文章
- 201671010140. 2016-2017-2 《Java程序设计》java学习第十二周
java学习第十章:图形程序设计 本章,介绍的是如何编写使用图形用户界面GUI的java程序.主要讲的是如何编写定义屏幕上的窗口大小和位置的程序,如何在窗口中采用多种字体显示文本,如何显示 ...
- Java学习(十二)
今天安装讲师推荐下载了一个叫Hbuiler X的IDE,并且学习了选择器的知识. 作为练习,写了一下的代码 <!DOCTYPE html> <html> <head> ...
- Java学习笔记十二:Java中方法的重载
Java中方法的重载 什么是方法的重载呢? 如果同一个类中包含了两个或两个以上方法名相同.方法参数的个数.顺序或类型不同的方法,则称为方法的重载,也可称该方法被重载了.如下所示 4 个方法名称都为 s ...
- Java学习笔记十二--集合(三)
第一节课 返回值 方法名 作用 void add(index,elemnet) 在指定的索引处添加元素 object get(index) 返回指定索引处的元素 int indexOf(object) ...
- Java学习笔记(十二)面向对象---内部类
内部类的访问规则 内部类可以直接访问外部类中的成员,包括私有成员. 因为内部类中持有了一个外部类的引用,格式为:外部类名.this 外部类要访问内部类,必须要建立内部对象. class Outer { ...
- R语法学习 第十二篇:因子
因子(factor)是R语言中比较特殊的一个类型, 它是一个用于存储类别的类型,因子的行为有时像字符串,有时像整数.因子也是一个向量,每个元素都是字符类型.因子具有因子水平(Levels),用于限制因 ...
- Python 学习 第十二篇:pandas
pandas是基于NumPy构建的模块,含有使数据分析更快更简单的操作工具和数据结构,最常用的数据结构是:序列Series和数据框DataFrame,Series类似于numpy中的一维数组,类似于关 ...
- java基础第十二篇之集合、增强for循环、迭代器和泛型
Collection接口中的常用方法: * 所有的子类子接口都是具有的 * 集合的方法:增删改查 * * public boolean add(E e);//添加元素 返回值表示是否添加成功 * pu ...
- Python学习第十二篇——切片的使用
Python中使用函数切片可以创建副本,保留原本.现在给出如下代码 magicians_list = ['mole','jack','lucy'] new_lists = [] def make_gr ...
随机推荐
- proxy_pass根据path路径转发时的"/"问题记录
在nginx中配置proxy_pass时,如果是按照^~匹配路径时,要注意proxy_pass后的url最后的/.当加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理 ...
- [Swift]LeetCode314. 二叉树的竖直遍历 $ Binary Tree Vertical Order Traversal
Given a binary tree, return the vertical order traversal of its nodes' values. (ie, from top to bott ...
- [Swift]LeetCode887. 鸡蛋掉落 | Super Egg Drop
You are given K eggs, and you have access to a building with N floors from 1 to N. Each egg is ident ...
- java中过多if-else分支语句的优化方案
利用Map优化过的的if-else分支 package com.taiping.test; import java.util.HashMap;import java.util.Map; public ...
- HoloLens开发手记- SpectatorView for iOS编译指南
微软前两天发布了HoloLens 2,给MR开发带来了新的希望,全面的性能和显示效果提升,让人期待. 去年推出的预览版的全新SpectatorView for iOS解决方案,这允许我们直接使用带AR ...
- Hecher学生互助平台(团队项目第一次)
团队项目作业链接:https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/homework/2978 一.团队简介 团队名称:Suc ...
- bootstrap分页插件的使用
项目中需要实现文章列表的分页显示,由于使用了bootstrap框架,所以我们选择bootstrap的分页实现方法.网上有一些这方面的介绍文章,并且也有相关的示例程序.这里结合我们的项目,介绍一下使用b ...
- ASP.NET Core 2.1 Web API + Identity Server 4 + Angular 6 + Angular Material 实战小项目视频
视频简介 ASP.NET Core Web API + Angular 6的教学视频 我是后端开发人员, 前端的Angular部分讲的比较差一些, 可以直接看代码!!!! 这是一个小项目的实战视频, ...
- 使用C# (.NET Core) 实现抽象工厂设计模式 (Abstract Pattern)
本文的概念性内容来自深入浅出设计模式一书. 上一篇文章讲了简单工厂和工厂方法设计模式 http://www.cnblogs.com/cgzl/p/8760250.html, 使用的是披萨店的例子. 文 ...
- scala读取配置文件
Class: package libparser import scala.collection.mutable import scala.util.matching.Regex class conf ...