Spring Boot 3中基于纯MyBatis的CURD开辟实例

打印 上一主题 下一主题

主题 1727|帖子 1727|积分 5181

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
项目整理目录结构:
  1. └── aiosms
  2.     ├── pom.xml
  3.     └── src
  4.         ├── main
  5.         │   ├── java
  6.         │   │   └── com      
  7.         │   │       └── ivandu
  8.         │   │           └── aiosms
  9.         │   │               ├── Aiosms.java
  10.         │   │               ├── controller
  11.         │   │               │   └── UserController.java
  12.         │   │               ├── entity
  13.         │   │               │   └── User.java
  14.         │   │               ├── mapper
  15.         │   │               │   └── UserMapper.java   
  16.         │   │               └── service
  17.         │   │                   ├── UserService.java   
  18.         │   │                   └── impl
  19.         │   │                       └── UserServiceImpl.java
  20.         │   └── resources
  21.         │       ├── application.properties
  22.         │       ├── mapper
  23.         │       │   └── UserMapper.xml
  24.         │       └── mybatis-config.xml
  25.         └── test
  26.             └── java
复制代码
项目POM:
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3.     <modelVersion>4.0.0</modelVersion>
  4.     <parent>
  5.         <groupId>org.springframework.boot</groupId>
  6.         <artifactId>spring-boot-starter-parent</artifactId>
  7.         <version>3.2.10</version>
  8.         <relativePath/> <!-- lookup parent from repository -->
  9.     </parent>
  10.     <groupId>com.ivandu.aiosms</groupId>
  11.     <artifactId>aiosms</artifactId>
  12.     <version>${revision}</version>
  13.     <packaging>jar</packaging>
  14.     <name>${project.artifactId}</name>
  15.     <properties>
  16.         <revision>1.0.0</revision>
  17.         <java.version>17</java.version>
  18.         <maven.compiler.source>${java.version}</maven.compiler.source>
  19.         <maven.compiler.target>${java.version}</maven.compiler.target>
  20.         <maven.compiler.compilerVersion>${java.version}</maven.compiler.compilerVersion>
  21.         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  22.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  23.         <maven-compiler-plugin.version>3.13.0</maven-compiler-plugin.version>
  24.         <spring.boot.version>${project.parent.version}</spring.boot.version>
  25.         <spring.webmvc.version>6.1.13</spring.webmvc.version>
  26.         <mysql.version>8.4.0</mysql.version>
  27.         <mybatis.version>3.5.16</mybatis.version>
  28.     </properties>
  29.     <dependencies>
  30.         <dependency>
  31.             <groupId>org.springframework.boot</groupId>
  32.             <artifactId>spring-boot-starter-web</artifactId>
  33.         </dependency>
  34.         <dependency>
  35.             <groupId>com.mysql</groupId>
  36.             <artifactId>mysql-connector-j</artifactId>
  37.             <version>${mysql.version}</version>
  38.             <scope>runtime</scope>
  39.         </dependency>
  40.         <dependency>
  41.             <groupId>org.mybatis</groupId>
  42.             <artifactId>mybatis</artifactId>
  43.             <version>${mybatis.version}</version>
  44.         </dependency>
  45.     </dependencies>
  46.     <build>
  47.         <plugins>
  48.             <plugin>
  49.                 <groupId>org.springframework.boot</groupId>
  50.                 <artifactId>spring-boot-maven-plugin</artifactId>
  51.             </plugin>
  52.         </plugins>
  53.     </build>
  54.     <repositories>
  55.         <repository>
  56.             <id>huaweicloud</id>
  57.             <name>huawei</name>
  58.             <url>https://mirrors.huaweicloud.com/repository/maven/</url>
  59.         </repository>
  60.         <repository>
  61.             <id>aliyunmaven</id>
  62.             <name>aliyun</name>
  63.             <url>https://maven.aliyun.com/repository/public</url>
  64.         </repository>
  65.     </repositories>
  66. </project>
复制代码
实体类(有参构造函数及setter、getter省略):
  1. package com.ivandu.aiosms.entity;
  2. import java.io.Serial;
  3. import java.io.Serializable;
  4. import java.time.LocalDateTime;
  5. public class User implements Serializable {
  6.     @Serial
  7.     private static final long serialVersionUID = 1L;
  8.     private Long userId;
  9.     private String userType;
  10.     private String fullName;
  11.     private String userName;
  12.     private String nickName;
  13.     private String password;
  14.     private Integer gender;
  15.     private String avatar;
  16.     private String department;
  17.     private String cellphone;
  18.     private String email;
  19.     private String address;
  20.     private Boolean status;
  21.     private Boolean isDeleted;
  22.     private LocalDateTime createTime;
  23.     private LocalDateTime updateTime;
  24.     private LocalDateTime loginTime;
  25.     private String loginIp;
  26.     private String remark;
  27.     public User() {
  28.     }
复制代码
Mapper接口:
  1. package com.ivandu.aiosms.mapper;
  2. import com.ivandu.aiosms.entity.User;
  3. import org.apache.ibatis.annotations.Mapper;
  4. @Mapper
  5. public interface UserMapper {
  6.     User selectUserById(Long id);
  7. }
复制代码
UserService接口:
  1. package com.ivandu.aiosms.service;
  2. import com.ivandu.aiosms.entity.User;
  3. public interface UserService {
  4.     User getUserById(Long id);
  5. }
复制代码
UserService实现类:
  1. package com.ivandu.aiosms.service.impl;
  2. import com.ivandu.aiosms.entity.User;
  3. import com.ivandu.aiosms.mapper.UserMapper;
  4. import com.ivandu.aiosms.service.UserService;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Service;
  7. @Service
  8. public class UserServiceImpl implements UserService {
  9.     private UserMapper userMapper;
  10.     @Autowired
  11.     public void setUserMapper(UserMapper userMapper) {
  12.         this.userMapper = userMapper;
  13.     }
  14.     @Override
  15.     public User getUserById(Long id) {
  16.         return userMapper.selectUserById(id);
  17.     }
  18. }
复制代码
Controller类:
  1. package com.ivandu.aiosms.controller;
  2. import com.ivandu.aiosms.entity.User;
  3. import com.ivandu.aiosms.service.UserService;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.web.bind.annotation.*;
  6. @RestController
  7. @RequestMapping("/user")
  8. public class UserController {
  9.     private UserService userService;
  10.     @Autowired
  11.     public void setUserService(UserService userService) {
  12.         this.userService = userService;
  13.     }
  14.     @GetMapping("/{id}")
  15.     public User findUserById(@PathVariable Long id) {
  16.         return userService.getUserById(id);
  17.     }
  18. }
复制代码
启动类:
  1. package com.ivandu.aiosms;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class Aiosms {
  6.     public static void main(String[] args) {
  7.         SpringApplication.run(Aiosms.class, args);
  8.     }
  9. }
复制代码
配置文件properties:
  1. server.port=10100
  2. spring.main.banner-mode=off
  3. spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
  4. spring.jackson.time-zone=GMT+8
  5. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  6. spring.datasource.url=jdbc:mysql://localhost:23066/aiosms?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=Asia/Shanghai
  7. spring.datasource.username=cm_aiosms
  8. spring.datasource.password=C*x#1a2b
  9. mybatis.type-aliases-package=com.ivandu.aiosms.entity
  10. mybatis.mapper-locations=classpath:mapper/*.xml
  11. mybatis.config-location=classpath:mybatis-config.xml
复制代码
MyBatis配置mybatis-config.xml:
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3.         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4.         "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6.     <!-- 全局参数 -->
  7.     <settings>
  8.         <!-- 使全局的映射器启用或禁用缓存 -->
  9.         <setting name="cacheEnabled"             value="true"   />
  10.         <!-- 允许JDBC 支持自动生成主键 -->
  11.         <setting name="useGeneratedKeys"         value="true"   />
  12.         <!-- 配置默认的执行器.SIMPLE就是普通执行器;REUSE执行器会重用预处理语句(prepared statements);BATCH执行器将重用语句并执行批量更新 -->
  13.         <setting name="defaultExecutorType"      value="SIMPLE" />
  14.         <!-- 指定 MyBatis 所用日志的具体实现 -->
  15.         <setting name="logImpl"                  value="SLF4J"  />
  16.         <!-- 使用驼峰命名法转换字段 -->
  17.         <!-- <setting name="mapUnderscoreToCamelCase" value="true"/> -->
  18.     </settings>
  19. </configuration>
复制代码
Mapper文件XML:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.ivandu.aiosms.mapper.UserMapper">
  4.     <!-- 基础结果映射 -->
  5.     <resultMap id="UserResultMap" type="com.ivandu.aiosms.entity.User">
  6.         <id column="user_id" property="userId"/>
  7.         <result column="user_type" property="userType"/>
  8.         <result column="full_name" property="fullName"/>
  9.         <result column="user_name" property="userName"/>
  10.         <result column="nick_name" property="nickName"/>
  11.         <result column="password" property="password"/>
  12.         <result column="gender" property="gender"/>
  13.         <result column="avatar" property="avatar"/>
  14.         <result column="department" property="department"/>
  15.         <result column="cellphone" property="cellphone"/>
  16.         <result column="email" property="email"/>
  17.         <result column="address" property="address"/>
  18.         <result column="status" property="status"/>
  19.         <result column="is_deleted" property="isDeleted"/>
  20.         <result column="create_time" property="createTime"/>
  21.         <result column="update_time" property="updateTime"/>
  22.         <result column="login_time" property="loginTime"/>
  23.         <result column="login_ip" property="loginIp"/>
  24.         <result column="remark" property="remark"/>
  25.     </resultMap>
  26.     <!-- 通用查询结果列 -->
  27.     <sql id="selectUser">
  28.         select user_id,
  29.                user_type,
  30.                full_name,
  31.                user_name,
  32.                nick_name,
  33.                password,
  34.                gender,
  35.                avatar,
  36.                department,
  37.                cellphone,
  38.                email,
  39.                address,
  40.                status,
  41.                is_deleted,
  42.                create_time,
  43.                update_time,
  44.                login_time,
  45.                login_ip,
  46.                remark
  47.         from aiosms_user
  48.     </sql>
  49.     <!-- 根据ID查询用户 -->
  50.     <select id="selectUserById" resultMap="UserResultMap" parameterType="Long">
  51.         <include refid="selectUser"/>
  52.         where user_id = #{userId} and is_deleted = 0 and status = 1
  53.     </select>
  54.     <!-- 查询用户列表 -->
  55.     <select id="selectUserList" resultMap="UserResultMap">
  56.         <include refid="selectUser"/>
  57.         where is_deleted = 0
  58.     </select>
  59.     <!-- 插入用户 -->
  60.     <insert id="insert" parameterType="com.ivandu.aiosms.entity.User">
  61.         insert into aiosms_user
  62.         <trim prefix="(" suffix=")" suffixOverrides=",">
  63.             <if test="userType != null">user_type,</if>
  64.             <if test="fullName != null">full_name,</if>
  65.             <if test="userName != null">user_name,</if>
  66.             <if test="nickName != null">nick_name,</if>
  67.             <if test="password != null">password,</if>
  68.             <if test="gender != null">gender,</if>
  69.             <if test="avatar != null">avatar,</if>
  70.             <if test="department != null">department,</if>
  71.             <if test="cellphone != null">cellphone,</if>
  72.             <if test="email != null">email,</if>
  73.             <if test="address != null">address,</if>
  74.             <if test="status != null">status,</if>
  75.             <if test="remark != null">remark,</if>
  76.         </trim>
  77.         <trim prefix="values (" suffix=")" suffixOverrides=",">
  78.             <if test="userType != null">#{userType},</if>
  79.             <if test="fullName != null">#{fullName},</if>
  80.             <if test="userName != null">#{userName},</if>
  81.             <if test="nickName != null">#{nickName},</if>
  82.             <if test="password != null">#{password},</if>
  83.             <if test="gender != null">#{gender},</if>
  84.             <if test="avatar != null">#{avatar},</if>
  85.             <if test="department != null">#{department},</if>
  86.             <if test="cellphone != null">#{cellphone},</if>
  87.             <if test="email != null">#{email},</if>
  88.             <if test="address != null">#{address},</if>
  89.             <if test="status != null">#{status},</if>
  90.             <if test="remark != null">#{remark},</if>
  91.         </trim>
  92.     </insert>
  93.     <!-- 更新用户 -->
  94.     <update id="updateById" parameterType="com.ivandu.aiosms.entity.User">
  95.         update aiosms_user
  96.         <set>
  97.             <if test="userType != null">user_type = #{userType},</if>
  98.             <if test="fullName != null">full_name = #{fullName},</if>
  99.             <if test="userName != null">user_name = #{userName},</if>
  100.             <if test="nickName != null">nick_name = #{nickName},</if>
  101.             <if test="password != null">password = #{password},</if>
  102.             <if test="gender != null">gender = #{gender},</if>
  103.             <if test="avatar != null">avatar = #{avatar},</if>
  104.             <if test="department != null">department = #{department},</if>
  105.             <if test="cellphone != null">cellphone = #{cellphone},</if>
  106.             <if test="email != null">email = #{email},</if>
  107.             <if test="address != null">address = #{address},</if>
  108.             <if test="status != null">status = #{status},</if>
  109.             <if test="remark != null">remark = #{remark},</if>
  110.         </set>
  111.         where user_id = #{userId} and is_deleted = 0
  112.     </update>
  113.     <!-- 逻辑删除用户 -->
  114.     <update id="deleteById">
  115.         update aiosms_user
  116.         set is_deleted = 1
  117.         where user_id = #{userId}
  118.           and is_deleted = 0
  119.     </update>
  120. </mapper>
复制代码
MySQL建库、建表语句及示例数据:
  1. DROP DATABASE IF EXISTS aiosms;
  2. CREATE DATABASE aiosms;
  3. -- CREATE USER 'cm_aiosms'@'10.1.1.3' IDENTIFIED BY 'C*x#1a2b';
  4. CREATE USER 'cm_aiosms'@'%' IDENTIFIED BY 'C*x#1a2b';
  5. -- GRANT ALL PRIVILEGES ON aiosms.* TO 'cm_aiosms'@'10.1.1.3';
  6. -- FLUSH PRIVILEGES;
  7. -- REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'cm_aiosms'@'10.1.1.3';
  8. GRANT ALL PRIVILEGES ON aiosms.* TO 'cm_aiosms'@'%';
  9. FLUSH PRIVILEGES;
  10. -- 用户信息表
  11. DROP TABLE IF EXISTS aiosms_user;
  12. CREATE TABLE aiosms_user
  13. (
  14.     user_id     BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '唯一标识',
  15.     user_type   CHAR(1)      NOT NULL DEFAULT '0' COMMENT '用户类型,0普通用户,1管理员,2超级管理员',
  16.     full_name   VARCHAR(128) NOT NULL COMMENT '用户姓名',
  17.     user_name   VARCHAR(128) NOT NULL UNIQUE COMMENT '用户账号',
  18.     nick_name   VARCHAR(64)  NOT NULL COMMENT '用户昵称',
  19.     password    VARCHAR(32)  NOT NULL COMMENT '用户密码',
  20.     gender      TINYINT      NOT NULL DEFAULT 2 COMMENT '用户性别(0女 1男 2未知)',
  21.     avatar      VARCHAR(128) NOT NULL DEFAULT 'images/avatar/0001.jpg' COMMENT '用户头像',
  22.     department  VARCHAR(128) NOT NULL COMMENT '所属部门',
  23.     cellphone   VARCHAR(15)  NOT NULL UNIQUE COMMENT '手机号',
  24.     email       VARCHAR(128) NOT NULL UNIQUE COMMENT '邮箱地址',
  25.     address     VARCHAR(255) COMMENT '通信地址',
  26.     status      TINYINT      NOT NULL DEFAULT 1 COMMENT '当前状态,0禁用,1启用',
  27.     is_deleted  TINYINT      NOT NULL DEFAULT 0 COMMENT '注销状态,0正常,1注销',
  28.     create_time DATETIME              DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间',
  29.     update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '信息更新时间',
  30.     login_time  DATETIME COMMENT '登录时间',
  31.     login_ip    VARCHAR(45) COMMENT '登录IP',
  32.     remark      VARCHAR(255) COMMENT '备注信息'
  33. ) ENGINE = InnoDB
  34.   AUTO_INCREMENT = 1000
  35.   DEFAULT CHARSET = utf8mb4 COMMENT ='用户信息表';
  36. INSERT INTO aiosms_user (user_type, full_name, user_name, nick_name, password, gender, avatar, department, cellphone, email, address, status, is_deleted, login_time, login_ip, remark)
  37. VALUES
  38.     ('0', '张三', 'zhangsan', '张三', '123456', 1, 'images/avatar/0001.jpg', '技术部', '13800000001', 'zhangsan@example.com', '北京市海淀区', 1, 0, '2023-10-01 10:00:00', '192.168.1.1', '测试用户1'),
  39.     ('1', '李四', 'lisi', '李四', '123456', 0, 'images/avatar/0002.jpg', '市场部', '13800000002', 'lisi@example.com', '上海市浦东新区', 1, 0, '2023-10-01 10:05:00', '192.168.1.2', '测试用户2'),
  40.     ('2', '王五', 'wangwu', '王五', '123456', 2, 'images/avatar/0003.jpg', '销售部', '13800000003', 'wangwu@example.com', '广州市天河区', 1, 0, '2023-10-01 10:10:00', '192.168.1.3', '测试用户3'),
  41.     ('0', '赵六', 'zhaoliu', '赵六', '123456', 1, 'images/avatar/0004.jpg', '财务部', '13800000004', 'zhaoliu@example.com', '深圳市南山区', 1, 0, '2023-10-01 10:15:00', '192.168.1.4', '测试用户4'),
  42.     ('1', '孙七', 'sunqi', '孙七', '123456', 0, 'images/avatar/0005.jpg', '人力资源部', '13800000005', 'sunqi@example.com', '成都市武侯区', 1, 0, '2023-10-01 10:20:00', '192.168.1.5', '测试用户5'),
  43.     ('2', '周八', 'zhouba', '周八', '123456', 2, 'images/avatar/0006.jpg', '技术部', '13800000006', 'zhouba@example.com', '杭州市西湖区', 1, 0, '2023-10-01 10:25:00', '192.168.1.6', '测试用户6'),
  44.     ('0', '吴九', 'wujiu', '吴九', '123456', 1, 'images/avatar/0007.jpg', '市场部', '13800000007', 'wujiu@example.com', '南京市鼓楼区', 1, 0, '2023-10-01 10:30:00', '192.168.1.7', '测试用户7'),
  45.     ('1', '郑十', 'zhengshi', '郑十', '123456', 0, 'images/avatar/0008.jpg', '销售部', '13800000008', 'zhengshi@example.com', '武汉市江汉区', 1, 0, '2023-10-01 10:35:00', '192.168.1.8', '测试用户8'),
  46.     ('2', '钱十一', 'qianshiyi', '钱十一', '123456', 2, 'images/avatar/0009.jpg', '财务部', '13800000009', 'qianshiyi@example.com', '重庆市渝中区', 1, 0, '2023-10-01 10:40:00', '192.168.1.9', '测试用户9'),
  47.     ('0', '孙十二', 'sunshier', '孙十二', '123456', 1, 'images/avatar/0010.jpg', '人力资源部', '13800000010', 'sunshier@example.com', '西安市雁塔区', 1, 0, '2023-10-01 10:45:00', '192.168.1.10', '测试用户10');
复制代码
利用Thunder Client调用,返回结果:
  1. {
  2.   "userId": 1001,
  3.   "userType": "1",
  4.   "fullName": "李四",
  5.   "userName": "lisi",
  6.   "nickName": "李四",
  7.   "password": "123456",
  8.   "gender": 0,
  9.   "avatar": "images/avatar/0002.jpg",
  10.   "department": "市场部",
  11.   "cellphone": "13800000002",
  12.   "email": "lisi@example.com",
  13.   "address": "上海市浦东新区",
  14.   "status": true,
  15.   "isDeleted": false,
  16.   "createTime": "2024-11-04T18:52:09",
  17.   "updateTime": "2024-11-04T18:52:09",
  18.   "loginTime": "2023-10-01T10:05:00",
  19.   "loginIp": "192.168.1.2",
  20.   "remark": "测试用户2"
  21. }
复制代码
部门调用日记:
  1. 2024-11-06T14:40:00.437+08:00  INFO 35732 --- [io-10100-exec-1] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
  2. 2024-11-06T14:40:00.604+08:00  INFO 35732 --- [io-10100-exec-1] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@254a87aa
  3. 2024-11-06T14:40:00.606+08:00  INFO 35732 --- [io-10100-exec-1] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
复制代码
以上例子中利用纯MyBatis实现了Spring Boot3中的数据查询功能,其余更新、插入、删除部门已在XML mapper中完成界说,参考上述操作步调稍加改动即可完成。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

曂沅仴駦

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表