实训任务步骤
-
项目结构
-
依赖引入:pom.xml
-
全局配置文件:application.yml
-
实体建模
-
实体类
-
数据库脚本工作(schema.sql、data.sql)
-
-
创建Mapper接口
-
完成*Mapper.xml的sql封装
-
完成服务层接口定义(
*Servic
)和接口实现(*ServiceImpl
) -
完成Controller实现
-
完成测试验证
具体实施过程
项目结构
引入依赖
<!--MySQL依赖-->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
<!--MyBatis依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.2</version>
</dependency>
全局配置文件
-
在文件中完成MySQL数据库连接及连接池配置工作
-
通过SQL初始化配置进行相关表结构和基础数据的创建
-
配置MyBatis映射器的路径
-
日志
spring:
datasource:
url: jdbc:mysql://localhost:3306/2024mybatisjunit?useUnicode=true&characterEncoding=UTF-8&useSSL=false
username: admin
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
# hikari连接池配置
hikari:
minimum-idle: 5 #最小空闲连接数量
connection-test-query: SELECT 1 #连接测试
maximum-pool-size: 20 #连接池最大连接数,默认是10
auto-commit: true #自动提交
pool-name: dataHikariCP #连接池名称
max-lifetime: 600000 #连接最大存活时间600000毫秒(10分钟)
connection-timeout: 30000 #连接超时时间,0.5分钟
sql:
init:
schema-locations: classpath:db/schema.sql
mode: always
continue-on-error: true
data-locations: classpath:db/data.sql
logging:
level:
demo.mybatis: debug
mybatis:
# 配置xml文件位置
mapper-locations: classpath:mapper/*.xml
实体建模
实体类创建,其属性和表结构保持一致
package mybatis.demo.entity;
import lombok.Data;
/*品牌*/
@Data
public class Brand {
private int id;
private String name;
}
DAO层Mapper接口
通过MyBatis的@Mapper注解定义接口方法
package mybatis.demo.mapper;
import mybatis.demo.entity.Brand;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/*持久化层*/
@Mapper
public interface BrandMapper {
List<Brand> getAllBrand();
Brand getBrandById(Integer id);
int addBrand(Brand entity);
int updateBrand(Brand entity);
int deleteBrand(Integer id);
}
Mapper映射器
-
通过namespace,完成与DAO接口映射
-
通过id,完成与DAO接口方法的映射及绑定,并将SQL语句与方法进行实际绑定
-
通过#实现防SQL注入
-
通过resultType指定查询结构的数据类型,MyBatis会自动将结果映射为JavaBean中的属性
<?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="mybatis.demo.mapper.BrandMapper">
<select id="getAllBrand" resultType="mybatis.demo.entity.Brand">
select * from brand
</select>
<select id="getBrandById" resultType="mybatis.demo.entity.Brand">
select * from brand where id=#{id}
</select>
<insert id="addBrand">
insert into brand(name) values (#{name})
</insert>
<update id="updateBrand">
update brand set name=#{name} where id=#{id}
</update>
<delete id="deleteBrand">
delete from brand where id=#{id}
</delete>
</mapper>
服务层
-
本次服务层为Service接口+ServiceImpl实现类方式(使业务逻辑更易于扩展)
-
定义服务接口(
*Service.java
) -
完成服务接口实现类(
*ServiceImpl.java
),构造函数自动注入DAO层
package mybatis.demo.service;
import mybatis.demo.entity.Brand;
import java.util.List;
/*服务层接口定义*/
public interface BrandService {
List<Brand> getAllBrand();
Brand getBrandById(Integer id);
int addBrand(Brand entity);
int updateBrand(Brand entity);
int deleteBrand(Integer id);
}
package mybatis.demo.service.impl;
import mybatis.demo.entity.Brand;
import mybatis.demo.mapper.BrandMapper;
import mybatis.demo.service.BrandService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class BrandServiceImpl implements BrandService {
private final BrandMapper brandMapper;
@Autowired
public BrandServiceImpl(BrandMapper mapper){
this.brandMapper=mapper;
}
@Override
public List<Brand> getAllBrand() {
return brandMapper.getAllBrand();
}
@Override
public Brand getBrandById(Integer id) {
return brandMapper.getBrandById(id);
}
@Override
public int addBrand(Brand entity) {
return brandMapper.addBrand(entity);
}
@Override
public int updateBrand(Brand entity) {
return brandMapper.updateBrand(entity);
}
@Override
public int deleteBrand(Integer id) {
return brandMapper.deleteBrand(id);
}
}
控制层
-
通过@RequestMapping完成URL路径映射
-
构造函数自动注入Service层
-
HTTP方法映射(@GetMapping、@PostMapping、@PutMapping、@DeleteMapping等)
-
@GetMapping:处理GET请求,用于向Server获取数据
-
@PostMapping:处理POST请求,用于向Server提交数据,一般用于新增数据
-
@PutMapping:和POST请求相同,用于向Server提交数据,一般用于更新数据
-
@DeleteMapping:处理DELETE请求,用于向Server删除数据
-
@PathVariable:URL绑定占位符,完成URL和入口参数的绑定
-
@RequestBody:接收调用方传递给后端的JSON字符串中的数据,一般使用POST方式完成数据提交。
-
@RequestBody和@RequestParam可以同时使用,区别是@RequestBody只能有一个,@RequestParam可以有多个
package mybatis.demo.controller;
import mybatis.demo.entity.Brand;
import mybatis.demo.service.BrandService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/brand")
public class BrandController {
private BrandService brandService;
@Autowired
public BrandController(BrandService service){
this.brandService=service;
}
@GetMapping("/list")
public List<Brand> list(){
return brandService.getAllBrand();
}
@GetMapping("/detail/{id}")
public Brand detail(@PathVariable("id")int id){
return brandService.getBrandById(id);
}
@PostMapping("/insert")
public String insert(@RequestBody Brand entity){
return brandService.addBrand(entity)>0?"Success":"Fail";
}
@PutMapping("/edit")
public String edit(@RequestBody Brand entity){
return brandService.updateBrand(entity)>0?"Success":"Fail";
}
@DeleteMapping("/delete/{id}")
public String delete(@PathVariable("id") int id){
return brandService.deleteBrand(id)>0?"Success":"Fail";
}
}
Postman接口测试
-
使用Postman完成各接口的测试及验证
-
注意向Server提交数据时的方式及格式(图中红框标识)
获取所有数据
根据ID获取一行数据
新增一行数据
修改数据
删除数据
知识小结
-
掌握MyBatis框架的使用。MyBatis是一轻量级持久层框架,通过配置SQL映射文件方便地实现对库操作。
-
Mapper映射器,可以灵活地编写SQL语句,其中运用到MyBatis动态SQL使用,它的标签和数据库是一一对应的,需要进一步练习、熟悉和掌握。
-
学习Spring Boot与MyBatis集成方式。通过使用Spring Boot Starter依赖,快速集成MyBatis搭建给予Spring Boot的数据库访问层。
-
学习掌握如何在Spring Boot中配置数据源、引入MyBatis依赖、创建Mapper接口和实现其SQL映射的方法。