Spring Boot专栏二:当SpringBoot遇到Mysql——连接项目与数据库
前言
首先,在本专栏的第一节中,我给出了一个Hello World的样例,大家对于Spring Boot项目有了一点点的认识。今天的博客先不继续往下深挖,而是先把数据库引入进来。
所以今天的博客,需要大家提前准备好昨天的项目,还需要大家安装mysql,再安装一个mysql的可视化工具,推荐navicat。它们的下载安装就不赘述了,大家自行搜索即可。
在Spring Boot项目中添加与数据库相关的依赖
在上一节中,我们有展示过要添加的依赖,提到了四个依赖。它们分别是:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
今天我们再加一些依赖。其中三个是与数据库相关的——更具体地,分别是与mysql,jdbc,mybatis相关的。另外我们再加一个thymeleaf依赖,它是新一代的模板引擎,在 Spring4.0 中被推荐用来做前端模版引擎。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
将它们并列地加到pom.xml中即可。
在Spring Boot项目中修改与数据库相关的属性
既然要连接数据库,那么自然得告诉Spring Boot如何连接数据库,还有账户密码之类的。这个属性需要加在resources文件夹下的application.properites文件中。
在其中我们填上下面的代码片段:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password={你自己的mysql的密码}
其中,第一行都是这个值,照抄就行;第二行填url的时候,需要注意你电脑的数据库的端口号是不是3306。另外springboot是我用来存放数据的数据库库名,如果你想修改的话也是可以的。最后的serverTimezone=UTC表示采取东八区的时区,不加可能会出错。
第三行是数据库的username,一般默认都是root。第四行则是填上自己的mysql的密码
值得注意的是,在早期的Spring项目中,application应该是一个yml文件。所以现在有时候我们在其他博客中会看到相似的文件,不过填写的方式和我们这里的文件不同。这是因为已经版本更新了,我们现在用这个application.properites就好。
在Mysql数据库中新增一些数据
我们使用navicat可视化工具来操作我们的数据库,新建springboot数据库,在其下新建一个user_表(正常是叫user的,但是有可能与mysql的关键字有冲突,因此换了个名字叫user_,大家可以自行发挥)。
如果建表并添加记录我就不提了,总之,最后表的设计如图:
表中添加的用例记录如图:
大家可以自行发挥。
使用JdbcTemplate实现一个小例子
接下来我们使用一个JdbcTemplate来实现一个小例子——从数据库中读取数据。
首先我们打开上一节使用到的TestController.java文件,在TestController类中新建一个实例变量:
@Autowired
private JdbcTemplate jdbcTemplate;
其中@Autowired注解是将一个实例变量根据类型进行自动注入。JdbcTemplate是jdbc提供的一个工具,可以进行数据库操作。
使用它们需要导入:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
然后,我们在TestController类中新建一个方法:
@RequestMapping(value = "/sqlMethod", method = {RequestMethod.GET})
public List<Map<String, Object>> secondMethod() {
String sql = "select * from user_";
return JdbcTemplate.queryForList(sql);
}
我们依然先不讲RequestMapping这个注解的作用。主要看方法本身及其实现的功能。我们运行DemoApplication.java,启动项目。然后在浏览器中输入http://localhost:8080/test/sqlMethod(大家可以思考一下这里为什么是sqlMethod而不是secondMethod,以此猜测一下RequestMapping注解的作用)。
在浏览器中的到输出:
即是数据库的数据。证明我们已经可以从数据库中拿到数据了。
通过输入,与数据库进行交互
一个输入
这就涉及到如何在方法中得到输入。我们再写一个方法:
@RequestMapping(value = "/sqlMethod_parameter", method = {RequestMethod.GET})
public List<Map<String, Object>> thirdMethod(@RequestParam("user_id") int user_id) {
String sql = "select * from user_ where user_id="+user_id;
return JdbcTemplate.queryForList(sql);
}
这里要导入与RequestParam相关的包。其实大家在实践中也能发现,VSCode能自动提示你要导入什么包,我这里最后一次给出包,以后没有特殊情况,我就不给提示import了。
import org.springframework.web.bind.annotation.RequestParam;
写完之后,我们就可以尝试一下了。相信大家应该已经知道在浏览器输入什么url了吧?对了,就是http://localhost:8080/test/sqlMethod_parameter
当我们兴冲冲地输入该url并按下回车时,会发现报了如下的错误。
哦哦,原来是少了我们要输入的参数user_id。实际上,我们应该将url改为:
http://localhost:8080/test/sqlMethod_parameter?user_id=1,这样才能把参数告诉项目,即通过"原url"+"?"+“参数名=”+参数值的方式,传入参数。
这样我们就得到输出:
多个输入
那么,如果有多个输入该怎么办?比如要传两个参数,我们可以这样写:
@RequestMapping(value = "/sqlMethod_parameters", method = {RequestMethod.GET})
public List<Map<String, Object>> fourthMethod(@RequestParam("user_id1") int user_id1, @RequestParam("user_id2") int user_id2) {
String sql = "select * from user_ where user_id="+user_id1+" or user_id="+user_id2;
return JdbcTemplate.queryForList(sql);
}
url为http://localhost:8080/test/sqlMethod_parameters?user_id1=1&user_id2=2
注意这里的输入用&分隔。
一个列表或一个对象
同理,RequestParam也可以完成相关操作,不过有些困难,尤其是我们还没讲到如何处理一个对象,普通的对象无法参与到Spring Boot项目中来,只有“非常非常普通”的对象才能参与进来——有兴趣的同学可以先研究一下POJO对象或者Bean对象。
另外,RequestParam可以用于初级阶段的展示,但是要与前端交互,我们可能用到的都是JSON数据。这个部分留到后面讲,要用到RequestBody来代替RequestParam。今天我们先学到这里就行了,大家继续复习一下数据库的一些操作。
谢谢大家的阅读!
专栏第三节已经更新啦,传送门:Spring Boot专栏三:框架中的三个层Dao层、Service层和Controller层