SpringBoot中级
02 - SpringBoot中级
本章目录
- SpringBoot整合JdbcTemplate
- SpringBoot整合MyBatis
- SpringBoot整合MyBatis-Plus
- 分页插件的集成
1.0 SpringBoot整合JdbcTemplate
Spring Framework对数据库的操作在JDBC上面做了深层次的封装,通过依赖注入功能,可以将 DataSource 注册到JdbcTemplate之中,使我们可以轻易的完成对象关系映射,并有助于规避常见的错误,在SpringBoot中我们可以很轻松的使用它。
特点:
- 速度快,对比其它的ORM框架而言,JDBC的方式无异于是最快的
- 配置简单,Spring自家出品,几乎没有额外配置
置 - 学习成本低,毕竟JDBC是基础知识,JdbcTemplate更像是一个DBUtils
1.1 整合JdbcTemplate
在 pom.xml
中添加对 JdbcTemplate
的依赖
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>
在application.properties
中添加如下配置。值得注意的是,SpringBoot默认会自动配置DataSource
,它将优先采用HikariCP
连接池,如果没有该依赖的情况则选取tomcat-jdbc
,如果前两者都不可用最后选取Commons DBCP2
。通过spring.datasource.type属性可以指定其它种类的连接池
# 数据源
spring:datasource:url: jdbc:mysql:///boot?useUnicode=true&characterEncoding=UTF-8driver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword:
启动项目,通过日志,可以看到默认情况下注入的是HikariDataSource
2022-11-16 09:14:46.329 INFO 16472 --- [ main] com.xja.Day03Application : Starting Day03Application using Java 1.8.0_201 on DESKTOP-TTS40QH with PID 16472 (E:\课程记录\T6\03-SpringBoot整合\day03\target\classes started by lenovo in E:\课程记录\T6\03-SpringBoot整合\day03)
2022-11-16 09:14:46.336 INFO 16472 --- [ main] com.xja.Day03Application : No active profile set, falling back to 1 default profile: "default"
2022-11-16 09:14:47.614 INFO 16472 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JDBC repositories in DEFAULT mode.
2022-11-16 09:14:47.624 INFO 16472 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 5 ms. Found 0 JDBC repository interfaces.
2022-11-16 09:14:48.329 INFO 16472 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2022-11-16 09:14:48.342 INFO 16472 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2022-11-16 09:14:48.342 INFO 16472 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.68]
2022-11-16 09:14:48.559 INFO 16472 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2022-11-16 09:14:48.560 INFO 16472 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2156 ms
2022-11-16 09:14:48.977 WARN 16472 --- [ main] ion$DefaultTemplateResolverConfiguration : Cannot find template location: classpath:/templates/ (please add some templates, check your Thymeleaf configuration, or set spring.thymeleaf.check-template-location=false)
2022-11-16 09:14:49.090 INFO 16472 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2022-11-16 09:14:49.283 INFO 16472 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2022-11-16 09:14:49.586 INFO 16472 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2022-11-16 09:14:49.596 INFO 16472 --- [ main] com.xja.Day03Application : Started Day03Application in 4.047 seconds (JVM running for 7.288)
1.2 案例测试
创建一张 t_user
的表
CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`age` int(1) DEFAULT NULL,`description` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
实体类
package com.xja.entity;import lombok.Data;@Data
public class Student {private Integer id;private String name;private int age;private String description;
}
控制层
package com.xja.controller;
import java.util.List;@Controller
@RequestMapping("/student")
public class StudentController {@Autowiredprivate StudentService studentService;/*** 查询*/@RequestMapping("queryStudentList")public String queryStudentList(Model model){List<Student> list = studentService.queryStudentList();model.addAttribute("list",list);return "student_list";}/*** 增加跳转*/@RequestMapping("/toAdd")public String toAdd(){return "student_add";}/*** 增加*/@RequestMapping("/saveStudent")public String saveStudent(Student student){studentService.saveStudent(student);return "redirect:/student/queryStudentList";}@RequestMapping("/deleteStudent")public String deleteStudent(Integer id){studentService.deleteStudent(id);return "redirect:/student/queryStudentList";}
}
业务层省略->持久化层
package com.xja.dao;
import java.util.List;@Repository //老实持久层的标记 同 @Controller @Service 一起的
public class StudentDao {@Autowiredprivate JdbcTemplate jdbcTemplate;public List<Student> queryStudentList() {String sql = "select * from student";List<Student> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Student.class));return list;}//单个对象 queryForObjectpublic void saveStudent(Student student) {String sql = "insert into student (name,age,description) value (?,?,?)";jdbcTemplate.update(sql,student.getName(),student.getAge(),student.getDescription());}public void deleteStudent(Integer id) {String sql = "delete from student where id = ?";jdbcTemplate.update(sql,id);}
}
查询页面
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" th:href="@{/css/bootstrap.min.css}"><script type="text/javascript" th:src="@{/js/jquery-3.6.0.js}"></script><script type="text/javascript" th:src="@{/js/bootstrap.min.js}"></script><script>$(function () {$("#save").click(function () {window.location = "toAdd";})})function deletes(id){alert(id);}</script>
</head>
<body><button class="btn btn-success" id="save">增加</button><table class="table table-bordered" style="width: 800px"><tr><th>序号</th><th>姓名</th><th>年龄</th><th>描述</th><th>操作</th></tr><tr th:each="stu,i:${list}"><td th:text="${i.count}"></td><td th:text="${stu.name}"></td><td th:text="${stu.age}"></td><td th:text="${stu.description}"></td><td><button class="btn btn-sm btn-danger" th:onclick="|deletes(${stu.id})|">删除</button><a th:href="|deleteStudent?id=${stu.id}|">删除</a></td></tr></table>
</body>
</html>
效果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xZxCmMa8-1668683830489)(images/TlVz6Nv0enOIGdLDmJuhCqSw5wT8yWjQeeEQUJzQ52Q.png)]
2.0 SpringBoot整合MyBatis
2.1 构建项目
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S9FRi8Y3-1668683830490)(images/xJRg9_mqMAmy3TfT8a_Nx9tJfHK4uXdZ9OKa-rmQew0.png)]
启动
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wfvH9w6G-1668683830491)(images/MwKissBG6NwU_kQ26aRj3RfNsSBr5It6PVsxiCqc_x0.png)]
原因:没有配置数据源
# 数据源
spring:datasource:url: jdbc:mysql:///boot?useUnicode=true&characterEncoding=UTF-8driver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword:type: com.zaxxer.hikari.HikariDataSourcehikari:# 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 默认:30秒connection-timeout: 30000# 最小连接数minimum-idle: 5# 最大连接数maximum-pool-size: 20# 事务自动提交auto-commit: true# 连接超时的最大时长(毫秒),超时则被释放(retired),默认:10分钟idle-timeout: 600000# 连接池名字pool-name: DateSourceHikariCP# 连接的生命时长(毫秒),超时而且没被使用则被释放(retired),默认:30分钟 1800000msmax-lifetime: 1800000#配置
mybatis:type-aliases-package: com.xja.entity#如果文件接口和mapper名字及路径都相同则可以省略,否则加上mapper-locations: classpath*:/mapper/*.xml
dao 转化为 mapper
@Mapper
public interface StudentMapper {List<Student> queryStudentList();void saveStudent(Student student);void deleteStudent(Integer id);
}
mapper
<?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.xja.mapper.StudentMapper"><insert id="saveStudent" parameterType="com.xja.entity.Student">insert into student (name,age,description) value (#{name},#{age},#{description})</insert><delete id="deleteStudent" parameterType="integer">delete from student where id = #{id}</delete><select id="queryStudentList" resultType="com.xja.entity.Student">select * from student</select>
</mapper>
3.0 SpringBoot整合MyBatis-Plus
https://baomidou.com/
MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LfZ9sg8l-1668683830492)(images/_ZAh4lELV0uvYCX7eg_uymLDb0A7h8sVdhKvftuB0fc.png)]
依赖 mybatis plus 部分依赖
<!-- mp -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.1</version>
</dependency>
<!-- 代码生成工具 -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.4.1</version>
</dependency>
<!-- 代码生成模板 -->
<dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.2</version>
</dependency>
代码生成器
office
配置文件
# 数据源
spring:datasource:url: jdbc:mysql:///boot?useUnicode=true&characterEncoding=UTF-8driver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword:type: com.zaxxer.hikari.HikariDataSourcehikari:# 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 默认:30秒connection-timeout: 30000# 最小连接数minimum-idle: 5# 最大连接数maximum-pool-size: 20# 事务自动提交auto-commit: true# 连接超时的最大时长(毫秒),超时则被释放(retired),默认:10分钟idle-timeout: 600000# 连接池名字pool-name: DateSourceHikariCP# 连接的生命时长(毫秒),超时而且没被使用则被释放(retired),默认:30分钟 1800000msmax-lifetime: 1800000#添加mybatis-plus配置
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印SQL执行详情type-aliases-package: com.xja.entity
SpringBoot中级相关推荐
- SpringBoot拦截器_初级程序猿→中级程序猿必经之路_一蓑烟雨任平生
文章目录 前言 一.拦截器原理 二.拦截器的快速使用步骤 1.定义拦截器 2.配置拦截器 三 .解决问题 1.解决静态资源被拦截问题 2.拦截器使用实例 2.取消拦截操作(自定义注解) 总结 前言 刚 ...
- 一套基于 SpringBoot 的完整高并发电商系统,拿去面试简直不要太好用!
如何反驳"99% 的 Java 程序员都是 Spring 程序员"这句话? 答案是不能. 互联网发展至今,站在巨人肩膀上编程像一日三餐一样寻常.Spring Boot 的确凭一己之 ...
- SpringBoot 操作 ElasticSearch 详解(万字长文)
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:超级小豆丁 http://www.mydlq.club/ar ...
- springboot 单例_如何实现一个单例及优化
前言 社长,一个爱学习,爱分享的程序猿,始终相信,付出总会有回报的. 知识改变命运,学习成就未来.爱拼才会赢! 程序猿学社的GitHub,已整理成相关技术专刊,欢迎 Star:. https:// g ...
- springboot实体映射到数据库_SpringBoot 操作 ElasticSearch 详解
点击上方☝SpringForAll社区 轻松关注!及时获取有趣有料的技术文章 本文来源:http://www.mydlq.club/article/64/ 一.ElasticSearch 简介 . 1 ...
- SpringBoot整合银联支付
看完不懂你来喷我 项目需要接入新的支付渠道:银联无跳转支付,花了点时间接入成功,这里发布一个踩坑记录吧,把过程中的问题都会给大家分享下QAQ,看完不懂你来喷我o(╯□╰)o 博客中有接入其他支付 支付 ...
- 基于Java+SpringBoot+Vue+uniapp前后端分离图书阅读系统设计与实现
博主介绍:✌全网粉丝3W+,全栈开发工程师,从事多年软件开发,在大厂呆过.持有软件中级.六级等证书.可提供微服务项目搭建.毕业项目实战.项目定制✌ 博主作品:<微服务实战>专栏是本人的实战 ...
- MySql从入门到中级到事务
目录 入门操作 中级操作 事务 1.事务的定义 2.例子入门 3.事务初体验 springboot初识事务 1.不使用事务 2.添加事务 @Transactional常用参数 入门操作 建立数据库 c ...
- 基于Java+SpringBoot+Vue前后端分离商城系统设计与实现
博主介绍:✌全网粉丝3W+,全栈开发工程师,从事多年软件开发,在大厂呆过.持有软件中级.六级等证书.可提供微服务项目搭建与毕业项目实战.定制.远程✌ 博主作品:<微服务实战>专栏是本人的实 ...
最新文章
- 如何datagrid分页保持每页先前选择的checkbox的状态?
- VMware Server使用经验记录
- CentOS 7 使用Google-Authenticator进行多因素认证
- NET 提供了执行异步操作的三种模式
- neu坐标系和xyz坐标系转换_ArcGIS投影坐标系下坐标转换成地理坐标系经纬度
- oracle 存储过程导出sql语句 导出为文件
- 网易有道词典 怎么在 pdf 上取词翻译
- python清明节作业
- 如何实现在直播中播放音频文件
- jvm调优五:jvm调优工具和调优实战
- 【BSV动态】VXPASS与世卫组织合作为莱索托提供数字疫苗监测服务
- 批量作业调度工具 Taskctl 定时器及模块之间的区别
- dayjs 中文文档
- php 获取 知乎,php - 如何获取知乎日报里的图片?
- basemap生成地图散点图
- 可以在手机制作游戏的软件
- 常用python组件包
- 医药生物行业深度报告:医药高端制造系列报告一,中国制造崛起,特色原料药受益显著(20210103).PDF
- NLP自然语言处理入门学习笔记(一)
- 蔡崇信:我为什么敢放弃580万年薪 拿月薪500跟马云
热门文章
- 初级会计难吗,用不用报班,自学可以吗?速看!
- dht11温湿度传感器特点及使用介绍
- 27 种确定性预测评估指标(Python实现)
- 全国专业技术人员计算机应用能力考试广东,广东省人事厅关于全国专业技术人员计算机应用能力考试扩充科目(模块)有关问题的通知...
- 关于数据库的表如何删除空行
- Python核心编程(一)
- fjksldajfmlsdmfldsalf;md;lsfml;sdmfl;sad
- CMake安装或CMake Error at CMakeLists
- SinoBBD承德德鸣3号楼数据中心获CQC最高等级机房认证
- 2019年下半年教师资格中学《教育知识与能力》真题与参考答案