一、环境准备
- 开发工具 IDEA
- MySQL数据库(注意版本,下文有说)
二、数据准备
直接上图(就不给具体代码了)
三、搭建流程
1. 项目搭建
搭建流程如下所示:
这时,拿起水杯喝口水,等他创建完成,目录结构如下所示:
现对该目录结构做个简单介绍:
2. 代码实现
1. pom文件(dependencies依赖部分)
<dependencies>
<!-- springboot 相关依赖jar包,有先前选择的第二步spring web生成 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- spring-mybatis集成jar包 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<!-- mysql JDBC jar包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- lombok包,项目中直接使用即可,第一步选择生成 -->
<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>
</dependencies>
重点,敲黑板
可以看的,MySQL的JDBC包没有给出具体版本号,这里默认时当前最新版本,具体那个版本可以去https://mvnrepository.com/上面查询,因此要看你本地使用的MySQL版本(前面提到过),若版本为MySQL 8 及以上,那么可以不做修改,没问题,若版本为MySQL 8 以下(本人是5.56版本),那么必须指定低版本的版本号,如下所示,否则启动报错(亲测):
<!-- mysql JDBC jar包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!--- 指定低版本的版本号 ->
<version>5.1.49</version>
<scope>runtime</scope>
</dependency>
PS:MySQL 8 版本以上和以下的JDBC的驱动程序也不一样(自己使用的MySQL版本很重要),这个后面再说。
2. 新建项目结构(MVC结构)
如下所示:
3. 配置文件
基于上面的包结构,来写配置文件
前面也说过,创建工程后resource下会有一个默认的配置文件application.properties,现在将其重命名为application.yml。
为什么要用yml配置文件,这里简单说下,就是yml文件使用更简单、更直观,像具体了解两者区别可以。。。
配置文件分三部分,一是服务器配置,而是MyBatis配置,三是MySQL连接配置,如下:
1) 服务器配置
server:
port: 8888
servlet:
context-path: /myFirstSpringBoot
- server.port:设置端口,默认8080
- server.servlet.context-path:配置项目统一路径,在ngnix分发中起重要作用。设置此值后,访问的URL就变为了http://localhost:8888/myFirstSprignBoot;也可以不设置,URL为http://localhost:8888/
2)Mybatis配置
mybatis:
type-aliases-package: com.example.demo.bean
mapper-locations: classpath:demo/mybatis/*.xml
- mybatis.type-aliases-pakage:配置实体类全路径包名,可以不配置此项吗?答案是可以,具体后面再说
- mybatis.mapper-locations:配置xml文件路径,也不是必配项,原因和区别后面说
3) MySQL连接配置
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/springboot
username: root
password:
-
spring.datasource.driver-class-name: 配置数据库驱动程序,前面已经提到过,MySQL 8 和之前版本的驱动程序是不一样的,这里具体说说:MySQL 8版本以下版本的驱动程序如上所示: com.mysql.jdbc.Driver;8 及以上版本的驱动程序为:com.mysql.cj.jdbc.Driver。搭建根据自己使用的版本对号入座
-
spring.datasource.url: 配置数据库地址,最后面的springboot为数据库名,这是最简洁的写法,最普通的写法如下所示:useUnicode和characterEncoding配合使用表示使用Unicode字符集,且使用UTF-8编码
url: jdbc:mysql://127.0.0.1:3306/springboot?useUnicode=true&characterEncoding=UTF-8
另外,在使用连接池时,最好再添加两个参数autoReconnect=true&failOverReadOnly=false,分别表示数据库连接断开后自动重连、重连成功后的连接为非可读的,具体代码如下:
url: jdbc:mysql://127.0.0.1:3306/springboot?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false
-
spring.datasource.username: 数据库用户名
-
spring.datasource.password:对应的密码
PS:
spring.datasource.password写法与给出的实例写法完全不一样,因为这是springboot自带的配置文件 .properties文件格式的写法,是不是感觉很冗余,没有yml格式写法简洁?
完整的yml配置文件如下:
#Part One
#服务器相关设置
server:
port: 8080 #设置端口,默认8080
servlet:
context-path: /myFirstSpringBoot #配置项目统一路径,在ngnix分发中起重要作用
#设置此值后,访问的URL就变为了http://localhost:8888/myFirstSprignBoot
#也可以不设置,URL为http://localhost:8888/
#Part Two
#MyBatis相关配置
mybatis:
type-aliases-package: com.example.demo.bean #配置实体类全路径包名
mapper-locations: classpath:demo/mybatis/*.xml #配置xml文件路径,
# 当xml文件路径与mapper接口路径一样时,可以不配置此项
# 当两者路径不一样时,必须在此处指明xml文件的路径,否则spring找不到xml文件
#Part Three
#MySQL JDBC相关配置
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/springboot?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false
username: root
password:
4. 代码实现
结构、配置文件介绍完了,该直接上代码了,很简单,就不做过多说明了。
1)Contrller层
package com.example.demo.controller;
import com.example.demo.bean.Student;
import com.example.demo.service.DemoService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
@RestController
public class DemoController {
@Resource
private DemoService demoService;
@RequestMapping("/queryAll")
public List<Student> queryAll(){
System.out.println("调用queryAll接口!");
return demoService.queryAll();
}
}
2)Service层
package com.example.demo.service;
import com.example.demo.bean.Student;
import com.example.demo.mapper.DemoMapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* @author czm
* @create 2020/11/25 22:57
*/
@Service
public class DemoService {
@Resource
private DemoMapper demoMapper;
public List<Student> queryAll(){
return demoMapper.queryAll();
}
}
3)Mapper层
package com.example.demo.mapper;
import com.example.demo.bean.Student;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* @author czm
* @create 2020/11/25 22:56
*/
@Mapper
public interface DemoMapper {
List<Student> queryAll();
}
4)xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.example.demo.mapper.DemoMapper">
<resultMap id="StudentMap" type="Student">
<id property="id" column="id"></id>
<result property="stuId" column="stu_id"></result>
<result property="name" column="name"></result>
<result property="sex" column="sex"></result>
<result property="address" column="address"></result>
</resultMap>
<select id="queryAll" resultMap="StudentMap">
select * from student;
</select>
</mapper>
5)启动类
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
PS:注意点
1. mybatis的两个配置项
具体mybatis配置如下:
mybatis:
type-aliases-package: com.example.demo.bean #配置实体类全路径包名
mapper-locations: classpath:demo/mybatis/*.xml #配置xml文件路径,
第一项,mybatis.type-aliases-package
配置实体类全路径包名,配置此项后,在xml文件里写实体类时就不需要加包名了,如下:
<resultMap id="StudentMap" type="Student">
<id property="id" column="id"></id>
<result property="stuId" column="stu_id"></result>
<result property="name" column="name"></result>
<result property="sex" column="sex"></result>
<result property="address" column="address"></result>
</resultMap>
若是不配置此项,则必须在实体类前加全限定包名,如下:
<resultMap id="StudentMap" type="com.example.demo.bean.Student">
<id property="id" column="id"></id>
<result property="stuId" column="stu_id"></result>
<result property="name" column="name"></result>
<result property="sex" column="sex"></result>
<result property="address" column="address"></result>
</resultMap>
第二项:mapper-locations
配置xml文件的路径,当xml文件路径与mapper接口路径一样时,可以不配置此项;当两者路径不一样时,必须在此处指明xml文件的路径,否则spring找不到xml文件。
此例中,mapper接口的路径为com.example.demo.mapper,即com/example/demo/mapper,而mapper.xml文件的路径为demo/mybatis,不一样,必须配置此项,若mapper.xml的路径也为com/example/demo/mapper,如下,则可以不配置此项.
注意:在resource中新建路径时,必须层级建立【com->example->demo->mapper】,而不能一次建完【com.example.demo.mapper】,这样只是见了一个文件,文件名为com.example.demo.mapper,并没有一个层级关系。
2. 配置自动扫描mapper接口
我们看mapper接口内容:
@Mapper
public interface DemoMapper {
List<Student> queryAllStudent();
}
可以看到,mapper即可有一个注解@Mapper,作用是编译后springboot为相应的mapper生成实体类,供Service层调用。
试想下,若是不是一个mapper接口,而是几十个呢,是不是意味着我们要写几十个@Mapper注解,因此Spring Boot提供了一个@MapperScan注解,防止项目的启动类上,这样配置后,就不需要再每个Mapper接口上添加@Mapper注解了,SpringBoot会自动扫描@MapperScan声明的路径下的所有Mapper接口,如下:
@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
可以看到,多了一行@MapperScan注解,括号内的表示Mapper接口所在的路径,有多个路径是一如下方式配置:
@MapperScan("{"com.example.demo.mapper1", "com.example.demo.mapper2"}")
PS,以上提到的三个注意点,两种实现方式都可以同时存在,但是不能少,看个人喜好和编码习惯。