前言
在上一篇文章中,我们搭建起了一个最简陋的SpringBoot Web应用,监听本地8080端口,输出一个页面。现在我们来进行进一步的操作,实现一个注册->登录功能,操作Mysql数据库。然后再简单地介绍一下部分SpringBoot的部分启动器(Starter)。
添加Mysql数据库驱动依赖
通过SpringBoot框架操作数据库有很多种方法,这里介绍一种简单且常用的方式,足够我们开发一套大中型的应用了。首先添加依赖如下:
mysql-connector-java作为连接mysql数据库的驱动,是最基础的模块。
spring-boot-starter-data-jpa是一个用于提供数据库JPA(即Java Persistence API)开发的模块,可以很方便地将Java对象关系映射到数据库存储。
我们接下来操作MySQL数据库便是通过JPA来进行的。我在此之前没有用过JPA,一直是手写SQL。对于一般情况下JPA能够很快处理业务逻辑,而针对一些复杂的查询,还是手写SQL来的好,后面也会介绍如何在JPA中使用SQL语句。
理清SpringBoot数据库操作基本概念
首先我们需要了解一些概念,除了上面提到的JPA,还有:
实体(Entity),也就是我们常用的JavaBean类,声明了一个数据表对应的属性。
数据访问对象(Data Access Object)即DAO,用于操控数据库的对象。
SpringBoot中,使用JPA操作数据库的一般处理流程如下:
- 编写Enity类
- 编写DAO接口
- 在DAO接口中编写findBy方法
- 在application.propreties中配置数据库参数
接下来我们就开始编写工作。
编写Entity类
编写UserEntity.java,代码内容如下
这里需要介绍一下用到的注解标签:
1. 类标签
@Entity 配置实体名称,表明该类为实体类。参数:@Entity(name="xxx")
@Table 配置对应表名,若Entity名称与表名相同可以省略。参数:@Table(name="xxx")属性标签
@Column:如果字段名与列名相同,则可以省略。参数:@Column(name="xxx")
@Id:表示该属性为主键。
@GeneratedValue:设置主键生成策略。参数@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "repair_seq"):表示主键生成策略是sequence(可以为Auto、IDENTITY、native等,Auto表示可在多个数据库间切换),指定sequence的名字是repair_seq。
@SequenceGeneretor:配合@GeneratedValue使用,定义一个生成主键的序列。参数@SequenceGeneretor(name = “repair_seq”, sequenceName = “seq_repair”, allocationSize = 1):name为sequence的名称,以便使用,sequenceName为数据库的sequence名称,两个名称可以一致。
编写DAO接口
编写UserDAO.java,代码内容如下
添加@Repository(仓库(Repository))注解,来表明这是一个用来执行与数据库相关操作DAO接口。这里我们只需要创建这样一个接口,Spring会自动帮我们生成实现类。
我们为接口编写了一个findeByUsernameAndPassword的方法,这里需要注意,方法名称一定要规范。Spring会根据我们编写的方法名称和参数,自动帮我们完成数据库的操作方法。关键字示例示例说明AndfindByUsernameAndPasswordwhere x.username=?1 and x.password=?2
OrfindByUsernameAndUserIdwhere x.username=?1 or x.userid=?2
(Is/Equals)findByUsername(Is/Equals)where x.username=?1
BetweenfindByDateBetweenwhere x.date between ?1 and ?2
LessThan(Equal)findByMoneyLessThan(Equal)where x.money
GreaterThan(Equal)findByMoneyGreaterThan(Equal)where x.money >(=) ?1
AfterfindByDateAfterwhere x.date > ?1
BeforefindByDateBeforewhere x.date > ?1
Is(Not)NullfindByAgeIs(Not)Nullwhere x.age is (not) null
(Not)LikefindByUsername(Not)Likewhere x.username is (not) like ?1
NotfindByLevelNotwhere x.level <> ?1
当然这里的表格只列出了部分,手动打起来太麻烦了,还有很多可以自行查阅手册或者尝试。这种方式完成代码的编写有利有弊,大家可以自行斟酌。简单的可以就只样,复杂查询还是自己编写sql语句吧。
配置数据库的参数
数据库的基本参数,包括数据库地址、端口、用户名、密码、数据库名等等。这些我们在application.propreties文件中完成:
此外还有一些其他的配置,比如
- spring.jpa.hibernate.naming-strategy:数据库字段命名规则;
- spring.jpa.hibernate.ddl-auto:自动更新数据库规则,可选参数有
- create:启动时删数据库中的表,然后创建,退出时不删除数据表
- create-drop:启动时删数据库中的表,然后创建,退出时删除数据表 如果表不存在报错
- update:如果启动时表格式不一致则更新表,原有数据保留
- validate:项目启动表结构进行校验 如果不一致则报错
编写一个测试方法
简单的测试代码如下:
我们通过userDao的save方法(这个方法也是Spring为我们实现的),将UserEntity对象直接进行存储。然后再通过findByUsernameAndPassword方法查找到数据库中内容并且转为对象,然后输出信息。整个过程非常的简单方便,而且省去了一堆对象序列化的操作。
总结
今天我们用SpringBoot中JPA的方法完成了MySQL数据库操作流程,与之前写的JDBC有所不同,但是上手也非常容易。SpringBoot的设计中,还有很多我之前没有接触到的内容,后续也会一一记录下来。
Comments