二. spring boot访问数据库,实现增删查改

  怎么创建一个spring boot 项目,请参照:一. 创建一个简单的spring-boot项目,实现hello world_m0_64684588的博客-CSDN博客

1.在pom.xml中引入访问数据库需要依赖

mysql 

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

jdbc

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
mybatis-plus( 官网 :MyBatis-Plus)
<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-plus-boot-starter</artifactId>
  <version>3.4.3</version>
</dependency>

代码生成工具和模板引擎

 <dependency>
   <groupId>com.baomidou</groupId>
   <artifactId>mybatis-plus-generator</artifactId>
   <version>3.5.1</version>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

数据库连接池 (想深入了解者,进入(https://github.com/alibaba/druid学习)

​<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid-spring-boot-starter</artifactId>
   <version>1.1.17</version>
</dependency>
​

日志

<dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
   <version>1.18.12</version>
</dependency>

第一次使用lombok 的码友需要安装一下

idea 安装步骤:file ->settings->plugins

在application.yml 文件中添加数据连接需要的参数

#配置数据库连接
spring:
  datasource:
    druid:
      #JDBC配置
      url: jdbc:mysql://192.168.1.102:3306/db_spring_boot_demo?useUnicode=true&characterEncoding=utf8&&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true
      username: root
      password: ldxdcxy1024
      type: com.alibaba.druid.pool.DruidDataSource
      driver-class-name: com.mysql.cj.jdbc.Driver
        #连接池配置
        # 初始化时建立物理连接的个数
        initial-size: 3
        #最大连接池数量
        max-active: 50
        #最小连接池数量
        min-idle: 5
        # 配置获取连接等待超时的时间
        max-wait: 60000
        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
        time-between-eviction-runs-millis: 60000
        # 配置一个连接在池中最小生存的时间,单位是毫秒
        min-evictable-idle-time-millis: 30000
        #申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
        test-while-idle: true
        #归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
        test-on-borrow: false
        #建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效
        test-on-return: false
        # 打开PSCache,并且指定每个连接上PSCache的大小
        pool-prepared-statements: true
        max-pool-prepared-statement-per-connection-size: 20
        # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
        filters: stat,wall,slf4j
        # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
        connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

2. 数据库的安装方法 mysql-5.7 Linux安装教程_m0_64684588的博客-CSDN博客
    创建数据库:db_spring_boot_demo
    创建表:bl_user

CREATE TABLE `bl_user`  (
  `user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `user_acc` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户账号',
  `user_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户名称',
  `user_pwd` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户密码',
  `user_phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户联系方式',
  `gmt_create` datetime(0) DEFAULT NULL COMMENT '创建时间',
  `gmt_modified` datetime(0) DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`user_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

3. 对cn.ldxdcxy.demo 包下面的目录做了一些改动,删除了以前的controller目录,创建了
    business:    业务代码目录
    config:      相关配置目录
    generator:   代码生成器目录

   在generator 创建代码生成工具类(MybatisPlusGenerator)

package com.ldxdcxy.demo.generator;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.Collections;

/**
 * 代码生成器
 * @author ldxdcxy
 */
public class MybatisPlusGenerator {
    /**
     * 工程路径
     */
    private static final String DEFAULT_PROJECT_PATH = System.getProperty("user.dir");
    /**
     * 默认作者
     */
    private static final String DEFAULT_AUTHOR = "ldxdcxy";
    /**
     * 数据源
     */
    private static final String DB_URL = "jdbc:mysql://192.168.1.102:3306/db_spring_boot_demo";
    private static final String DB_USERNAME = "root";
    private static final String DB_PASSWORD = "ldxdcxy1024";
    /**
     * 默认包名
     */
    private static final String DEFAULT_PACKAGE_PATH = "com.ldxdcxy.demo";
    /**
     * 模块名
     */
    private static final String MODULE_NAME = "business";

    public static void main(String[] args) {
        FastAutoGenerator.create(DB_URL, DB_USERNAME, DB_PASSWORD)
                .globalConfig(builder -> {
                    // 设置作者
                    builder.author(DEFAULT_AUTHOR)
                            .dateType(DateType.ONLY_DATE)
                            // 覆盖已生成文件
                            .fileOverride()
                            // 指定输出目录
                            .outputDir(DEFAULT_PROJECT_PATH + "/src/main/java");
                })
                .packageConfig(builder -> {
                    // 设置父包名
                    builder.parent(DEFAULT_PACKAGE_PATH)
                            // 设置父包模块名
                            .moduleName(MODULE_NAME)
                            // 设置mapperXml生成路径
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml,DEFAULT_PROJECT_PATH + "/src/main/resources/mapper"));
                })
                .strategyConfig(builder -> {
                    // 设置过滤表前缀
                    builder.addInclude("bl_user");
                })
                // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                .templateEngine(new FreemarkerTemplateEngine())
                .execute();
    }
}

 运行->在business目录下面就已经生成了实体类、业务逻辑类、控制层类、mapper类

4.我们通过类对mybatis-plus进行自动化配置

在config目录创建一个抽象类:AbstractMybatisPlusConfiguration

package com.ldxdcxy.demo.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;

/**
 * 抽象mybatis-plus自动化配置,提供模板由子类去实现具体的细节
 * @author ldxdcxy
 */
public abstract class AbstractMybatisPlusConfiguration {

    /**
     * 将{@link SqlSessionFactory}注入IOC容器
     *
     * @param dataSource 数据源
     * @return SqlSessionFactory
     * @throws Exception 构建SqlSessionFactory异常
     */
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean();
        // 数据源
        factory.setDataSource(dataSource);
        // 实体类路径
        factory.setTypeAliasesPackage(getModelPackagePath());
        // xml文件路径
        factory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(getMapperXmlResources()));
        // 分页插件
        MybatisPlusInterceptor paginationInterceptor = new MybatisPlusInterceptor();
        paginationInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(getDbType()));
        factory.setPlugins(paginationInterceptor);
        // 全局配置
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setBanner(false);
        factory.setGlobalConfig(globalConfig);
        return factory.getObject();
    }

    /**
     * 将{@link MapperScannerConfigurer}注入IOC容器,用于扫描mapper接口。
     * {@code PostProcessorRegistrationDelegate}会将{@link BeanDefinitionRegistryPostProcessor}的实现统一处理。
     */
    public MapperScannerConfigurer mapperScannerConfigurer() {
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setBasePackage(getMapperPackagePath());
        mapperScannerConfigurer.setSqlSessionFactoryBeanName(sqlSessionFactoryName());
        return mapperScannerConfigurer;
    }

    /**
     * 获取数据库类型
     *
     * @return 数据库类型
     */
    protected abstract DbType getDbType();

    /**
     * 获取model包路径
     *
     * @return model包全限定路径
     */
    protected abstract String getModelPackagePath();

    /**
     * 获取xml资源路径
     *
     * @return xml资源路径
     */
    protected abstract String getMapperXmlResources();

    /**
     * 获取mapper包路径
     *
     * @return mapper包全限定路径
     */
    protected abstract String getMapperPackagePath();

    /**
     * 获取注入IOC容器的SqlSessionFactory名称
     *
     * @return SqlSessionFactory名称
     */
    protected abstract String sqlSessionFactoryName();
}

创建一个子类 MybatisPlusConfiguration 继承   AbstractMybatisPlusConfiguration

package com.ldxdcxy.demo.config;

import com.baomidou.mybatisplus.annotation.DbType;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;


/**
 * mybatis-plus自动化配置
 * @author ldxdcxy
 */
@Configuration
public class MybatisPlusConfiguration  extends AbstractMybatisPlusConfiguration{
    /**
     * ORM模型包路径
     */
    private static final String MODEL_PACKAGE_PATH = "com.ldxdcxy.demo.business.entity";

    /**
     * XML路径
     */
    private static final String MAPPER_XML_RESOURCES = "classpath:mapper/*.xml";

    /**
     * Mapper包路径
     */
    private static final String MAPPER_PACKAGE_PATH = "com.ldxdcxy.demo.business.mapper";

    /**
     * SqlSessionFactory在IOC容器中的名称
     */
    private static final String SQL_SESSION_FACTORY = "SQL_SESSION_FACTORY";

    /**
     * 将{@link SqlSessionFactory}注入IOC容器
     *
     * @param dataSource 数据源
     * @return SqlSessionFactory
     * @throws Exception 构建SqlSessionFactory异常
     */
    @Bean(SQL_SESSION_FACTORY)
    @Override
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        return super.sqlSessionFactory(dataSource);
    }

    /**
     * 将{@link MapperScannerConfigurer}注入IOC容器,用于扫描mapper接口。
     * {@code PostProcessorRegistrationDelegate}会将{@link BeanDefinitionRegistryPostProcessor}的实现统一处理。
     */
    @Bean
    @Override
    public MapperScannerConfigurer mapperScannerConfigurer() {
        return super.mapperScannerConfigurer();
    }

    /**
     * 获取数据库类型
     *
     * @return 数据库类型
     */
    @Override
    protected DbType getDbType() {
        return DbType.MYSQL;
    }

    /**
     * 获取model包路径
     *
     * @return model包全限定路径
     */
    @Override
    public String getModelPackagePath() {
        return MODEL_PACKAGE_PATH;
    }

    /**
     * 获取xml资源路径
     *
     * @return xml资源路径
     */
    @Override
    public String getMapperXmlResources() {
        return MAPPER_XML_RESOURCES;
    }

    /**
     * 获取mapper包路径
     *
     * @return mapper包全限定路径
     */
    @Override
    public String getMapperPackagePath() {
        return MAPPER_PACKAGE_PATH;
    }

    /**
     * 获取注入IOC容器的SqlSessionFactory名称
     *
     * @return SqlSessionFactory名称
     */
    @Override
    public String sqlSessionFactoryName() {
        return SQL_SESSION_FACTORY;
    }
}

项目的目录结构如下图

param 文件夹定义查询条件的实体类

entity 文件夹下为实体类(BlUser)

  在IBlUserService 填写增、删、查、改的方法,并在BlUserServiceImpl中实现
  IBlUserService类

package com.ldxdcxy.demo.business.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ldxdcxy.demo.business.entity.BlUser;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ldxdcxy.demo.business.param.UserParam;

/**
 *  用户 服务类
 * @author ldxdcxy
 */
public interface IBlUserService extends IService<BlUser> {

    /**
     *  根据用户名称获取用户信息列表
     *  @param  param    用户查询对象
     * @return  Page<BlUser> 用户总条数、用户信息列表
     */
    IPage<BlUser> getUserPageList(UserParam param);

    /**
     * 添加用户信息
     * @param  user 用户对象
     * @return  添加后该用户主键ID
     */
    Integer addUser(BlUser user);

    /**
     * 修改用户信息
     * @param  user 用户对象
     * @return  添加后该用户主键ID
     */
    Integer updateUser(BlUser user);

    /**
     * 根据用户ID删除用户信息(物理删除)
     * @param userId        用户ID
     */
     void delUser(Integer userId);
}

BlUserServiceImpl类

package com.ldxdcxy.demo.business.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ldxdcxy.demo.business.entity.BlUser;
import com.ldxdcxy.demo.business.mapper.BlUserMapper;
import com.ldxdcxy.demo.business.param.UserParam;
import com.ldxdcxy.demo.business.service.IBlUserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import java.util.Date;

/**
 *  用户 服务实现类
 * @author ldxdcxy
 */
@Service
public class BlUserServiceImpl extends ServiceImpl<BlUserMapper, BlUser> implements IBlUserService {

    /**
     *  根据用户名称获取用户信息列表
     *  @param  param    用户查询对象
     * @return  Page<BlUser> 用户总条数、用户信息列表
     */
    @Override
    public IPage<BlUser> getUserPageList(UserParam param) {
        Page<BlUser> page = new Page<>(param.getCurrent(), param.getSize());
        IPage iPage=page(page,new LambdaQueryWrapper<BlUser>().eq(StringUtils.isNotBlank(param.getUserName()),BlUser::getUserName,param.getUserName()));
        return iPage;
    }

    /**
     * 添加用户信息
     * @param  user 用户对象
     * @return  添加后该用户主键ID
     */
    @Override
    public Integer addUser(BlUser user) {
        user.setGmtCreate(new Date());
        user.setGmtModified(new Date());
        save(user);
        return user.getUserId();
    }

    /**
     * 修改用户信息
     * @param  user 用户对象
     * @return  用户主键ID
     */
    @Override
    public Integer updateUser(BlUser user) {
        user.setGmtModified(new Date());
        updateById(user);
        return user.getUserId();
    }

    /**
     * 根据用户ID删除用户信息(物理删除)
     * @param userId     用户ID
     */
    @Override
    public void delUser(Integer userId) {
       removeById(userId);
    }
}

在 BlUserController  编写 前端控制器 代 码,引用  iBlUserService

@Autowired
private IBlUserService iBlUserService;

很多小伙伴会发现Autowired下有一个波浪线,提示:

 意思就是使用变量依赖注入的方式是不被推荐的,这只是一个警告,并不是错误,所以也不影响 你使用,但是小编是一个看不惯有警告的人,所以换一种引用方式来实现(必须安装lombok

@RequiredArgsConstructor(onConstructor_ = @Autowired)

package com.ldxdcxy.demo.business.controller;


import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ldxdcxy.demo.business.entity.BlUser;
import com.ldxdcxy.demo.business.param.UserParam;
import com.ldxdcxy.demo.business.service.IBlUserService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 用户 前端控制器
 * @author ldxdcxy
 */
@RestController
@RequestMapping("/api/user")
@RequiredArgsConstructor(onConstructor_ = @Autowired)
public class BlUserController {

    /**
     * 用户 服务类
     */
    private final IBlUserService iBlUserService;


    /**
     * 根据用户名称获取用户信息列表
     * @param param 用户查询对象
     * @return Page<BlUser> 用户总条数、用户信息列表
     */
    @GetMapping("/getUserPageList")
    public IPage<BlUser> getUserPageList(UserParam param) {
        return iBlUserService.getUserPageList(param);
    }

    /**
     * 添加用户信息
     * @param user 用户对象
     * @return 用户主键ID
     */
    @PostMapping("/addUser")
    public Integer addUser(BlUser user) {
        return iBlUserService.addUser(user);
    }

    /**
     * 修改用户信息
     * @param user 用户对象
     * @return 用户主键ID
     */
    @PutMapping("/updateUser")
    public Integer updateUser(BlUser user) {
        return iBlUserService.updateUser(user);
    }

    /**
     * 根据用户ID删除用户信息(物理删除)
     * @param userId 用户ID
     */
    @DeleteMapping("/delUser")
    public String delUser(Integer userId) {
        iBlUserService.delUser(userId);
        return "成功";
    }
}

启动项目进行测试(如下图表示启动成功)

 通过PostMan添加用户信息

 

 获取列表数据

修改(这里我只修改一下手机号)

 

 删除:根据用户ID删除用户信息

 

源码地址 :https://gitee.com/ldxdcxy/spring-boot-demo-datasource.git

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
当前课程中博客项目的实战源码是我在 GitHub上开源项目 My-Blog,目前已有 3000 多个 star:本课程是一个 Spring Boot 技术栈的实战类课程,课程共分为 3 大部分,前面两个部分为基础环境准备和相关概念介绍,第三个部分是 Spring Boot 个人博客项目功能的讲解,通过本课程的学习,不仅仅让你掌握基本的 Spring Boot 开发能力以及 Spring Boot 项目的大部分开发使用场景,同时帮你提前甄别和处理掉将要遇到的技术难点,认真学完这个课程后,你将会对 Spring Boot 有更加深入而全面的了解,同时你也会得到一个大家都在使用的博客系统源码,你可以根据自己的需求和想法进行改造,也可以直接使用它来作为自己的个人网站,这个课程一定会给你带来巨大的收获。作者寄语本课程录制于 2020 年,代码基于 Spring Boot 2.x 版本。到目前为止,Spring Boot 技术栈也有一些版本升级,比如 Spring Boot 2.7 发版、Spring Boot 3.x 版本发布正式版本。对于这些情况,笔者会在本课程实战项目的开源仓库中创建不同的代码分支,保持实战项目的源码更新,保证读者朋友们不会学习过气的知识点。课程特色 课程内容紧贴 Spring Boot 技术栈,涵盖大部分 Spring Boot 使用场景。开发教程详细完整、文档资源齐全、实验过程循序渐进简单明了。实践项目页面美观且实用,交互效果完美。包含从零搭建项目、以及完整的后台管理系统和博客展示系统两个系统的功能开发流程。技术栈新颖且知识点丰富,学习后可以提升大家对于知识的理解和掌握,对于提升你的市场竞争力有一定的帮助。实战项目预览    

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路灯下的程序员

你的鼓励是我继续努力的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值