怎么创建一个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