【SpringBoot3】整合Druid数据源和Mybatis 项目打包和运行

文章目录

  • 一、整合Druid数据源
  • 二、整合Mybatis
    • 2.1 MyBatis整合步骤
    • 2.1 Mybatis整合实践
    • 2.1 声明式事务整合配置
    • 2.1 AOP整合配置
  • 三、项目打包和运行
    • 命令启动和参数说明
  • 总结
    • web 与 springboot 打包区别
    • JDK8的编译环境 执行17高版本jar


一、整合Druid数据源

  • 创建模块 : springboot-base-druid-04

  • 导入依赖 pom.xml :

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.5</version></parent><groupId>com.wake</groupId><artifactId>springboot-base-druid-04</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!--  web开发的场景启动器 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 数据库相关配置启动器 jdbcTemplate 事务相关--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- druid启动器的依赖  --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId><version>1.2.18</version></dependency><!-- 驱动类--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.28</version></dependency></dependencies><!--    SpringBoot应用打包插件--><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
  • 启动类:
@SpringBootApplication
public class DruidMain {public static void main(String[] args) {SpringApplication.run(DruidMain.class,args);}
}
  • 配置文件 yaml :
spring:datasource:# 连接池类型type: com.alibaba.druid.pool.DruidDataSource  # 使用Druid连接池# Druid的其他属性配置 springboot3整合情况下,数据库连接信息必须在Druid属性下!druid:url: jdbc:mysql://localhost:3306/mybatis-exampleusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver# 初始化时建立物理连接的个数initial-size: 5# 连接池的最小空闲数量min-idle: 5# 连接池最大连接数量max-active: 20# 获取连接时最大等待时间,单位毫秒max-wait: 60000# 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。test-while-idle: true# 既作为检测的间隔时间又作为testWhileIdel执行的依据time-between-eviction-runs-millis: 60000# 销毁线程时检测当前连接的最后活动时间和当前时间差大于该值时,关闭当前连接(配置连接在池中的最小生存时间)min-evictable-idle-time-millis: 30000# 用来检测数据库连接是否有效的sql 必须是一个查询语句(oracle中为 select 1 from dual)validation-query: select 1# 申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为truetest-on-borrow: false# 归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为truetest-on-return: false# 是否缓存preparedStatement, 也就是PSCache,PSCache对支持游标的数据库性能提升巨大,比如说oracle,在mysql下建议关闭。pool-prepared-statements: false# 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100max-pool-prepared-statement-per-connection-size: -1# 合并多个DruidDataSource的监控数据use-global-data-source-stat: truelogging:level:root: debug
  • 测试
    • controller
@RestController
@RequestMapping("user")
public class UserController {@Autowiredprivate JdbcTemplate jdbcTemplate;@GetMapping("show")public List<User> show(){String sql = "select * from user";List<User> userList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));return userList;}
}

1

  • 问题:
    • springboot3 与 Druid 不兼容,需要自己指定:
  • 通过源码分析,druid-spring-boot-3-starter目前最新版本是1.2.18,虽然适配了SpringBoot3,但缺少自动装配的配置文件。
  • 需要手动在resources目录下创建META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,文件内容如下:
com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure

1

二、整合Mybatis

2.1 MyBatis整合步骤

  1. 导入依赖:在您的Spring Boot项目的构建文件(如pom.xml)中添加MyBatis和数据库驱动的相关依赖。例如,如果使用MySQL数据库,您需要添加MyBatis和MySQL驱动的依赖。
  2. 配置数据源:在application.propertiesapplication.yml中配置数据库连接信息,包括数据库URL、用户名、密码、mybatis的功能配置等。
  3. 创建实体类:创建与数据库表对应的实体类。
  4. 创建Mapper接口:创建与数据库表交互的Mapper接口。
  5. 创建Mapper接口SQL实现: 可以使用mapperxml文件或者注解方式
  6. 创建程序启动类
  7. 注解扫描:在Spring Boot的主应用类上添加@MapperScan注解,用于扫描和注册Mapper接口。
  8. 使用Mapper接口:在需要使用数据库操作的地方,通过依赖注入或直接实例化Mapper接口,并调用其中的方法进行数据库操作。
    1

2.1 Mybatis整合实践

  • 创建模块:springboot-base-mybatis-05
  • pom 依赖:
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.5</version>
</parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.1</version></dependency><!-- 数据库相关配置启动器 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- druid启动器的依赖  --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId><version>1.2.18</version></dependency><!-- 驱动类--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.28</version></dependency></dependencies>
  • yml | yaml 配置文件
server:port: 80servlet:context-path: /
spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedruid:url: jdbc:mysql:///mybatis-exampleusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Drivermybatis:configuration:  # setting配置auto-mapping-behavior: fullmap-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.slf4j.Slf4jImpltype-aliases-package: com.wake.pojo # 配置别名mapper-locations: classpath:/mappers/*.xml # mapperxml位置
  • 测试:
  • controller
@RestController
@RequestMapping("user")
public class UserController {@Autowiredprivate UserMapper userMapper;@GetMappingpublic List<User> show(){List<User> userList = userMapper.queryList();return userList;}
}
  • mapper 接口 和 xml
public interface UserMapper {List<User> queryList();
}
<mapper namespace="com.wake.mapper.UserMapper"><select id="queryList" resultType="user">select * from user</select>
</mapper>
  • 启动类
    • 添加 @MapperScan("com.wake.mapper") 扫描接口包
@MapperScan("com.wake.mapper")
@SpringBootApplication
public class MybatisMain {public static void main(String[] args) {SpringApplication.run(MybatisMain.class,args);}
}

2.1 声明式事务整合配置

  • 导入依赖
 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

SpringBoot项目会自动配置一个 DataSourceTransactionManager,所以我们只需在方法(或者类)加上 @Transactional 注解,就自动纳入 Spring 的事务管理了

  • controller
@RestController
@RequestMapping("user")
public class UserController {//@Autowired//private UserMapper userMapper;@Autowiredprivate UserService userService;@GetMappingpublic List<User> show(){//List<User> userList = userMapper.queryList();userService.delete();return null;}
}
  • service
@Service
public class UserService {@Autowiredprivate UserMapper userMapper;@Transactionalpublic void delete(){int rows = userMapper.delete(4);System.out.println("rows" + rows);//int i = 1/0; // 报错}
}
  • mapper xml
    <delete id="delete">delete from user where id=#{id}</delete>

报错,事务回滚,没有执行删除
1

2.1 AOP整合配置

依赖导入:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>

直接使用aop注解即可:

1

@Component
@Aspect
@Order(5)
public class LogAdvice {@Before("execution(* com..service.*.*(..))")public void before(JoinPoint joinPoint){String className = joinPoint.getTarget().getClass().getSimpleName();String methodName = joinPoint.getSignature().getName();System.out.println(className + " :: " + methodName + " 开启执行!");}
}

1

三、项目打包和运行

在Spring Boot项目中添加spring-boot-maven-plugin插件是为了支持将项目打包成可执行的可运行jar包。
如果不添加spring-boot-maven-plugin插件配置,使用常规的java -jar命令来运行打包后的Spring Boot项目是无法找到应用程序的入口点,因此导致无法运行。

  • pom.xml 导入插件
<!--    SpringBoot应用打包插件-->
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>

1
可以在编译的target文件中查看jar包:
1

命令启动和参数说明

java -jar命令用于在Java环境中执行可执行的JAR文件。下面是关于java -jar命令的说明:

命令格式:java -jar  [选项] [参数] <jar文件名>
  1. -D<name>=<value>:设置系统属性,可以通过System.getProperty()方法在应用程序中获取该属性值。例如:java -jar -Dserver.port=8080 myapp.jar
  2. -X:设置JVM参数,例如内存大小、垃圾回收策略等。常用的选项包括:
    • -Xmx<size>:设置JVM的最大堆内存大小,例如 -Xmx512m 表示设置最大堆内存为512MB。
    • -Xms<size>:设置JVM的初始堆内存大小,例如 -Xms256m 表示设置初始堆内存为256MB。
  3. -Dspring.profiles.active=<profile>:指定Spring Boot的激活配置文件,可以通过application-<profile>.propertiesapplication-<profile>.yml文件来加载相应的配置。例如:java -jar -Dspring.profiles.active=dev myapp.jar
  • 启动和测试:
    1
    1

注意: -D 参数必须要在jar文件名字之前!否者不生效!


总结

web 与 springboot 打包区别

1

JDK8的编译环境 执行17高版本jar

1

  1. 设置编译的jdk环境为低版本环境:
  • 在Maven的pom.xml文件中,可以这样配置:
<properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target>
</properties>

jdk17编译出兼容jdk8的代码

  1. 设置运行的jdk环境为高版本环境
    修改环境变量为17的环境变量,这样既可以向下兼容项目A 又可以支持项目B,但是可能因为jdk环境不一样带来其它问题

【JDK】快速切换/更换JDK版本

  1. 使用docker容器, 容器内部指定每个项目的jdk版本,如在项目A指定jdk8 在项目B的容器指定jdk17

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

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

相关文章

云备份项目2

云备份项目 文章目录 云备份项目4. 服务端代码设计4.1 服务端工具类实现4.1.1 文件实用工具类设计4.1.2 Json实用工具类设计 4.2 服务端配置信息模块实现4.2.1 系统配置信息4.2.2 单例文件配置类设计 4.3 服务端数据管理模块实现4.3.1 备份数据类的实现4.3.2 数据管理类的设计 …

Js输入输出语句

输入语法 prompt("您想输入的是&#xff1f;")输出语法: 语法1: document.write(‘要出的内容’&#xff09; <body><script>document.write("你好")document.write("<h1>我是<h1>")</script> </body>作…

Yaml格式解析

文章目录 YAML格式介绍YAML格式解析 YAML格式介绍 YAML&#xff08;YAML Ain’t Markup Language&#xff09;是一种常用于配置文件的人类可读的数据序列化标准。它通常用于存储和传输数据&#xff0c;并且由于其简洁性、可读性和易于编写的特性&#xff0c;它经常被用于编写配…

frida主动调用函数获得数据保存写入到txt文件

1、获取数据到手机内存 function main(){Java.perform(function () {var result "";var flag true;var JavaString Java.use("java.lang.String");Java.choose("cn.xxx.xxxxx", {onMatch : function(instance) {for(var i 1;i<1000;i){if(…

蓝桥杯刷题(九)

1.三国游戏 代码 #输入数据 nint(input()) Xlilist(map(int,input().split())) Ylilist(map(int,input().split())) Zlilist(map(int,input().split())) #分别计算X-Y-Z/Y-Z-X/Z-X-Y并排序 newXli sorted([Xli[i] - Yli[i] - Zli[i] for i in range(n)],reverseTrue) newYli …

Java集合知识点(含源码)

在Java中&#xff0c;集合&#xff08;Collection&#xff09;是一种用于存储对象的数据结构&#xff0c;它提供了一种以更通用的方式存储和操作数据集合的方法。Java集合框架&#xff08;Java Collections Framework&#xff09;是一套提供了大量接口和类的体系&#xff0c;这…

【NTN 卫星通信】 TN和多NTN配合的应用场景

1 场景描述 此场景描述了农村环境&#xff0c;其中MNO (运营商TerrA)仅在城市附近提供本地地面覆盖&#xff0c;而MNO (SatA)提供广泛的NTN覆盖。SatA使用GSO轨道和NGSO轨道上的卫星。SatA与TerrA有漫游协议&#xff0c;允许:   所有TerrA用户的连接&#xff0c;当这些用户不…

【SecurityException: JCE cannot authenticate the provider BC 问题】自定义解决

SecurityException: JCE cannot authenticate the provider BC 问题 hutool.crypto.CryptoException: SecurityException: JCE cannot authenticate the provider BC 先分析异常描述解决方案 先分析异常的描述 JCE cannot authenticate the provider BC&#xff1a;在使用带…

git push解决办法:! [remote rejected] prod -> prod (pre-receive hook declined)

今天想把最近改的东西上传到Gogs上发版一下子的&#xff0c;但是发现有冲突合并不了&#xff0c;于是我切回自己的分支合并了prod&#xff0c;把冲突处理了一下子&#xff0c;还又增加了一点修改&#xff0c;push后.......又回到prod进行git push&#xff0c;哦豁~这就出了问题…

【Poi-tl Documentation】自定义行删除标签

前置说明&#xff1a; <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.1</version> </dependency>模板样式&#xff1a; 删除行表格测试.docx 实现思路&#xff1a;通过定制占位…

【每日力扣】40.组合总和II与701. 二叉搜索树中的插入操作

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害。 40.组合总和II 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为…

计算机网络——物理层(奈氏准则和香农定理)

计算机网络——物理层&#xff08;奈氏准则和香农定理&#xff09; 失真码间串扰奈氏准则&#xff08;奈奎斯特定理&#xff09;极限数据率 噪声信噪比香农定理奈氏准则和香农定理的区别 前面我们已经了解一些数据通信的基本知识&#xff0c;没有看过上一篇得小伙伴可以点击这里…

Android 系统的启动过程

Android 系统的启动流程&#xff1a; RomBoot&#xff08;只读存储器引导程序&#xff09;&#xff1a;这是设备上电时运行的初始软件。RomBoot执行基本的硬件初始化&#xff0c;确保硬件处于可以运行后续启动阶段的状态。这一阶段非常重要&#xff0c;因为它为整个启动过程奠定…

Educational Codeforces Round 163 (Rated for Div. 2) (A~C)

Educational Codeforces Round 163 (Rated for Div. 2) (A~C) 目录&#xff1a;A B C A题&#xff1a;Special Characters 标签: 暴力枚举&#xff08;brute force&#xff09;构造算法&#xff08;constructive algorithms&#xff09; 题目大意 构造一个字符串含有n个特殊…

LCD屏的应用

一、LCD屏应用 Linux下一切皆文件&#xff0c;我们的LCD屏再系统中也是一个文件&#xff0c;设备文件&#xff1a;/dev/fb0。 如果要在LCD屏显示数据&#xff0c;那我们就可以把数据写入LCD屏的设备文件。 1.显示颜色块 LCD屏分辨&#xff1a;800*480 像素 32位:说明一个像…

JAVA---学生管理系统

遍历字符串 ArrayList学习&#xff1a;

CCF 202009-3 点亮数字人生(拓扑排序)

题目背景 土豪大学的计算机系开了一门数字逻辑电路课&#xff0c;第一个实验叫做“点亮数字人生”&#xff0c;要用最基础的逻辑元件组装出实际可用的电路。时间已经是深夜了&#xff0c;尽管实验箱上密密麻麻的连线已经拆装了好几遍&#xff0c;小君同学却依旧没能让她的电路正…

【MySQL基础】MySQL基础操作三

文章目录 &#x1f349;1.联合查询&#x1f95d;笛卡尔积 &#x1f349;2.内连接&#x1f95d;查询单个数据&#x1f95d;查询多个数据 &#x1f349;3.外连接&#x1f349;4.自连接&#x1f349;5.合并查询 &#x1f349;1.联合查询 &#x1f95d;笛卡尔积 实际开发中往往数…

【软件测试】软件测试的基本概念和开发模型

1. 前言 在进行软件测试的学习之前,我们要了解软件测试一些基本概念. 这些基本概念将帮助我们更加明确工作的目标以及软件测试到底要做什么. 2. 软件测试的基本概念 软件测试的基本概念有3个,分别是需求,测试用例和BUG. 2.1 需求 这里的需求还可以分为 用户需求和软件需求,用…

python 第三方库(PyPinyin\shortuuid\json)

PyPinyin库 简介 PyPinyin库是一个支持中文转拼音输出的Python第三方库&#xff0c;它可以根据词组智能匹配最正确的拼音&#xff0c;并且支持多音字&#xff0c;简单的繁体, 注音&#xff0c;多种不同拼音/注音风格的转换。 安装 (framework-learn) C:\Users\zzg>pip …