?> 技术栈:
springboot、mybatis、mysql || 学习目的:
Springboot整合MyBatis基于Restful风格实现增删改查功能
1、项目结构
2、项目POM文件
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.0</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.mmdz</groupId> <artifactId>sbt_mybatis</artifactId> <version>0.0.1-SNAPSHOT</version> <name>sbt_mybatis</name> <description>Demo mybatis project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!--mybatis--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <!--mysql--> <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> <!--validator--> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.1.6.Final</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project>
3、项目配置文件
application.yml
server:
port: 8081
spring:
profiles:
active: dev
application-dev.yml || application-test.yml (个人设定)
spring: datasource: username: root password: 123456 url: jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC driver-class-name: com.mysql.jdbc.Driver mybatis: mapper-locations: classpath:mapper/*Mapper.xml type-aliases-package: com.mmdz.entity # sql 打印 # configuration: # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl config-location: classpath:mybatis/mybatis-config.xml # pagehelper pagehelper: helperDialect: mysql reasonable: true supportMethodsArguments: true params: count=countSql #showSql logging: level: com: example: mapper : debug
两个文件的意思是:
在项目中配置多套环境的配置方法。
因为现在一个项目有好多环境,开发环境,测试环境,准生产环境,生产环境,每个环境的参数不同,所以我们就可以把每个环境的参数配置到 yml 文件中,这样在想用哪个环境的时候只需要在主配置文件中将用的配置文件写上就行如 application.yml
笔记:在 Spring Boot 中多环境配置文件名需要满足 application-{profile}.yml 的格式,其中 {profile} 对应你的环境标识,比如:
application-dev.yml:开发环境
application-test.yml:测试环境
application-prod.yml:生产环境
4、实体&SQL
sql(数据库使用的是 MySQL)
CREATE TABLE `user` ( `id` int(32) NOT NULL AUTO_INCREMENT, `userName` varchar(32) NOT NULL, `passWord` varchar(50) NOT NULL, `realName` varchar(32) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; -- 数据自行添加
entity
import com.mmdz.common.validator.Update; import lombok.Data; import javax.validation.constraints.NotBlank; @Data public class User { @NotBlank(message = "id不能为空",groups = {Update.class}) private Integer id; @NotBlank private String userName; @NotBlank private String passWord; private String realName; }
5、控制层
UserController.java
import com.mmdz.common.Result; import com.mmdz.common.validator.Update; import com.mmdz.entity.User; import com.mmdz.service.IUserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @RestController public class UserController { @Autowired private IUserService userService; @RequestMapping("/getAll") public Result getAllUser(){ return Result.success(userService.getAllUser()); } @RequestMapping("/getUserById/{id}") public Result getUserById(@PathVariable Integer id){ return Result.success(userService.getUserById(id)); } @RequestMapping("/getUserByName/{name}") public Result getUserByName(@PathVariable String name){ return Result.success(userService.getUserByName(name)); } @PostMapping("/insert") public Result insert(@RequestBody @Valid User user){ User selective = userService.getUserBySelective(user); if(selective != null) return Result.error("用户名重复!"); return userService.insert(user) == 1 ? Result.success("新增成功!") : Result.error("新增失败!"); } @PutMapping("/update") public Result update(@RequestBody @Validated(Update.class) User user){ User selective = userService.getUserBySelective(user); if(selective != null) return Result.error("用户名重复!"); return userService.update(user) == 1 ? Result.success("更新成功!") : Result.error("更新失败!"); } @DeleteMapping("/delete/{id}") public Result getUserByName(@PathVariable Integer id){ return userService.deleteById(id) == 1 ? Result.success(userService.deleteById(id)) : Result.error("删除失败!"); } }
6、服务层
service
// User接口 import com.mmdz.entity.User; import java.util.List; public interface IUserService { List<User> getAllUser(); User getUserById(Integer id); User getUserByName(String userName); User getUserBySelective(User user); int deleteById(Integer id); int insert(User user); int update(User user); } // ========================================================================= import com.mmdz.entity.User; import com.mmdz.mapper.UserMapper; import com.mmdz.service.IUserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class UserServiceImpl implements IUserService { @Autowired UserMapper userMapper; @Override public List<User> getAllUser() { return userMapper.getAllUser(); } @Override public User getUserById(Integer id) { return userMapper.getUserById(id); } @Override public User getUserByName(String userName) { return userMapper.getUserByName(userName); } @Override public User getUserBySelective(User user) { return userMapper.getUserBySelective(user); } @Override public int deleteById(Integer id) { return userMapper.deleteById(id); } @Override public int insert(User user) { return userMapper.insert(user); } @Override public int update(User user) { return userMapper.update(user); } }
7、数据层
mapper
import com.mmdz.entity.User; import org.springframework.stereotype.Repository; import java.util.List; @Repository public interface UserMapper { List<User> getAllUser(); User getUserById(Integer id); User getUserByName(String userName); User getUserBySelective(User user); int deleteById(Integer id); int insert(User user); int update(User user); }
UserMapper.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.mmdz.mapper.UserMapper"> <resultMap id="BaseResultMap" type="com.mmdz.entity.User"> <result column="id" jdbcType="INTEGER" property="id" /> <result column="userName" jdbcType="VARCHAR" property="userName" /> <result column="passWord" jdbcType="VARCHAR" property="passWord" /> <result column="realName" jdbcType="VARCHAR" property="realName" /> </resultMap> <sql id="Base_Column_List" > select id, userName, passWord, realName </sql> <select id="getAllUser" resultMap="BaseResultMap"> <include refid="Base_Column_List" /> from db_user </select> <select id="getUserById" resultMap="BaseResultMap" parameterType="java.lang.Integer" > <include refid="Base_Column_List" /> from db_user where id = #{id,jdbcType=INTEGER} </select> <select id="getUserByName" resultMap="BaseResultMap" parameterType="java.lang.String" > <include refid="Base_Column_List" /> from db_user where userName = #{userName,jdbcType=VARCHAR} </select> <select id="getUserBySelective" resultMap="BaseResultMap" parameterType="com.mmdz.entity.User" > <include refid="Base_Column_List" /> from db_user where 1 = 1 <if test="userName != null"> and userName = #{userName,jdbcType=VARCHAR} </if> <if test="id != null"> and id != #{id,jdbcType=VARCHAR} </if> ORDER BY id ASC LIMIT 1 </select> <delete id="deleteById" parameterType="java.lang.Integer" > delete from db_user where id = #{id,jdbcType=INTEGER} </delete> <insert id="insert" parameterType="com.mmdz.entity.User" > insert into db_user (id, userName, passWord, realName) values (#{id,jdbcType=INTEGER}, #{userName,jdbcType=VARCHAR}, #{passWord,jdbcType=VARCHAR}, #{realName,jdbcType=VARCHAR}) </insert> <update id="update" parameterType="com.mmdz.entity.User" > update db_user set userName = #{userName,jdbcType=VARCHAR}, passWord = #{passWord,jdbcType=VARCHAR}, realName = #{realName,jdbcType=VARCHAR} where id = #{id,jdbcType=INTEGER} </update> </mapper>
8、启动类
启动类扫描的 mapper 文件路径 @MapperScan("com.xxx.mapper")
9、测试
自行测试