76、SpringBoot 整合 MyBatis------使用 sqlSession 作为 Dao 组件(就是ssm那一套,在 xml 写sql)
就是 ssm 那套,在xml 上面写sql
★ 基于SqlSession来实现DAO组件的方式
- MyBatis提供的Starter会自动在Spring容器中配置SqlSession(其实SqlSessionTemplate实现类)、并将它注入其他组件(如DAO组件)- DAO组件可直接调用SqlSession的方法来操作数据库。- SqlSession调用insert()、update()、delete()、selectList()、selectOne()执行SQL语句时,如果SQL语句中没有占位符参数,就只要传入第1个参数——该参数代表要执行的SQL语句;如果要执行的SQL语句中带一个占位符参数,那就传入第2个参数——该参数用于为SQL语句中的占位符参数设置值 。 【无论是用insert、update、delete、selectXxx,第一个参数总是指定要执行的SQL语句的名字】。
▲ 开发方式
(1) 定义映射的对象类,非常普通的POJO,甚至无需任何注解。(2)定义DAO接口。(3)定义DAO实现类,该实现类使用SqlSession的方法来操作数据库。(4)使用XML Mapper文件来定义SQL语句、并为SQL语句指定名字。(5)配置XML Mapper文件的加载路径。# 指定MyBatis的XML Mapper的加载路径mybatis.mapper-locations=classpath*:org/crazyit/app/dao/*.xml# 指定为org.crazyit.app.domain下的所有类指定别名,别名规则是类名首字母小写mybatis.type-aliases-package=org.crazyit.app.domain
POJO 即 Plain Old Java Object 就是一个普通,平凡的Java对象。
POJO(Plain Old Java Object)是指普通的Java对象,它是一个简单的、基本的Java类,没有任何特殊要求或限制。POJO类通常只包含私有字段、公共访问方法(getter和setter)以及一些自定义的方法。
代码演示:
就是 ssm 那套,在xml 上面写sql
这个没什么好说的,就是比较旧的mybatis
User 类

UserDao 接口

UserDaoImpl 实现类


唯一注意一点的就是:如图
该方法: List selectList(String var1, Object var2); 参数是一个 Object,所以如果有多个参数要传给 selectList , key可以使用 Map 包起来

UserMapper.xml
命名空间对应的时候UseDao

创建和UserDao对应的Mapper文件,用来写sql,这个idea版本可以这样快速创建

UserDaoTest
测试类

application.properties

完整代码:
User
package cn.ljh.app.domain;import lombok.Data;//普通的java类
@Data
public class User
{private Integer id;private String name;private String password;private int age;public User(){}public User(Integer id, String name, String password, int age){this.id = id;this.name = name;this.password = password;this.age = age;}@Overridepublic String toString(){return "User{" +"id=" + id +", name='" + name + '\'' +", password='" + password + '\'' +", age=" + age +'}';}
}
UserDao
package cn.ljh.app.dao;
import cn.ljh.app.domain.User;
import org.apache.ibatis.annotations.*;
import java.util.List;public interface UserDao
{//增int save(User user);//删int deleteById(Integer id);//根据名字模糊查询List<User> findByNameLike(String namePattern);//根据年龄区间进行范围查询List<User> findByAgeBetween(@Param("startAge") int startAge, @Param("endAge") int endAge);}
UserDaoImpl
package cn.ljh.app.dao.impl;import cn.ljh.app.dao.UserDao;
import cn.ljh.app.domain.User;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;import java.util.List;
import java.util.Map;//作为dao组件,把这个类交给容器管理
@Repository
public class UserDaoImpl implements UserDao
{private final SqlSession sqlSession;//通过有参构造器进行依赖注入public UserDaoImpl(SqlSession sqlSession){this.sqlSession = sqlSession;}//UserMapper.xml 的命名空间private final static String namespace = "cn.ljh.app.dao.UserDao.";//增@Overridepublic int save(User user){//insert 、 delete 、 update 、select 等方法的第一个参数一直都是 SQL 语句的 ID ,就是命名空间int insert = sqlSession.insert(namespace + "save", user);return insert;}//删@Overridepublic int deleteById(Integer id){int delete = sqlSession.delete(namespace + "deleteById", id);return delete;}//根据名字模糊查询@Overridepublic List<User> findByNameLike(String namePattern){List<User> users = sqlSession.selectList(namespace + "findByNameLike", namePattern);return users;}//根据年龄区间进行范围查询@Overridepublic List<User> findByAgeBetween(int startAge, int endAge){//该方法:<E> List<E> selectList(String var1, Object var2); 参数是一个 Object//所以如果有多个参数要传给 selectList , key可以使用 Map 包起来List<User> users = sqlSession.selectList(namespace + "findByAgeBetween",Map.of("startAge", startAge, "endAge", endAge));return users;}
}
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="cn.ljh.app.dao.UserDao"><insert id="save">insert into user_inf values (null , #{name} , #{password} , #{age})</insert><delete id="deleteById">delete from user_inf where user_id = #{id}</delete><select id="findByNameLike" resultType="user">select user_id as id , name , password , age from user_inf where name like #{namePattern}</select><select id="findByAgeBetween" resultType="cn.ljh.app.domain.User">select user_id as id ,name , password , age from user_inf where age between #{startAge} and #{endAge}</select>
</mapper>
UserDaoTest
package cn.ljh.app;import cn.ljh.app.dao.UserDao;
import cn.ljh.app.domain.User;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.ValueSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class UserDaoTest
{@Autowiredprivate UserDao userDao;//添加user对象@ParameterizedTest@CsvSource({"aa,xxx,2", "bb,xxx,3"})public void testSave(String name, String password, int age){//没有id,save就是添加int save = userDao.save(new User(null, name, password, age));System.err.println(save);}//根据id删除用户对象@ParameterizedTest@ValueSource(ints = {17})public void testDelete(Integer id){userDao.deleteById(id);}//根据名字模糊查询@ParameterizedTest@ValueSource(strings = {"孙%", "%精"})public void testFindByNameLike(String namePattern){List<User> users = userDao.findByNameLike(namePattern);users.forEach(System.err::println);}//根据年龄区间进行范围查询@ParameterizedTest@CsvSource({"15,20", "500,1000"})public void testFindByAgeBetween(int startAge, int endAge){List<User> users = userDao.findByAgeBetween(startAge, endAge);users.forEach(System.err::println);}
}
application.properties
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456# 如果想看到SQL语句输出,需要将Mapper组件的日志级别设置为debug
logging.level.cn.ljh.app.dao=debug# 指定 MyBatis 的 XML Mapper 的加载路径
mybatis.mapper-locations=classpath*:cn/ljh/app/dao/*.xml
# 指定为 cn.ljh.app.domain 下的所有类指定别名,别名规则是类名首字母小写
# 就是说xml的这个 resultType="user"
mybatis.type-aliases-package=cn.ljh.app.domain
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 https://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>2.4.5</version></parent><groupId>cn.ljh</groupId><artifactId>MyBatis_sqlSession</artifactId><version>1.0.0</version><name>MyBatis_sqlSession</name><properties><java.version>11</java.version></properties><dependencies><!-- 导入 MyBatis 整合 spring boot 的 starter --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</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><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>相关文章:
76、SpringBoot 整合 MyBatis------使用 sqlSession 作为 Dao 组件(就是ssm那一套,在 xml 写sql)
就是 ssm 那套,在xml 上面写sql ★ 基于SqlSession来实现DAO组件的方式 - MyBatis提供的Starter会自动在Spring容器中配置SqlSession(其实SqlSessionTemplate实现类)、并将它注入其他组件(如DAO组件)- DAO组件可直接…...
【ROS】RViz、Gazebo和Navigation的关系
1、RViz RViz(Robot Visualization,机器人可视化)是一个用于可视化机器人系统的开源工具,用于显示和调试机器人的传感器数据、状态信息和运动规划等。它是ROS(Robot Operating System)的一部分,是ROS中最常用的可视化工具之一。 RViz:“我们不生产数据只做数据的搬运…...
智能井盖:提升城市井盖安全管理效率
窨井盖作为城市基础设施的重要组成部分,其安全管理与城市的有序运行和群众的生产生活安全息息相关,体现城市管理和社会治理水平。当前,一些城市已经将智能化的窨井盖升级改造作为新城建的重要内容,推动窨井盖等“城市部件”配套建…...
JavaWeb开发-06-SpringBootWeb-MySQL
一.MySQL概述 1.安装、配置 官网下载地址:https://dev.mysql.com/downloads/mysql/ 2.数据模型 3.SQL简介 二.数据库设计-DDL 1.数据库 官网:http:// https://www.jetbrains.com/zh-cn/datagrip/ 2.表(创建、查询、修改、删除) #…...
十六、垃圾回收相关概念
目录 一、System.gc()的理解二、内存溢出和内存泄漏2、内存泄漏 三、Stop the World1、什么是 stop the word ? 四、垃圾回收的并行和并发1、并发和并发2、垃圾回收的并行和并发 五、安全点与安全区域1、什么是安全点?2、安全区域 六、强引用(不可回收&…...
hive、spark、presto 中的增强聚合-grouping sets、rollup、cube
目录 1、什么是增强聚合和多维分析函数? 2、grouping sets - 指定维度组合 3、with rollup - 上卷维度组合 4、with cube - 全维度组合 5、Grouping__ID、grouping() 的使用场景 6、使用 增强聚合 会不会对查询性能有提升呢? 7、对grouping sets、…...
elasticsearch bulk 批量操作
1:bulk 是 elasticsearch 提供的一种批量增删改的操作API bulk 对 JSON串 有着严格的要求。每个JSON串 不能换行 ,只能放在同一行,同时, 相邻的JSON串之间必须要有换行 (Linux下是\n;Window下是\r\n&#…...
力扣11、 盛最多水的容器
方法一:双指针 考察: 贪心、数组、双指针 说明 本题是一道经典的面试题,最优的做法是使用「双指针」。如果读者第一次看到这题,不一定能想出双指针的做法。 复杂度分析 时间复杂度:O(N),双指针总计最多…...
IIC协议详解
目录 1.IIC协议概述 2.IIC总线传输 3.IIC-51单片机应用 1.起始信号 2.终止信号 3.应答信号 4.数据发送 4.IIC-32单片机应用 用到的库函数: 1.IIC协议概述 IIC全称Inter-Integrated Circuit (集成电路总线)是由PHILIPS公司在80年代开发的两线式串行总线&…...
element ui-表头自定义提示框
版本 “element-ui”: “^2.15.5”,需求:鼠标悬浮到该列表头,显示提示框代码 <el-table:data"xxxx"><el-table-column label"序号" width"40" type"index" /><el-table-columnv-for"(ite…...
Python 图形化界面基础篇:创建顶部菜单
Python 图形化界面基础篇:创建顶部菜单 引言 Tkinter 库简介步骤1:导入 Tkinter 模块步骤2:创建 Tkinter 窗口步骤3:创建顶部菜单栏步骤4:处理菜单项的点击事件步骤5:启动 Tkinter 主事件循环 完整示例代码…...
java实现十大排序算法
文章目录 冒泡排序选择排序插入排序希尔排序归并排序快速排序堆排序桶排序基数排序计数排序验证各个排序的时间复杂度和空间复杂度 冒泡排序 冒泡排序(Bubble Sort)是一种简单的比较排序算法,它的基本思想是重复地交换相邻的两个元素&#x…...
Linux日志管理-logrotate(crontab定时任务、Ceph日志转储)
文章目录 一、logrotate概述二、logrotate基本用法三、logrotate运行机制logrotate参数 四、logrotate是怎么做到滚动日志时不影响程序正常的日志输出呢?Linux文件操作机制方案一方案二 五、logrotate实战--Ceph日志转储参考 一、logrotate概述 logrotate是一个用于…...
用PHP异步协程控制python爬虫脚本,实现多协程分布式爬取
背景 公司需要爬取指定网站的产品数据。但是个人对python的多进程和协程不是特别熟悉。所以,想通过php异步协程,发起爬取url请求控制python爬虫脚本,达到分布式爬取的效果。 准备 1.准备一个mongodb数据库用于存放爬取数据2.引入flask包&a…...
VUE3写后台管理(3)
VUE3写后台管理(3) 1.环境1.node2.vite3.Element-plus4.vue-router5.element icon6.less7.vuex8.vue-demi9.mockjs10.axios11.echarts 2.首页1.布局Main2.头部导航栏CommonHeader3.左侧菜单栏CommonLeft4.首页Home1.从后端获取数据显示到前端table的三种…...
机器学习笔记之最优化理论与算法(十二)无约束优化问题——共轭梯度法
机器学习笔记之最优化理论与方法——共轭梯度法 引言回顾:共轭方向法的重要特征线性共轭梯度法共轭方向公式的证明过程 关于线搜索公式中参数的化简关于线搜索公式中步长部分的化简关于线搜索公式中共轭方向系数的化简参数化简的目的 非线性共轭梯度法(FR,PRP方法)关…...
JVM中的java同步互斥工具应用演示及设计分析
1.火车站售票系统仿真 某火车站目前正在出售火车票,共有50张票,而它有3个售票窗口同时售票,下面设计了一个程序模拟该火车站售票,通过实现Runnable接口实现(模拟网络延迟)。 伪代码: Ticket类…...
数据治理-数据质量
实现数据质量的前提就是数据本身是可靠和可信的。 导致数据质量低下的因素 组织缺乏对低质量数据影响的理解,缺乏规划、孤岛式系统设计、不一致的开发过程、不完整的文档、缺乏标准或缺乏治理等。 所有组织都会遇到与数据质量有关的问题。数据质量需要跨职能的承诺…...
[sqoop]hive3.1.2 hadoop3.1.1安装sqoop1.4.7
参考: Hadoop3.2.4Hive3.1.2sqoop1.4.7安装部署_hadoop sqoop安装_alicely07的博客-CSDN博客 一、安装 1、解压 tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /home/data_warehouse/module mv sqoop-1.4.7.bin__hadoop-2.6.0 sqoop-1.4.72、配置文件 sqoop-env.s…...
js事件的详细介绍
11.事件 1.什么是事件 js属于事件驱动编程,把驱动,执行,调用通过一些交互,触发一些函数事件:发起-->执行绑定事件-->触发事件on 绑定 emit触发 off解绑2.事件分类 鼠标事件 点击事件 onclick 双击事件 ondblclick 按下事件 onmousedown 抬起事件 onmouseup 鼠标进…...
为什么你的USB设备总接触不良?A/B型接口物理结构对比与耐久性测试
为什么你的USB设备总接触不良?A/B型接口物理结构对比与耐久性测试 每次给手机充电都要反复调整角度,打印机线稍微碰一下就断开连接——这些恼人的USB接口问题,本质上都是物理结构设计的差异在作祟。作为消费电子领域最基础的连接标准…...
手把手教你用深信服备份系统做整机恢复:从PXE到U盘启动的保姆级避坑指南
深信服整机恢复实战:PXE与U盘启动的深度避坑手册 当服务器突然宕机,硬盘彻底损坏时,整机恢复能力就是IT工程师的救命稻草。深信服备份系统的裸机恢复功能,能在没有操作系统的"裸机"上直接还原整个系统环境——但实际操作…...
如何安全升级Cura软件版本:从风险规避到价值创造的全流程指南
如何安全升级Cura软件版本:从风险规避到价值创造的全流程指南 【免费下载链接】Cura 3D printer / slicing GUI built on top of the Uranium framework 项目地址: https://gitcode.com/gh_mirrors/cu/Cura UltiMaker Cura作为全球最受欢迎的3D打印切片软件&…...
【adb端口5555】烽火hg680系列安卓9线刷全攻略:告别强制升级与花屏困扰
1. 烽火HG680系列机顶盒的痛点与解决方案 最近在折腾烽火HG680-GY和HG680-GC这两款机顶盒的朋友应该都深有体会,官方系统用着用着就会弹出强制升级提示,有时候还会莫名其妙出现花屏问题。作为一个折腾过不下20台烽火盒子的老玩家,我太理解这种…...
OBS高级计时器:提升直播专业度的时间管理工具
OBS高级计时器:提升直播专业度的时间管理工具 【免费下载链接】obs-advanced-timer 项目地址: https://gitcode.com/gh_mirrors/ob/obs-advanced-timer 在直播行业竞争日益激烈的今天,精准的时间控制是提升直播质量的关键因素之一。OBS高级计时器…...
M.2 SSD硬件电路设计实战:从接口规范到高速信号布局
1. M.2 SSD硬件设计入门:从接口规范说起 第一次接触M.2 SSD设计时,我被各种接口类型和协议搞得晕头转向。现在回想起来,其实只要抓住几个关键点就能快速上手。M.2接口作为Intel推出的新一代存储标准,已经全面取代了老旧的mSATA接口…...
别再只调参了!深入RepVgg设计思想,用CCFF模块优化你的模型特征融合效率
深入解析CCFF模块:用RepVgg思想重构跨尺度特征融合技术 在计算机视觉领域,特征融合一直是提升模型性能的关键环节。传统方法如FPN、PANet虽然有效,但在实时性要求高的场景下往往成为计算瓶颈。今天我们要探讨的CCFF(Cross-scale C…...
告别Transformer!用PyTorch从零实现MLP-Mixer图像分类(附完整代码与调参技巧)
告别Transformer!用PyTorch从零实现MLP-Mixer图像分类(附完整代码与调参技巧) 在计算机视觉领域,Transformer架构近年来风头无两,但你是否想过——仅用多层感知机(MLP)也能构建高性能视觉模型&a…...
ChatTTS 安装与部署实战:从零搭建到性能调优
最近在做一个语音合成的项目,选型时看中了 ChatTTS,它开源的特性、不错的音质和可控性很吸引人。但在实际动手安装和部署时,发现从个人电脑跑起来到服务器上稳定服务,中间有不少坑。今天就把我这一路从零搭建到性能调优的实战经验…...
盘点那些提高作物耐盐性的方法(一)
本文内容速览:随着全球气候变化加剧和不合理灌溉的持续影响,土壤次生盐渍化问题日益突出,许多地区的耕地盐碱化程度不断加重。传统手段在应对作物的高盐胁迫时逐渐显现出效果上限——部分作物的耐盐性改良已进入平台期,单纯依靠农…...
