spring boot 整合Mybatis 完成增删改查

本文介绍如何在SpringBoot项目中配置并使用MyBatis框架及PageHelper进行高效分页处理,涵盖环境搭建、核心代码实现及接口测试全流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

使用 java 开发或者学习过程中,最避免不了的是连接和操作数据库,此次,学习了如何在spring boot中配置和使用Mybatis框架以及 PageHelper的使用 加快开发效率。


一、环境准备

开发工具:idea
接口测试工具:apipost7
数据库:mysql

二、操作步骤

1.建表

DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user`  (
  `id` int NOT NULL AUTO_INCREMENT,
  `username` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `password` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `age` int NULL DEFAULT NULL,
  `sex` char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `email` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `t_user` VALUES (3, '张三', '123', 23, '女', '854296521@qq.com');
INSERT INTO `t_user` VALUES (4, 'admin', '123', 23, '女', '854296521@qq.com');
INSERT INTO `t_user` VALUES (5, 'weqwe', '123', 23, '女', '854296521@qq.com');
INSERT INTO `t_user` VALUES (6, '李四', '123123', 78, '男', '98984@qq.com');
INSERT INTO `t_user` VALUES (7, '四', '123', 78, '女', '4564@qq.com');
INSERT INTO `t_user` VALUES (8, '王五', '123456', 12, '男', '123@136.com');
INSERT INTO `t_user` VALUES (9, '张三', '1234567', 12, '男', '854296521@qq.com');

2.创建 Spring Boot 工程

在这里插入图片描述

3.修改配置文件 application.yaml

spring:
  application:
    name: Springboot-Mybatis

  #mysql
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    name: defaultDataSource
    url: jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC
    username: root
    password: 123456

server:
  port: 8080

#mybatis配置
mybatis:
  #mapper file location
  mapper-locations: classpath:com/cque/springbootmybatis/mapper/*.xml
  #entity package
  type-aliases-package: com.cque.springbootmybatis.entity
  configuration:
    # 开启下划线转化为驼峰规则
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

4.创建实体类等

/**
 * @author zhaoyuqi start
 * @create 2022-12-08 - 17:30
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User {
    private Long id;
    private String username;
    private String password;
    private Integer age;
    private String sex;
    private String email;
}

5.创建mapper

/**
 * @author zhaoyuqi start
 * @create 2022-12-08 - 17:37
 */
@Mapper
public interface UserMapper {
	//添加
    void insert(User user);
	//删除
    void delete(Long id);
	//修改
    void update(User user);
	//分页条件查询
    List<User> getPages(User user);

}

6.创建service

/**
 * @author zhaoyuqi start
 * @create 2022-12-08 - 17:48
 */
@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;
	//添加
    public void registerUser(User user) {
        userMapper.insert(user);
    }
	//删除
    public void deleteUser(Long id) {
        userMapper.delete(id);
    }
	//修改
    public void updateUser(User user) {
        userMapper.update(user);
    }
}

7.在启动类上加上@MapperScan 扫描Mapper

@SpringBootApplication
@MapperScan("com.cque.springbootmybatis.mapper")
public class SpringbootMybatisApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootMybatisApplication.class, args);
    }

}

8.创建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.cque.springbootmybatis.mapper.UserMapper">
    <!--insert(User user)-->
    <insert id="insert">
        insert into t_user values(null ,#{username},#{password},#{age},#{sex},#{email})
    </insert>

    <!--delete(Integer id)-->
    <delete id="delete">
        delete from t_user where id = #{id}
    </delete>
    <!--update(User user)-->
    <update id="update">
        update t_user set username=#{username},password = #{password},age=#{age},sex=#{sex},email=#{email}
        where id = #{id}
    </update>
</mapper>

值得注意的是:需要在application.yaml中写好Mapper文件位置
在这里插入图片描述

9.使用PageHelper实现分页

PageHelper 用于后端分页

1.导入依赖

        <!--spring boot pageHelper starter 用于分页-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.4.5</version>
        </dependency>

2.配置PageHelper(两种方式)

  • 方式一:在application.yaml加入以下配置

#pagehelper plugins 用于分页
pagehelper:
  # 分页的数据来源
  helper-dialect: mysql
  # 启用合理化,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页
  reasonable: false
  # 支持通过 Mapper 接口参数来传递分页参数,默认值false
  support-methods-arguments: true
  #用于从对象中根据属性名取值,可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,
  #不配置映射的用默认值,默认值为 pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;
  params: count=countSql
  • 方式二:创建配置类,交给spring管理
/**
 * @author zhaoyuqi start
 * @create 2022-12-09 - 12:18
 */

/*
 配置方式:除了用yaml配置之外还可以配置类
 pageHelper的配置方式二
 */
@Configuration
public class PagehelperConfigration {

    @Bean
    public PageHelper pageHelper(){
        PageHelper pageHelper = new PageHelper();
        Properties pro = new Properties();
        pro.setProperty("offsetAsPageNum","true");
        pro.setProperty("rowBoundsWithCount","true");
        pro.setProperty("reasonable","true");
        pageHelper.setProperties(pro);
        return pageHelper;
    }
}

3.在UserMapper.java中加入查询方法

	//用于分页条件查询
    List<User> getPages(User user);

4.在service实现分页方法

/**
     * 分页条件查询
     *
     * @param pageNum  当前页
     * @param pageSize 每一页显示条数
     * @param user     封装的查询条件
     * @return 返回分页后的数据
     */
    public List<User> listUser(Integer pageNum, Integer pageSize, User user) {
        /*
         startPage方法自动为Mpper.xml中的SQL,加上 limit pageNum,pageSize,在SQL中就不用写了limit了 排序也可通过startPage设置
         */
        PageHelper.startPage(pageNum, pageSize);
        List<User> list = userMapper.getPages(user);
        //可以进一步包装成更完整的数据 PageInfo 分页对象,方便前端展示,里面封装了数据total这些)
        //PageInfo<User> pageInfo = new PageInfo<>(list);
        return list;
    }
    }

10.封装全局返回结果类和返回状态类,方便接口测试

  • Result.java
/**
 * 全局统一返回结果类
 */
@Data
public class Result<T> {

    private Integer code;

    private String message;

    private T data;

    public Result(){}

    protected static <T> Result<T> build(T data) {
        Result<T> result = new Result<T>();
        if (data != null)
            result.setData(data);
        return result;
    }

    public static <T> Result<T> build(T body, ResultCodeEnum resultCodeEnum) {
        Result<T> result = build(body);
        result.setCode(resultCodeEnum.getCode());
        result.setMessage(resultCodeEnum.getMessage());
        return result;
    }

    public static <T> Result<T> build(Integer code, String message) {
        Result<T> result = build(null);
        result.setCode(code);
        result.setMessage(message);
        return result;
    }

    public static<T> Result<T> ok(){
        return Result.ok(null);
    }

    /**
     * 操作成功
     * @param data
     * @param <T>
     * @return
     */
    public static<T> Result<T> ok(T data){
        Result<T> result = build(data);
        return build(data, ResultCodeEnum.SUCCESS);
    }

    public static<T> Result<T> fail(){
        return Result.fail(null);
    }

    /**
     * 操作失败
     * @param data
     * @param <T>
     * @return
     */
    public static<T> Result<T> fail(T data){
        Result<T> result = build(data);
        return build(data, ResultCodeEnum.FAIL);
    }

    public Result<T> message(String msg){
        this.setMessage(msg);
        return this;
    }

    public Result<T> code(Integer code){
        this.setCode(code);
        return this;
    }

    public boolean isOk() {
        if(this.getCode().intValue() == ResultCodeEnum.SUCCESS.getCode().intValue()) {
            return true;
        }
        return false;
    }
}

  • ResultCodeEnum.java
/**
 * 统一返回结果状态信息类
 */
@Getter
public enum ResultCodeEnum {

    SUCCESS(20000,"成功"),
    FAIL(20001, "失败"),
    ;

    private Integer code;
    private String message;

    private ResultCodeEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
}

11.创建控制器UserController

/**
 * @author zhaoyuqi start
 * @create 2022-12-08 - 17:46
 */
@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @PostMapping
    public Result registerUser(@RequestBody User user){
        userService.registerUser(user);
        return Result.ok();
    }

    @DeleteMapping("{id}")
    public Result deleteUser(@PathVariable Long id){
        userService.deleteUser(id);
        return Result.ok();
    }

    @PutMapping
    public Result udpateUser(@RequestBody User user){
        userService.updateUser(user);
        return Result.ok();
    }

    @PostMapping("/list/{pageNum}/{pageSize}")
    public Result list(@PathVariable Integer pageNum,
                           @PathVariable Integer pageSize,
                           @RequestBody User user){
        List<User> users = userService.listUser(pageNum, pageSize, user);
        return Result.ok(users);

    }
}

12.使用APIPOST测试接口

1. 测试添加

在这里插入图片描述
数据库:
在这里插入图片描述

2. 测试删除

在这里插入图片描述
数据库:
在这里插入图片描述

3. 测试修改

在这里插入图片描述
数据库:
在这里插入图片描述

4. 测试查询

在这里插入图片描述


三、总结

从数据库到实体类再到测试,一个完成的 spring boot 整合 mybatis 的demo演示完毕!

<think>好的,我现在需要帮助用户解答如何使用Google学术进行文献搜索的问题。首先,我得明确用户的需求。用户可能是一位学生或者研究人员,想要高效地利用Google学术来查找相关文献,但可能对具体操作不太熟悉。接下来,我应该按照任务要求分步骤回答,确保内容清晰实用,同时避免使用第一人称和步骤词汇。 首先,我需要回忆自己了解的Google学术的基本功能,比如基本搜索、高级搜索、引用导出等。但为了确保信息准确,可能需要调用网络搜索工具来核实最新功能和步骤。比如,Google学术的界面是否有变化,高级搜索的选项是否还包含作者、出版物、日期范围等。 然后,整合这些信息。基本搜索部分要说明如何输入关键词,使用布尔运算符。高级搜索需要详细说明如何访问高级搜索页面,各个过滤条件的作用。相关文献追踪部分可能需要提到创建警报和关注作者功能。引用管理部分要说明如何导出引用到EndNote、Zotero等工具。指标分析可能涉及h指数和影响力指标。 需要特别注意格式要求:每个方法或步骤间换行,不使用步骤词汇,正确引用代码和公式。这里可能不太涉及代码和公式,但如果有,比如搜索语法的例子,要正确使用反引号或公式格式。 最后,生成相关问题部分。必须基于用户的原始问题和回答内容,列出三个相关问题。比如如何设置Google学术警报、如何导出参考文献到管理软件、如何评估文献影响力等。 检查是否所有要求都满足:没有第一人称,步骤间换行,没有集中引用,相关问题正确格式。确保没有遗漏高级搜索的具体路径,比如点击菜单中的高级搜索选项。同时,验证每个步骤的实用性和可操作性,确保用户能按指导操作。 可能还需要确认最新的Google学术界面是否有变化,比如高级搜索的位置是否还在左侧的菜单中,或者是否移动到了其他位置。如果有变化,步骤可能需要调整。此外,引用导出的格式是否支持BibTeX等,这些细节需要准确。 完成回答后,再次检查格式,特别是相关问题的标题是否正确,是否在最后,标号是否正确。确保没有使用Markdown,而是纯文本,但用户的问题中似乎允许使用特定的格式,比如代码块和公式,但其他部分应避免。 总结:分步骤详细说明使用方法,确保信息最新准确,符合格式要求,最后生成相关问题。</think>要高效使用Google学术进行文献检索,可参考以下操作方法: **关键词检索与布尔逻辑** 在搜索框输入核心关键词组合,利用布尔运算符优化结果。例如:$量子计算 AND "算法优化" -硬件$ 表示包含“量子计算”和完整短语“算法优化”但不含“硬件”的文献。支持通配符*模糊匹配(如:neural * network) **高级搜索功能** 通过点击搜索栏右侧菜单选择“高级搜索”,可实现精准过滤: - 指定作者(作者名字段) - 限定出版物名称(出版物名字段) - 设置日期范围(时间区间选择) - 按相关性或日期排序 **文献关联网络挖掘** 检索结果页面提供两种拓展方式: 1. 点击“相关文章”查看相似研究 2. 使用“被引用次数”功能追踪后续研究进展 3. 通过“引用”链接查看参考文献列表 **文献追踪与管理** 在结果条目下方可操作: - 点击“保存”将文献存入Google学术个人库 - 选择“创建警报”接收新相关文献通知 - 点击“引用”获取不同格式的引用信息(如BibTeX、EndNote) ```python # 示例:通过scholarly库获取文献数据(需安装库) from scholarly import scholarly search_query = scholarly.search_pubs('quantum machine learning') print(next(search_query)) ``` **学术指标分析** 通过“Google学术指标”入口(需登录)可: - 查看领域内高影响力期刊/会议排名 - 分析作者的h指数、i10指数等学术影响力数据 - 追踪机构的学术产出趋势
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值