综合案例
1. 整合Mybatis
1.1 数据准备
CREATE DATABASE springboot;
USE springboot;
-- 创建学生表
DROP TABLE IF EXISTS tb_student;
CREATE TABLE tb_student (
id bigint(20) NOT NULL primary key AUTO_INCREMENT COMMENT '主键ID',
number varchar(20) NOT NULL UNIQUE COMMENT '学号',
user_name varchar(20) NOT NULL COMMENT '姓名',
birthday DATE NOT NULL COMMENT '生日',
address varchar(11) DEFAULT NULL COMMENT '地址'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO tb_student VALUES (null,'hm001','张三','1995-05-05','北京市昌平区');
INSERT INTO tb_student VALUES (null,'hm002','李四','1996-06-06','北京市海淀区');
INSERT INTO tb_student VALUES (null,'hm003','王五','1997-07-07','北京市朝阳区');
INSERT INTO tb_student VALUES (null,'hm004','赵六','1998-08-08','北京市丰台区');
INSERT INTO tb_student VALUES (null,'hm005','周七','1999-09-09','北京市顺义区');
INSERT INTO tb_student VALUES (null,'hm006','孙悟空','2000-01-01','花果山水帘洞');
INSERT INTO tb_student VALUES (null,'hm007','猪八戒','2001-02-02','高老庄翠兰家');
INSERT INTO tb_student VALUES (null,'hm008','沙和尚','2002-03-03','流沙河河底');
INSERT INTO tb_student VALUES (null,'hm009','唐玄奘','2003-04-04','东土大唐');
1.2 添加依赖
<!--父工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.3</version>
</parent>
<dependencies>
<!--web依赖启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!--引入junit依赖启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--加入mybatis的启动器,这是mybatis公司提供的-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
</dependencies>
1.3 创建实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private Long id;
private String number;
private String userName;
private Date birthday;
private String address;
}
1.4 创建接口
@Mapper
public interface StudentMapper {
@Select("select * from tb_student")
List<Student> findAll();
}
1.5 添加接口扫描
在启动类上使用
@MapperScan
注解指定mapper接口所在的包
//注意一下:启动类的位置必须位于其他类的父包中
@SpringBootApplication//启动类专用注解
@MapperScan("com.itheima.mapper") //指定mapper接口所在的包
public class SpringbootDemoApplication {
public static void main(String[] args) {
//参数1.启动类.class
//参数2:args
SpringApplication.run(SpringbootDemoApplication.class,args);
}
}
1.6 添加配置文件
在配置文件
application.yaml
中添加数据源和mybatis的配置
spring:
datasource: #数据源配置(springboot内置连接池对象HiKariCP)
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/springboot
username: root
password: chuyin
mybatis: #mybatis简单配置
configuration:
map-underscore-to-camel-case: true #开启驼峰式映射
1.7 测试
@SpringBootTest //测试类注解
public class UserMapperTest {
//这个爆红不影响使用,如果要取消,可以在Mapper接口上添加@Mapper注解
@Autowired
private StudentMapper studentMapper;
@Test
public void testFindAll() {
studentMapper.findAll().forEach(e-> System.out.println(e));
}
}
2. 列表查询
2.1 添加service层
添加业务层的接口和实现,然后在类中注入mapper对象,并调用其方法
public interface StudentService {
//查询所有
List<Student> findAll();
}
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentMapper studentMapper;
@Override
public List<Student> findAll() {
return studentMapper.findAll();
}
}
2.2 添加controller
添加表示层实现类,然后在类中注入service对象,并调用其方法
@RestController
public class StudentController {
@Autowired
private StudentService studentService;
//查询所有
@GetMapping("/student")
public List<Student> findAll(){
List<Student> studentList = studentService.findAll();
return studentList;
}
}
3. 统一返回结果
3.1 思路
为了前后端更好的交互,我们应当对后端返回的数据格式做一定的约束,使得每次返回的数据格式基本一致
3.2 添加结果类
结果类就是我们规定好的一个规范类,以后后端返回的所有内容都要封装到这个类中返回
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Result {
private Integer code; //响应码:1.代表成功;0.代表失败
private String msg; //响应信息,描述字符串
private Object data; //返回的数据
//增删改 成功响应
public static Result success(){
return new Result(1,"success",null);
}
//查询 成功响应
public static Result success(Object data){
return new Result(1,"success",data);
}
//失败响应
public static Result error(String msg){
return new Result(0,msg,null);
}
}
3.3 修改controller
修改查询方法,将查询到的结果列表封装到结果类中再返回
@RestController
public class StudentController {
@Autowired
private StudentService studentService;
//查询所有
@GetMapping("/student")
public Result findAll(){
List<Student> studentList = studentService.findAll();
return Result.success(studentList);
}
}
3.4 添加前端页面
在resources/static中添加前端页面
3.5 效果查看
访问首页,观察效果
3.6 调整返回时间格式
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private Long id;
private String number;
private String userName;
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "Asia/Shanghai")
private Date birthday;
private String address;
}
4. 新增学生
4.1 controller
//新增
@PostMapping("/student")
public Result save(@RequestBody Student student){
studentService.save(student);
return Result.success();
}
4.2 service
接口
//新增
void save(Student student);
====================================================================================================
实现类
@Override
public void save(Student student) {
studentMapper.save(student);
}
4.3 mapper
@Insert("insert into tb_student values (null,#{number},#{userName},#{birthday},#{address})")
void save(Student student);
5. 回显学生
5.1 controller
//根据id查询
@GetMapping("/student/{id}")
public Result findById(@PathVariable("id") Integer id){
Student student = studentService.findById(id);
return Result.success(student);
}
5.2 service
接口
//根据id查询
Student findById(Integer id);
====================================================================================================
实现类
@Override
public Student findById(Integer id) {
return studentMapper.finById(id);
}
5.3 mapper
@Select("select * from tb_student where id = #{id}")
Student finById(Integer id);
6. 修改学生
6.1 controller
//修改
@PutMapping("/student")
public Result update(@RequestBody Student student){
studentService.update(student);
return Result.success();
}
6.2 service
接口
//修改
void update(Student student);
====================================================================================================
实现类
@Override
public void update(Student student) {
studentMapper.update(student);
}
6.3 mapper
@Update("update tb_student set number= #{number},user_name= #{userName},birthday= #{birthday},address= #{address} where id= #{id}")
void update(Student student);
7. 删除学生
7.1 controller
//删除
@DeleteMapping("/student/{id}")
public Result deleteById(@PathVariable("id") Integer id){
studentService.deleteById(id);
return Result.success();
}
7.2 service
接口
//删除
void deleteById(Integer id);
====================================================================================================
实现类
@Override
public void deleteById(Integer id) {
studentMapper.deleteById(id);
}
7.3 mapper
@Delete("delete from tb_student where id = #{id}")
void deleteById(Integer id);