前两章我们简单讲解了SpringBoot的易用性,SpringBoot框架内部提供了很多我们需要用到的组件,需要什么你就可以拿到项目里。
在我们平时的项目中,数据的存储以及访问都是最为核心的关键部分,现在有很多企业采用主流的数据库,如关系型数据库:MySQL,oracle,sqlserver。非关系型数据库:redis,mongodb等。
SpringBoot已经为我们提供了很多种的数据库来做数据存储以及读取,上面只是简单的几种,那么我接下来以MySQL为例来讲述下本章的内容。
学习并且使用SpringBoot访问MySQL数据库,并且结合SpringDataJPA完成CRUD(Create,Read,Update,Delete)简单操作。
接下来我们先来创建SpringBoot项目,如下图1所示:
点击Next输入一些项目参数,如下图2所示:
点击Next后选择我们需要导入项目的SpringBoot组件,这里要注意一定要选择正确的组件,如下图3所示:
可以看到图3我们选择了,web,MySQL,JPA组件作为我们开发必备组件,我们点击Next输入项目名称后进入项目窗口,如下图4所示:
我们打开pom.xml可以看到springboot自动为我们添加了spring-data-jpa、mysql-connector-java的支持,如下图5所示:
上图的注释是我添加的,项目默认创建完成后是没有注释的。
注意:如果使用内部tomcat运行项目需要将spring-boot-starter-tomcat的scope标签注释掉。
今后我们修改application.properties文件配置为application.yml配置。.yml配置文件与.properties配置要更清晰更有层次感,可以很明了的看懂配置信息。
我们在resources目录下创建application.yml文件,并且配置DataSource以及JPA,如下图6所示:
可以看到上述配置文件内,我们使用了本地的一个mysql数据库,mysql数据库是我们事先安装好的,并且创建了一个名叫test的数据库,JPA的配置了show-sql用来在控制台输出JPA自动生成的sql语句。
上述数据配置文件已经完成,接下来我们新建数据库测试表结构我使用的数据库工具是Navicat你们可自行下载或者使用其他工具,结构如下图7所示:
创建表语句我会放到resources目录下,请大家到文档地址下载对应课程源码。
接下来我们开始编写springmvc控制器以及实体类,我们采用@RestController注解来编写一个控制器,如下图8所示:
我们根据数据库中的字段对应创建一个UserEntity来作为对应操作,如下图9所示:
可以看到图9中我们使用到了很多注解,关于注解的具体含义我们放到下面章节中具体讲解。
既然实体类我们也已经创建完成了,那么接下来我们需要使用SpringDataJPA来完成数据库操作,我们新建名字叫做jpa的package,然后创建UserJPA接口并且继承SpringDataJPA内的接口作为父类,如下图10所示:
我们UserJPA继承了JpaRepository接口(SpringDataJPA提供的简单数据操作接口)、JpaSpecificationExecutor(SpringDataJPA提供的复杂查询接口)、Serializable(序列化接口)。
我们并不需要做其他的任何操作了,因为SpringBoot以及SpringDataJPA会为我们全部搞定,SpringDataJPA内部使用了类代理的方式让继承了它接口的子接口都以spring管理的Bean的形式存在,也就是说我们可以直接使用@Autowired注解在spring管理bean使用,如下图11所示:
到这一步我们的数据库层几乎已经编写完成了,那么我们需要编写控制器让我们通过页面可以访问到数据。
我们回到UserController中,然后创建一个查询用户列表的方法,如下图12所示:
其中userJps.findAll()方法就是SpringDataJPA为我们提供的内置方法,它可以查询表内所有的数据,除了findAll还有很多有用的方法,我们后期使用一章的内容来详细介绍这个强大的家伙!
可以看到上图13中,我们只是简单的实现实体的持久化操作,userJPA.save方法可以执行添加也可以执行更新,如果需要执行持久化的实体存在主键值则更新数据,如果不存在则添加数据。
我们删除完用户后直接返回了用户列表,可以查看到用户是否已经删除成功。
具体如何运行项目请到LessonTwo去阅读,下面我们可以看到项目是正常运行的如下图15所示:
我红色标记的部分可以看到,springmvc加载了我定义的请求。那么我们尝试访问用户列表路径:127.0.0.1:8080/user/list可以看到如下图16所示,因为我们数据库中并没有数据,所以我们没有查询到结果:
可以看下IntelliJ IDEA工具控制台输出的语句:
Hibernate: select userentity0_.t_id as t_id1_0_, userentity0_.t_address as t_addres2_0_, userentity0_.t_age as t_age3_0_, userentity0_.t_name as t_name4_0_ from t_user userentity0_
因为我们没有设置格式化sql所以生成的sql语句都是一行显示的。
我们现在添加一条用户信息到数据库,请求地址:http://127.0.0.1:8080/user/save?name=admin&age=22&address=jinan,效果如下图17所示:
可以看到我们成功的添加了一条数据,并且用户数据主键编号也返回了,我们在执行参数中并没有添加id的值,这个id是数据库自动生成的,springDataJPA查询成功后会自动返回主键的值到实体主键映射字段中。
多插入几条数据方便我们下一步操作,插入完成后我们再次访问用户列表请求地址,效果如下图18所示:
上图18我们查询出了数据库中的所有用户数据,那么我们接下来更新下主键编号为1的用户信息,我们把age以及address分别改成,23,beijing,效果如下图19所示:
我们可以看到,在访问地址的时候我并没有传name字段的值,那么springDataJPA会认为你要清空name字段的值所以这样访问是不可以的,我们需要将name也传入,效果如下图20所示:
可以看到上图20,更新用户的name属性是有值得。你们可自行访问用户列表地址查询是否已经更新,我这里就不做演示了。
我们可以根据用户的主键来删除一条数据,如下图21所示:
我们可以看到我传入的id=1,删除完成后我们自动读取了用户列表,springDataJPA给我们没有返回id=1的用户,我们查看数据库数据也没有发现id=1用户,证明id=1的用户确实已经被从数据库中删除了。
上述内容就是我们本章的全部内容,主要讲述了springboot整合mysql并且使用SpringDataJPA来完成数据库的CRUD操作。
因为我们是接着上一章的内容讲解的,如果你有不明白的地方可以去查看我的第二章:SpringBoot与JSP间不可描述的秘密。
本章内容已经更新到码云,请大家下载学习:
SpringBoot配套源码地址:https://gitee.com/hengboy/spring-boot-chapter
SpringCloud配套源码地址:https://gitee.com/hengboy/spring-cloud-chapter
SpringBoot相关系列文章请访问:目录:SpringBoot学习目录
QueryDSL相关系列文章请访问:QueryDSL通用查询框架学习目录
SpringDataJPA相关系列文章请访问:目录:SpringDataJPA学习目录
SpringBoot相关文章请访问:目录:SpringBoot学习目录,感谢阅读!
知识星球 - 恒宇少年