首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

炙手可热的微服务框架SpringBoot-入门及数据库操作

阅读本文大概需要8分钟,代码显示不全向右拖动即可...

SpringBoot入门

1

为什么要使用SpringBoot

Spring Boot可以说是至少近5年来Spring乃至整个Java社区最有影响力的项目之一,也被人看作是:Java EE开发的颠覆者

2

SpringBoot的优点

去除了之前Spring项目的大量的xml配置文件

简化了复杂的依赖管理

配合各种starter使用,基本上可以做到自动化配置

快速启动容器

嵌入式Tomcat,Jetty容器,配合Maven或Gradle等构件工具打成Jar包后,Java -jar 进行部署运行还是蛮简单的

3

入门HelloWorld

要使用 SpringBoot 框架,先要安装 git 和 maven,这两个工具的安装过程就不赘述了,网上很多;另外本文所使用的 ide 是 IntelliJ IDEA;使用的jdk版本为1.8。

要创建一个基础的 SpringBoot 项目是一件很简单的事情,基本常用的创建方法有Maven 和 Spring Initializr两种,这里先介绍前者,后者会在后续的文章中介绍。至于如何使用 idea 创建一个 Maven 项目也就不多介绍了。

首先新建一个 Maven 项目引入如下依赖:

org.springframework.boot

spring-boot-starter-parent

1.5.9.RELEASE

org.springframework.boot

spring-boot-starter-web

这里只引入了一个依赖配置spring-boot-starter-web和一个 parent 配置spring-boot-starter-parent,但是只引入这两个依赖配置 SpringBoot 就会导入整个 springframework 依赖,以及 logging、slf4j、jackson、tomcat 插件等,所有这些都是一个Web 项目可能需要用到的东西,可以说是特别方便了。

之后在主目录下创建一个类,用作 SpringBoot 的程序入口,代码如下:

/**

* SpringBootApplication注解表示其是一个Spring Boot应用

* RestController注解标注这个程序是一个控制器

*/

@SpringBootApplication

@RestController

publicclassApplication{

@RequestMapping("/")

Stringhome(){

return"hello";

}

publicstaticvoidmain(String[] args){

SpringApplication.run(Application.class,args);

}

}

虽然仅仅使用了几行代码,但其实这已经是一个完整的 Web 项目了。

之后在工程的 resource 文件夹中创建一个 application.yml 文件,这个文件会被发布在 classpath 中并被 SpringBoot 自动读取。代码如下:

server:

port: 8080

tomcat:

uri-encoding: UTF-8

之后运行之前写好的主程序,然后在浏览器的地址栏中输入http://localhost:8080/。这样就可以看到我们期望的输出字符:hello。至此一个最基本的 SpringBoot 应用就开发完成了。

该实例的代码发布在我的github中,链接:https://github.com/MadridSeven/learning-spring-boot/tree/master/spring-boot-hello

4

SpringBoot使用MySql

为了使用JPAMySql,首先在工程中引入它们的 Maven 依赖,代码如下:

org.springframework.boot

spring-boot-starter-data-jpa

mysql

mysql-connector-java

runtime

其余的配置与上一个基础应用一样。

4.1

实体建模

这个实例,我们考虑建三张数据表,部门、用户、角色表,其中部门和用户是一对多关系,用户和角色是多对多关系。

部门实体类代码如下所示,这里省略了Geeter/Setter方法:

@Entity

@Table(name ="department")

publicclassDepartment{

//指定其为主键并且自增

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

privateLong id;

privateString name;

publicDepartment(){

}

......

}

用户实体类代码如下,省略了Geeter/Setter方法和toString方法:

@Entity

@Table(name ="user")

publicclassUserimplementsSerializable{

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

privateLong id;

privateString name;

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

privateDate createDate;

publicUser(){

}

//部门和用户为一对多关系,在部门("一")的实体类中设置ManyToOne关联

@ManyToOne

//在生成的数据表中使用did表示部门的id

@JoinColumn(name="did")

//防止关系对象递归访问

@JsonBackReference

privateDepartment department;

//用户和角色为多对多关系

@ManyToMany(cascade = {},fetch = FetchType.EAGER)

//多对多需要使用中间表

@JoinTable(name ="user_role",joinColumns = {@JoinColumn(name ="user_id")},inverseJoinColumns = {@JoinColumn(name ="roles_id")})

privateList roles;

......

}

角色实体建模:

@Entity

@Table(name ="role")

publicclassRoleimplementsSerializable{

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

privateLong id;

privateString name;

publicRole(){

}

......

}

4.2

实体持久化

通过建立上面的三个实体类,我们已经实现了使用 Java 的普通对象(POJO)与数据库表建立映射关系(ORM),接下来使用JPA实现持久化。

用户实体持久化的代码如下所示,它是一个接口,继承了JPA资源库JpaRepository接口。

//Repository注解说明该接口是一个资源库

@Repository

publicinterfaceUserRepositoryextendsJpaRepository{

}

使用同样的方法,可以定义部门实体和角色实体的资源库接口,只要注意使用的参数是各自的实体对象即可。

这样就实现了存取数据库的功能了,我们现在就可以对数据库进行增删改查、分页查询等操作了。但是有个问题,我们定义的实体资源库接口并没有声明一个方法,也没有一个实现类,为什么就可以进行数据库操作呢?其实我们看看 JpaRepository 的继承关系就可以了解个大概了。

其中 JpaRepository 继承于 PagingAndSortingRepository,它提供了分页和排序功能,PagingAndSortingRepository 继承于 CrudRepository,它提供了简单的增删改查功能。

JPA 还提供了一些自定义生命方法的规则,例如,在接口中使用关键字 findBy、readBy、getBy作为方法名的前缀,拼接实体类中的属性字段,并可选择凭借一些SQL查询关键字来组成一个查询方法。

4.3

MySql测试

增加一个JPA的配置类,代码如下所示。

@Configuration

@EnableJpaRepositories(basePackages ="byh.**.repository")

@Order(Ordered.HIGHEST_PRECEDENCE)

//启用Jpa事务管理

@EnableTransactionManagement(proxyTargetClass =true)

//启用Jpa资源库,指定接口资源库位置

@EntityScan(basePackages ="byh.**.entity")

publicclassJpaConfiguration{

@Bean

PersistenceExceptionTranslationPostProcessorpersistenceExceptionTranslationPostProcessor(){

returnnewPersistenceExceptionTranslationPostProcessor();

}

}

其次在Mysql数据库服务器中创建一个数据库test,不用创建数据库的表结构,程序运行时将会按照实体的定义自动创建。

然后,在配置文件 application.yml 中使用如下配置:

spring:

profiles:

active: prod

datasource:

url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8

username: root

password: 123456

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

jpa:

database: mysql

show-sql: true

hibernate:

ddl-auto: update

naming:

strategy: org.hibernate.cfg.ImprovedNamingStrategy

properties:

hibernate:

dialect: org.hibernate.dialect.MySQL5Dialect

server:

port: 8080

tomcat:

uri-encoding: UTF-8

写一个主程序来测试,代码如下:

publicclassMysqlTest{

@Autowired

UserRepository userRepository;

@Autowired

DepartmentRepository departmentRepository;

@Autowired

RoleRepository roleRepository;

@RequestMapping("/find")

publicStringfindPage(){

this.initData();

Pageable pageable =newPageRequest(,10,newSort(Sort.Direction.ASC,"id"));

Page page = userRepository.findAll(pageable);

String result ="";

for(User user: page.getContent()){

result += user.toString();

}

returnresult;

}

publicvoidinitData(){

userRepository.deleteAll();

roleRepository.deleteAll();

departmentRepository.deleteAll();

Department department =newDepartment();

department.setName("开发部");

departmentRepository.save(department);

Role role =newRole();

role.setName("admin");

roleRepository.save(role);

User user =newUser();

user.setName("user");

user.setCreateDate(newDate());

user.setDepartment(department);

List roles = roleRepository.findAll();

user.setRoles(roles);

userRepository.save(user);

}

publicstaticvoidmain(String[] args){

SpringApplication.run(MysqlTest.class,args);

}

}

运行该程序,在浏览器中输入 http://localhost:8080/find,之后会看到从数据库中查询到的值。

该实例的代码发布在我的github中,链接:https://github.com/MadridSeven/learning-spring-boot/tree/master/spring-boot-dataBase

笔者水平有限,若有错漏,欢迎指正,如果转载以及CV操作,请务必注明出处,谢谢!

版权声明:本文为原创文章,未经允许不得转载。

“深入实践SpringBoot”一书

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180319G17LF400?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券