企业级SpringBoot单体项目模板 ——整合MySQL和Mybatis-plus

news2024/11/24 18:29:52
  • 😜           :是江迪呀
  • ✒️本文关键词Springboot数据库Git项目
  • ☀️每日   一言野心是对梦想最好的致敬!

上回我们已经成功的创建了一个SpringBoot的单体项目并测试启动并了,但是光有个空架子是什么都做不了的,下面我们就集成MySQLMybatis-plus

一、项目结构

在这里插入图片描述
项目结构说明:

  • common:顾名思义,公用的、共享的;用于存放一些常量枚举
  • config:用于存放一些配置文件,比如预加载的类、Bean等。
  • controller:控制层,用于存放接口。
  • entity:用于存放实体类(实体类:和数据库字段一一对应的类)。
  • mapper:用来存放和xml文件对应的mapper接口。
  • model:用于存放入参和出参的类。
  • service:用来存放service层和它的实现类。
  • utils:用来存放工具类。
  • resources/mapper:用来存放xml文件。

二、添加MySQL数据库

2.1 添加驱动连接池依赖

 <dependency>
   <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>5.1.32</version>
 </dependency>

根据自己的MySQL数据库版本来使用合适的数据库连接驱动。我数据库是5.6版本的所以使用5.1.32版本的驱动。

<!--德鲁伊数据库连接池-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.21</version>
</dependency>

这里我们使用德鲁伊的连接池,其实不使用连接池也是可以的,但是强烈建议要使用,连接池的作用如下:

  • 连接复用: 通过连接池管理,可以避免频繁地创建和销毁数据库连接,提高连接的复用性,从而减少系统开销。
  • 提高性能: 由于数据库连接已经创建并保持在池中,因此在进行数据库操作时无需再次创建连接,可以大大减少连接创建和销毁的开销,从而提高系统的性能。
  • 管理资源: 连接池可以有效地管理数据库连接,避免资源泄漏和浪费。当连接不再使用时,可以被回收并重新利用,从而提高了资源的利用率。

2.2 数据库和连接池配置

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test
    driver-class-name: com.mysql.jdbc.Driver
    username: xx
    password: xx
    type: com.alibaba.druid.pool.DruidDataSource

三、整合Mybatis-plus

上面我们添加了MySQL,万事俱备只欠东风,这个东风就是持久层框架——Mybatis-plus。它具有一下的特点:

  • 只做增强不做改变,引入它不会对现有工厂产生影响,如丝般顺滑。
  • 只需简单配置,即可快速进行单表CRUD操作,从而节省大量时间。
  • 代码生成、物理分页、性能分析等功能一应俱全。

3.1 添加依赖

  <dependency>
     <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus-boot-starter</artifactId>
      <version>3.5.0</version>
  </dependency>

3.2 配置

mybatis-plus:
  # xml格式的mapper文件路径
  mapper-locations: classpath*:mapper/*.xml
  configuration:
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl

四、user-demo

现在我们写一个demo来说明,不同的class应该存在哪个文件夹下面,以及如何使用mybatis-plus。

4.1 数据库结构

CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

4.2 实体类User

@TableName("user")
public class user {
    @TableId
    private Long id;
    
    private String name;

    private Integer age;

    public user() {
    }

    public user(Long id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

4.3 UserMapper和UserMapper.xml

UserMapper:

package com.shijiangdiya.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.catalina.User;
@Mapper
public interface UserMapper extends BaseMapper<User> {
     /**
     * 查询用户信息
     * @return
     */
    List<UserVO> queryUserInfo();
}
  • 可以看到UserMapper继承了BaseMapper,那么我们就可以使用由Mybatis-plus提供的CRUD方法,极大地提高开发效率。这里需要传入BaseMapper的泛型——User(就是实体类),告诉Mybatis-plus我这个是User的Mapper。
  • 还需要注解@Mapper,后面需要根据这个注解进行扫描。

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.shijiangdiya.mapper.UserMapper">
    <select id="queryUserInfo" resultType="com.shijiangdiya.model.user.UserVO">
        select
            name,
            age
        from user
    </select>
</mapper>

一定要注意,其中namespace的值就是UserMapper的路径。如何判断二者连接起来了呢?
在这里插入图片描述

4.4 UserService和UserServiceImpl

UserService:

package com.shijiangdiya.service;

import com.baomidou.mybatisplus.service.IService;
import com.shijiangdiya.entity.user.User;
import com.shijiangdiya.model.user.UserVO;

import java.util.List;

public interface UserService extends IService<User> {
    List<UserVO> queryUserInfo();
}

UserServiceImpl:

package com.shijiangdiya.service.impl;

import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.shijiangdiya.entity.user.User;
import com.shijiangdiya.mapper.UserMapper;
import com.shijiangdiya.model.user.UserVO;
import com.shijiangdiya.service.UserService;

import java.util.List;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {
    @Override
    public List<UserVO> queryUserInfo() {
        return baseMapper.queryUserInfo();
    }
}

4.5 UserController

package com.shijiangdiya.controller;

import com.shijiangdiya.model.user.UserVO;
import com.shijiangdiya.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/users")
    public List<UserVO> users(){
        return userService.queryUserInfo();
    }
}

五、测试

在这里插入图片描述
我们使用ApiPost测试一下,当然PostMan也是非常可以的呢。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1015331.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【独立全开源】点大商城V2-2.5.2 新增 微信小程序隐私协议弹窗

独立全开源版本&#xff1a;点大商城V2小程序公众号模块&#xff0c;版本更新至2.5.2&#xff0c;前端为UNiapp、这个是源码后端开源&#xff0c;购买包更新&#xff0c;包修复、 更新为覆盖升级&#xff0c;源码更新了&#xff1a;新增 微信小程序隐私协议弹窗 测试环境&…

肖sir__mysql之多表练习题__007

已知2张基本表&#xff1a;部门表&#xff1a;dept &#xff08;部门号&#xff0c;部门名称&#xff09;;员工表 emp&#xff08;员工号&#xff0c;员工姓名&#xff0c;年龄&#xff0c;入职时间&#xff0c;收入&#xff0c;部门号&#xff09; 1&#xff1a;dept表中有4条…

C++ Primer 第4章 表达式

C Primer 第4章 表达式 4.1 基础4.1.1 基本概念一、组合运算符和运算对象二、运算对象转换三、重载运算符四、左值和右值 4.1.2 优先级与结合律一、括号无视优先级与结合律二、优先级与结合律有何影响 4.1.3 求值顺序一、求值顺序、优先级、结合律 4.2 算术运算符练习 4.3 逻辑…

图片拖动验证效果(源码)

JS案例图片拖动验证 &#x1f31f;效果展示 &#x1f31f;前置知识 CSS sprite 精灵图 &#x1f31f; 代码实现 页面搭建 距离计算 逻辑部分 随机生成背景图片 计算拖动图块和空缺图块的位置 绑定事件 &#x1f31f;写在最后 &#x1f31f;效果展示 &#x1f31f;…

六、不root不magisk不xposed lsposed frida原生修改定位

前言常用风控APP检测1.Aida64检测2.momo检测3.微霸检测4.cellular-z检测 厂商测试总结 前言 不root不戴面具 不xposed lsposed frida&#xff0c;不分身&#xff0c;不多开&#xff0c;最完美的原生修改定位。 常用风控APP检测 先看效果再说原理&#xff0c;先过一遍环境 1.Ai…

mysql内连接与外连接详解

内连接与外连接 内连接外连接 在数据库中&#xff0c;连接操作是一种把两个或者多个表的记录组合在一起的操作&#xff0c;常用的有内连接&#xff08;Inner Join&#xff09;、外连接&#xff08;Outer Join&#xff09;等。 内连接 内连接&#xff08;Inner Join&#xff0…

STM32 Cubemx 通用定时器 General-Purpose Timers同步

文章目录 前言简介cubemx配置 前言 持续学习stm32中… 简介 通用定时器是一个16位的计数器&#xff0c;支持向上up、向下down与中心对称up-down三种模式。可以用于测量信号脉宽&#xff08;输入捕捉&#xff09;&#xff0c;输出一定的波形&#xff08;比较输出与PWM输出&am…

mysql 日志总结

mysql 根据日志的功能&#xff0c;分6种 慢查询日志&#xff1a;记录所有执行时间超过 long_query_time 的所有查询&#xff0c;方便我们对查询进行优化通用查询日志&#xff1a;记录所有连接的起始时间和终止时间&#xff0c;以及连接发送给数据库服务器的所有指令&#xff0…

Junit单元测试异常处理方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Junit单元测试异常处理方法 前言案例准备一、类方法内处理异常二、测试方法中处理异常1.try/catch/finally 语句2.Test(expected)3.ExpectedException 前言 提示&#xff1a…

【C语言】指针和数组笔试题解析(2)

【C语言】指针和数组笔试题解析&#xff08;1&#xff09;&#xff0c; 这是第一篇关于sizeof与strlen在指针中的应用&#xff0c;而这一篇主要讲解在各种情形下的灵活运用&#xff0c;也是大厂中经典的面试题 第一题&#xff1a; int main() {int a[5] { 1, 2, 3, 4, 5 };in…

开始在 Windows 上使用 Next.js

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 必备条件 安装 Next.js 本指南帮助你安装 Next.js Web 框架并在 Windows 上启动和运行。 Next.js 是一个框架&…

利用idea新创建maven项目时的一些基本配置

1.修改项目默认的maven仓库 file->Settings->Build 2.设置项目的jdk版本 设置完点OK即可。 同样的我们还需要在项目配置中进行修改。 通过以上设置一般就可以解决jdk版本不兼容地方问题。

详细解释HiveSQL执行计划

一、前言 Hive SQL的执行计划描述SQL实际执行的整体轮廓&#xff0c;通过执行计划能了解SQL程序在转换成相应计算引擎的执行逻辑&#xff0c;掌握了执行逻辑也就能更好地把握程序出现的瓶颈点&#xff0c;从而能够实现更有针对性的优化。此外还能帮助开发者识别看似等价的SQL其…

Redis 高性能设计之epoll和IO多路复用深度解析

I/O多路复用模型是什么 I/O&#xff1a;网络I/O多路&#xff1a;多个客户端连接&#xff08;连接就是套接字描述符&#xff0c;即socket或者channel&#xff09;&#xff0c;指的是多条TCP连接复用&#xff1a;用一个进程来处理多条的连接&#xff0c;使用单进程就能的够实现同…

【Linux系统编程】操作系统的概念、定位 及系统调用

文章目录 前言1. 操作系统的概念和定位2. 如何理解“管理”3. 操作系统为什么要做管理4. 系统调用和库函数概念5. 局部性原理6. 计算机体系结构 前言 上一篇文章我们学习了冯诺依曼体系结构&#xff08;属于计算机硬件的范畴&#xff09;&#xff0c;其中我们提到&#xff0c;因…

c++静态成员变量与静态成员函数

一、静态成员变量 1、说明 1.1、所有对象共享同一份静态变量 1.2、编译阶段分配内存 1.3、类内声明&#xff0c;类外初始化操作 静态成员变量&#xff0c;不属于某个具体的类对象&#xff0c;多有的类对象共享同一份数据 因此静态成员变量有两种方式访问 2、…

阿里云大数据实战记录10:Hive 兼容模式的坑

文章目录 1、前言2、什么是 Hive 兼容模式&#xff1f;3、为什么要开启 Hive 模式&#xff1f;4、有什么副作用&#xff1f;5、如何开启 Hive 兼容模式&#xff1f;6、该场景下&#xff0c;能不能不开启 Hive 兼容模式&#xff1f;7、为什么不是DATE_FORMAT(datetime, string)&…

【小记录】jupyter notebook新版本

手欠升级 &#x1f605;今天手贱&#xff0c;在anaconda navigator里面更新了最新版本的spyder&#xff0c;然后莫名奇妙地jupyter notebook就打不开了&#x1f605;&#xff0c;报错说缺少模块”ModuleNotFoundError: No module named jupyter_server.contents“&#xff0c;…

给微信小程序添加隐私协议

前些日子&#xff0c;微信官方针对用户的安全信息又进行了增强&#xff0c;这次更新几乎要求所有的小程序都需要进行整改&#xff0c;只要是涉及到用户的隐私的小程序都需要进行整改&#xff0c;这次整改是强制性的。 点开相关指引之后会跳转到下面的链接&#xff1a;参考链接…

解决php导出excel中小数尾部0不显示的问题

调整代码前&#xff1a; 新增代码&#xff1a; //小数避免末尾0不显示的问题 foreach ($list as &$line) {foreach ($line as &$column) {if (is_numeric($column) && strpos($column, .)!false) {$column " {$column} ";}} } 效果&#xf…