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# 指定 MyBatisXML 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>

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

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

相关文章

前端-防止多次点击

前端-防止多次点击 原理&#xff1a;设置一个状态变量&#xff0c;为true的时候才能触发&#xff0c;false不能触发&#xff0c;运用setTimeout延时修改状态变量状态&#xff0c;达到不能连点的效果。 注释&#xff1a; 这里封装了一个js文件 全局注册 用的时候比较方便 1.封…

js-nginx配置字段适配前端服务

当我们有这样一个需求&#xff0c;前端同一套代码&#xff0c;但要根据一些特殊字段展示不同的内容&#xff0c;比如我们有一个场id&#xff0c;暂时这个场id放在前端&#xff0c;后端根据这个场id返回不同的数据&#xff0c;这里前端部署用的是yaml文件&#xff0c;平台是ranc…

如何使用Python构建OTP验证系统?

即使您的密码被盗&#xff0c;OTP验证系统也可以充当安全的关键要素。它让您无需记住密码&#xff0c;充当额外的安全层&#xff0c;并降低了网络钓鱼的风险。 不妨学习用Python建立一个OTP验证系统&#xff0c;它会向您的手机号码发送一个OTP&#xff0c;有效期只有两分钟&am…

目标检测YOLO实战应用案例100讲-机载SAR复杂场景目标高效检测方法研究(续)

目录 3.3 实验分析 3.3.1 实验设置 3.3.2 实验结果 3.3.3 性能分析 SAR复杂场景高效成像检测 <

linux 文件锁

建议锁,强制锁,记录锁的概念 建议锁&#xff1a; 如果某一个进程对一个文件持有一把锁之后&#xff0c;其他进程仍然可以直接对文件进行操作(open, read, write)而不会被系统禁止&#xff0c;即使这个进程没有持有锁。只是一种编程上的约定。建议锁只对遵守建议锁准则的进程生…

知识付费平台开发技术实践:构建数字学习的未来

引言 知识付费平台的兴起正在塑造着数字学习的未来。本文将介绍一些关键的技术实践&#xff0c;帮助开发者构建强大的知识付费平台&#xff0c;提供出色的数字学习体验。 1. 选择适当的技术栈 在开始知识付费平台的开发之前&#xff0c;首要任务是选择适当的技术栈。这包括…

TS中的数据类型

一、number类型 let c: number; c 10; c "hello"; // 不能复制string类型 二、string类型 let d: string; d "hello"; d 10; // 不能复制number类型 三、boolean类型 let e: boolean true; e false; e 10; // 不能赋值true和false以外的值 四…

嵌入式裸机轻量级架构探索总结

为什么会想着探索下嵌入式裸机的架构呢&#xff1f;是因为最近写了一个项目&#xff0c;项目开发接近尾声时&#xff0c;发现了一些问题&#xff1a; 1、项目中&#xff0c;驱动层和应用层掺杂在一起&#xff0c;虽然大部分是应用层调用驱动层&#xff0c;但是也存在驱动层调用…

七、图覆盖

工程学中的很多原理和打棒球一样。你不一定非常强壮才能打出全垒打&#xff0c;你只需要打在球的正中心。 7.1 概述 有向图是许多覆盖准则的基础。边的初始节点有时被称为前驱节点&#xff0c;终止节点被称为后继节点&#xff0c;路径是一个节点序列。 测试路径&#xff1a;…

【运维面试100问】(二)你最擅长什么?对某某擅长吗?---请设计一个符合公司使用的lvs架构

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

笔试面试相关记录(4)

&#xff08;1&#xff09;实现防火墙的主流技术有哪些&#xff1f; 实施防火墙主要采用哪些技术 - 服务器 - 亿速云 (yisu.com) &#xff08;2&#xff09; char arr[][2] {a, b, c, d}; printf("%d", *(arr1)); 输出的是谁的地址&#xff1f;字符c 测试代码如下…

ThreeJS-3D教学一基础场景创建

Three.js 是一个开源的 JS 3D 图形库&#xff0c;用于创建和展示高性能、交互式的 3D 图形场景。它建立在 WebGL 技术之上&#xff0c;并提供了丰富的功能和工具&#xff0c;使开发者可以轻松地构建令人惊叹的 3D 可视化效果。 Three.js 提供了一套完整的工具和 API&#xff0…

JUC中创建的组件 多线程使用“哈希表”

JUC中创建的组件 JUC中创建的组件这些内容都不太常用&#xff0c;偶尔用到面试的时候&#xff0c;偶尔用到&#xff01;到时候自行查找即可&#xff0c;本文主要来快速的过一下&#xff0c;留个印象即可~ JUC&#xff08;java.util.concurrent&#xff09;和多线程相关的工具…

uni-app微信小程序canvas中使用canvasToTempFilePath在手机上导出图片尺寸与实际不符

问题描述&#xff1a;比如图片的尺寸是1125*2001像素&#xff0c;这样用微信开发者工具下载下来的图片尺寸是1125*2001像素&#xff0c;用不同的手机去操作&#xff0c;下载出来的图片尺寸都不一样&#xff0c;和原图片尺寸差距很大。 解决方案&#xff1a;canvas写入的时候是…

python从入门到精通(一)

自己也有三四年的码龄了&#xff0c;目前&#xff0c;重拾起自己的博客&#xff0c;记录自己的学习笔记&#xff0c;为大家提供优质内容&#xff0c;也来巩固自己的学习内容。 很开心也成功成为了一名研究生&#xff0c;张张的研究方向是图像处理和计算机视觉这一块&#xff0c…

C++QT 作业8

#include "mywind.h" #include "ui_mywind.h" #include <iostream> #include <QIcon> #include <QLabel> #include <QLineEdit> #include <QDebug>//信息调试类 用于输出数据 Mywind::Mywind(QWidget *parent): QWidget(pa…

自动化测试---选择元素

第一个自动化测试脚本 from selenium import webdriver from selenium.webdriver.chrome.service import Service# 创建 WebDriver 对象&#xff0c;指明使用chrome浏览器驱动 wd webdriver.Chrome(serviceService(rD:\eg浏览器下载文件\chromedriver-win64\chromedriver.exe…

python3.11版本pip install ddddocr调用时报错got an unexpected keyword argument ‘det‘ 解决

一、如图出现如下问题 ddddocr.__init__() got an unexpected keyword argument det出现问题原因&#xff1a;python3.11默认安装版本就旧版的ddddocr1.0的&#xff0c;所以导致如下报错 二、解决方案一&#xff08;推荐&#xff09; python3.11的环境直接安装这个即可&…

物 理 层

二、物理层 1、物理层的基本概念 物理层的作用:尽可能的屏蔽掉传输媒体和通信手段的差异&#xff0c;使物理层上面的数据链路层感觉不到这些差异&#xff0c;使其只需要考虑如何完成本层的协议和服务 1.1、物理层的主要任务 机械特性&#xff1a;指明接口所用的接线器的形状…

关闭禁用chrome浏览器的阅读清单/强力书签

文章目录 前言操作 前言 阅读清单对我没啥用&#xff0c;还占用我位置&#xff0c;不小心点击到啥的&#xff0c;必须弃用 操作 chrome地址栏输入 chrome://flags/ 搜索book &#xff0c;关掉下面几个功能