当前位置: 首页 > news >正文

Mybatis学习笔记

Mybatis

文章目录

  • Mybatis
    • 搭建环境
      • 创建Maven工程
      • 将数据库中的表转换为对应的实体类
      • 配置文件
        • 核心配置文件==mybatis-config.xml==
        • 创建Mapper接口
        • 映射文件==xxxMapper.xml==
        • log4j日志功能
    • Mybatis操纵数据库
      • 示例及要点说明
      • 获取参数的两种方式
        • ==${}==
        • ==#{}==
      • 各种类型的参数处理
        • 单个字面量参数
        • 多个字面量参数
        • map集合类型的参数
        • 实体类类型的参数
        • 通过==@Param==注解(常用)
      • Mybatis的各种查询功能
        • 查询一条数据为实体类对象
        • 查询多条数据为一个list集合
        • 查询单个数据
        • 查询一条数据为Map集合
        • 查询多条数据为Map集合
      • 特殊SQL的执行
        • 模糊查询
        • 批量删除
        • 动态设置表名
        • 添加功能获取自增的主键
      • 自定义映射resultMap
        • 多对一
        • 一对多

搭建环境

创建Maven工程

  • 打包模式更改为jar包,因为mybatis只是封装了jdbc,不需要使用Tomcat
  • pom.xml导入依赖(mybatis的核心驱动+Mysql驱动+junit测试)
pom.xml
<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><groupId>org.example</groupId><artifactId>MyBaits</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><name>MyBaits</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!-- Mybatis核心 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency><!-- MySQL驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version></dependency></dependencies></project>

将数据库中的表转换为对应的实体类

在这里插入图片描述

User实体类
package com.zhnx.demo1.pojo;
import lombok.Data;
/*** ssm.t_user*/
@Data
public class User {private Integer id;private String username;private String password;private Integer age;private String gender;private String email;public User() {}public User(Integer id, String username, String password, Integer age, String gender, String email) {this.id = id;this.username = username;this.password = password;this.age = age;this.gender = gender;this.email = email;}
}

补充:使用@Data注解需要在pom.xml中配置lombok的依赖

lombok依赖<!-- lombok,简化实体类--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.26</version><scope>compile</scope></dependency>

配置文件

核心配置文件mybatis-config.xml

核心配置文件主要功能,与数据库和映射文件进行绑定

  • 存放位置:src/main/resources
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- Mybatis 核心配置文件,标签的顺序properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?--><!--引入properties文件,然后才可以在当前文件中使用的方式访问 --><!-- ”jdbc.properties“ 的文件名 --><properties resource="jdbc.properties"/><!--设置类型别名 --><typeAliases><!-- 比较 好的方式就是以包为单位,将报下所有的类型设置成默认的类型别名,类名不区分大小写 --><!-- 类所在包的全类名:com.zhnx.mybatis.pojo--><package name="com.zhnx.demo1.pojo"/></typeAliases><!--设置连接数据库的环境--><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><!-- 设置数据库连接的驱动 ${jdbc.driver}--><property name="driver" value="${jdbc.driver}"/><!-- 设置数据库的连接地址  ${jdbc.url}--><property name="url" value="${jdbc.url}"/><!-- 设置连接数据库的用户名  ${jdbc.username}--><property name="username" value="${jdbc.username}"/><!-- 设置连接数据库的密码  ${jdbc.password}--><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!--引入映射文件--><mappers>
<!--        <mapper resource="mappers/UserMapper.xml"/>--><!--        这种方式一定要保证mapper接口和映射文件在同一个目录下--><package name="com.zhnx.demo1.mapper"/></mappers>
</configuration>

创建Mapper接口

package com.zhnx.demo1.mapper;
import com.zhnx.demo1.pojo.User;public interface UserMapper {/*** 根据用户名查询用户信息* @param name* @return*/User getUserByUsername(String name);
}

映射文件xxxMapper.xml

在映射文件中写SQL语句,操作数据库

  • 一个映射文件对应一个实体类,一张表
  • mapper接口的全类名和映射文件的namespace要一致
  • Mapper接口中的方法名需要和映射文件中的SQL语句的id保持一致
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- namespace = ”当前接口的全类名“ 如com.zhnx.mybatis.mapper.UserMapper-->
<mapper namespace="com.zhnx.demo1.mapper.UserMapper"><!--mapper接口和映射文件要保持两个一致1、mapper接口的全类名和映射文件的namespace一致2、mapper接口中的方法的方法名要和映射设文件中的sql的id保持一致--><!--     int insertUser();--><insert id="insertUser">insert into t_user values (null,'admin','00000000',23,'男','admin000.qq.com');</insert></mapper>

log4j日志功能

在pom.xml中加入log4j的依赖

    <!-- log4j日志 --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency>

Mybatis操纵数据库

示例及要点说明

eg:

1、在UserMapper接口中新增方法

public interface UserMapper{User selectUser();
}

2、在UserMapper.xml中配置SQL语句等

<select id="selectUser" resultType="User">select * from t_user where id = 1;
</select>
  • resultType:设置返回的结果类型,就是查询得到数据转换成的对应的Java类型(全类名)

    • 可以在核心配置文件中使用标签设置类型别名

    • <!--设置类型别名 -->
      <typeAliases><!-- 比较 好的方式就是以包为单位,将包下所有的类型设置成默认的类型别名,类名不区分大小写 --><package name="com.zhnx.demo1.pojo"/>
      </typeAliases>
      
  • resultMap:自定义映射处理多对一或者一对多映射关系

获取参数的两种方式

${}

  • 字符串拼接

  • 注意添加单引号

#{}

  • 占位符赋值

  • 不需要添加单引号

  • 可以防止SQL注入

各种类型的参数处理

单个字面量参数

${}和#{}都可以,以任意键值就可以获取参数值

需要注意的是,${}需要手动添加单引号

多个字面量参数

不可以使用#{username}、#{password}的方式

因为 因为当mapper接口中的方法参数为多个时,此时MyBatis会自动将这些参数放在一个map集合中,以arg0,arg1…或param1,param2…为键,以参数为值

所以,多个字面量参数的处理方式应该为==#{arg0}…或‘${arg0}’==…

map集合类型的参数

这种参数可以直接#{==map键值对的键==值}

  • eg:#{username}

实体类类型的参数

这种参数可以直接==通过实体类的属性名==获取属性值

  • eg:#{username}

通过==@Param==注解(常用)

  • User getUserByUsername(==@param(“name”)==String name);
  • 以注解的value属性值为键和Param1、Param2…为键
  • eg:#{name}

Mybatis的各种查询功能

查询一条数据为实体类对象

  • resultType=“User”

查询多条数据为一个list集合

  • resultType=“User”

查询单个数据

  • resultType=“integer/int/Int/Integer/_integer”(类型别名不区分大小写)

查询一条数据为Map集合

  • resultType=“map”

查询多条数据为Map集合

  • resultType=“map”
* 查询出来的多个Map集合统一放在list集合中  ** List<Map<String, Object>> getAllUserToMap();** 查询结果: {password=123456, sex=, id=1, age=23, username=admin}
* 查询出来的多个Map集合放在Map集合中(Map中嵌套Map** 使用@MapKey("id")为外层的Map集合指定键值** @MapKey("id")Map<String, Object> getAllUserToMap();** 查询结果:{1={password=123456, sex=, id=1, age=23, username=admin},2={password=123456, sex=, id=2, age=23, username=张三},3={password=123456, sex=, id=3, age=23, username=张三}}

特殊SQL的执行

模糊查询

  • LIKE ‘abc%’

    • _ LIKE ‘_${mohu}%’
    • LIKE concat(‘%’,#{mohu},‘%’)
    • LIKE “%”#{mohu}“%”
  • 具体情况根据SQL语句来判断

批量删除

  • delete from t_user where id in (${ids})

动态设置表名

  • select * from ${tableName}

添加功能获取自增的主键

//useGeneratedKeys=“true”
//keyProperty="id"
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">insert into t_user values(null,#{username},#{password},#{age},#{sex})</insert

自定义映射resultMap

//resultMap标签的和其中属性的详解
<!-- resultMap:设置自定义映射属性:id:表示自定义映射的唯一标识type:查询的数据要映射的实体类的类型子标签:id:设置主键的映射关系result:设置普通字段的映射关系association:设置多对一的映射关系collection:设置一对多的映射关系属性:property:设置映射关系中实体类中的属性名column:设置映射关系中表中的字段名--><!--简单例子 --!>
<resultMap id="userMap" type="User"><id property="id" column="id"></id><result property="userName" column="user_name"></result><result property="password" column="password"></result><result property="age" column="age"></result><result property="sex" column="sex"></result></resultMap><select id="selectUser" resultMap="userMap">select * from user;<select>

多对一

例子:实体类中还有实体类

  • 级联:使用 “类名.字段名” 的方式进行映射

    • <resultMap id="empDeptMap" type="Emp"> <id column="eid" property="eid"></id> <result column="ename" property="ename"></result><result column="age" property="age"></result><result column="sex" property="sex"></result><result column="did" property="dept.did"></result><result column="dname" property="dept.dname"></result></resultMap>
      
  • association

    • <resultMap id="empDeptMap" type="Emp"><id column="eid" property="eid"></id><result column="ename" property="ename"></result><result column="age" property="age"></result><result column="sex" property="sex"></result><association property="dept" javaType="Dept"><id column="did" property="did"></id><result column="dname" property="dname"></result></association></resultMap>
      

一对多

例子:实体类中有集合

  • collection

    • <resultMap id="deptEmpMap" type="Dept"><id property="did" column="did"></id><result property="dname" column="dname"></result><collection property="emps" ofType="Emp"><id property="eid" column="eid"></id><result property="ename" column="ename"></result><result property="age" column="age"></result><result property="sex" column="sex"></result></collection></resultMap>
      

相关文章:

Mybatis学习笔记

Mybatis 文章目录 Mybatis搭建环境创建Maven工程将数据库中的表转换为对应的实体类配置文件核心配置文件mybatis-config.xml创建Mapper接口映射文件xxxMapper.xmllog4j日志功能 Mybatis操纵数据库示例及要点说明获取参数的两种方式${}#{} 各种类型的参数处理单个字面量参数多个…...

网络编程(11):三次握手和四次挥手部分细节(后续补充)

关于listen 服务器如果不listen&#xff0c;TCP协议栈就无法从CLOSED状态变成LISTEN状态&#xff0c;客户端发起连接&#xff0c;TCP协议栈会直接返回RST报文&#xff0c;从而导致客户端连接失败 关于accept accept发送在三次握手完成之后&#xff0c;从全连接队列中取出一个节…...

MySQL学习笔记 ------ 子查询

#进阶7&#xff1a;子查询 /* 含义&#xff1a; 出现在其他语句中的select语句&#xff0c;称为子查询或内查询 外部的查询语句&#xff0c;称为主查询或外查询 分类&#xff1a; 按子查询出现的位置&#xff1a; select后面&#xff1a; 仅仅支持标量子查询 …...

自然语言处理应用程序设计

原文地址&#xff1a;https://zhanghan.xyz/posts/22426/ 文章目录 一、摘要二、数据集三、相关环境四、功能展示1.系统主界面2.中文分词3.命名实体识别4.文本分类5.文本聚类6.其他界面 五、源码链接 一、摘要 将自然语言处理课程设计中实现的模型集成到自然语言处理应用程序…...

LeetCode 436. Find Right Interval【排序,二分;双指针,莫队】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

正则表达式 —— Sed

Sed Sed 类似于vim就是一个文本编辑器&#xff0c;按行来进行编辑和排序 Sed的原理&#xff1a;读取&#xff0c;执行&#xff0c;显示 读取&#xff1a;读取文本内容之后&#xff0c;读取到的内容存放到临时的缓冲区—模式空间 执行&#xff1a;在模式空间&#xff0c;根据…...

TypeScript中数组,元组 和 枚举类型

数组 方式一 let arr: number[] [1, 2, 3, 4]方式二&#xff0c;使用泛型定义 let arr: Array<number> [1, 2, 3, 4]方式三&#xff0c;使用any let arr: any[] [12, string, true] console.log(arr[1]) // string元组 可以定义不同类型定义类型顺序需保持一直 …...

MyBatis-Plus-Join 多表查询的扩展

文章目录 网站使用方法安装使用Lambda形式用法&#xff08;MPJLambdaWrapper&#xff09;简单的连表查询一对多查询 网站 官方网站&#xff1a;https://mybatisplusjoin.com/Github地址&#xff1a;https://github.com/yulichang/mybatis-plus-joinGitee地址&#xff1a;https…...

认清现实重新理解游戏的本质

认清现实重新理解游戏的本质 OVERVIEW 认清现实重新理解游戏的本质现实两条小路的启发四个动机1.当前的学习任务或工作任务太艰巨2.完美主义3.对未来太过于自信/无知4.大脑小看未来的收益 四个方法1.让未来的收益足够巨大2.让未来的收益感觉就在眼前3.玩游戏有恶劣的结果4.玩游…...

LeetCode 2050. Parallel Courses III【记忆化搜索,动态规划,拓扑排序】困难

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

ETHERNET/IP转RS485/RS232网关什么是EtherNet/IP?

网络数据传输遇到的协议不同、数据互通麻烦等问题&#xff0c;一直困扰着大家。然而&#xff0c;现在有一种神器——捷米JM-EIP-RS485/232&#xff0c;它将ETHERNET/IP网络和RS485/RS232总线连接在一起&#xff0c;让数据传输更加便捷高效。 那么&#xff0c;它是如何实现这一功…...

使用node内置test runner,和 Jest say 拜拜

参考 https://nodejs.org/dist/latest-v20.x/docs/api/test.html#test-runner 在之前&#xff0c;我们写单元测试&#xff0c;必须安装第三方依赖包&#xff0c;而从node 20.0.0 版本之后&#xff0c;可以告别繁琐的第三方依赖包啦&#xff0c;可直接使用node的内置test runner…...

《面试1v1》Kafka的架构设计是什么样子

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…...

比较常见CPU的区别:Intel、ARM、AMD

一、开发公司不同 1、Intel&#xff1a;是英特尔公司开发的中央处理器&#xff0c;有移动、台式、服务器三个系列。 2、ARM&#xff1a;是英国Acorn有限公司设计的低功耗成本的第一款RISC微处理器。 3、AMD&#xff1a;由AMD公司生产的处理器。 二、技术不同 1、Intel&…...

CAN转EtherNet/IP网关can协议是什么意思

你是否曾经遇到过不同的总线协议难以互相通信的问题&#xff1f;远创智控的YC-EIP-CAN网关为你解决了这个烦恼&#xff01; 远创智控YC-EIP-CAN通讯网关是一款自主研发的设备&#xff0c;它能够将各种CAN总线和ETHERNET/IP网络连接起来&#xff0c;解决不同总线协议之间的通信…...

java可变字符序列:StringBuffer、StringBuilder

文章目录 StringBuffer与StringBuilder的理解StringBuilder、StringBuffer的API StringBuffer与StringBuilder的理解 因为String对象是不可变对象&#xff0c;虽然可以共享常量对象&#xff0c;但是对于频繁字符串的修改和拼接操作&#xff0c;效率极低&#xff0c;空间消耗也…...

Mac/win开发快捷键、vs插件、库源码、开发中的专业名词

目录 触控板手势&#xff08;2/3指&#xff09; 鼠标右键 快捷键 鼠标选择后shift⬅️→改变选择 mac command⬅️&#xff1a;删除←边的全部内容 commadtab显示下栏 commandshiftz向后撤回 commandc/v复制粘贴 command ⬅️→回到行首/末 commandshift3/4截图 飞…...

linux 系统编程

C标准函数与系统函数的区别 什么是系统调用 由操作系统实现并提供给外部应用程序的编程接口。(Application Programming Interface&#xff0c;API)。是应用程序同系统之间数据交互的桥梁。 一个helloworld如何打印到屏幕。 每一个FILE文件流&#xff08;标准C库函数&#xff…...

Python策略模式介绍、使用方法

一、Python策略模式介绍 Python策略模式&#xff08;Strategy Pattern&#xff09;是一种软件设计模式&#xff0c;用于通过将算法封装为独立的对象&#xff0c;而使得它们可以在运行时动态地相互替换。该模式使得算法的变化独立于使用它们的客户端&#xff0c;从而达到代码的…...

城市气象数据可视化:洞察气候变化,构建智慧城市

随着城市化进程的加速&#xff0c;城市气象数据的采集和分析变得越来越重要。气象数据不仅影响着人们的生活和出行&#xff0c;还与城市的发展和规划息息相关。在数字化时代&#xff0c;如何将城市中各个气象数据进行可视化&#xff0c;让复杂的数据变得简单易懂&#xff0c;成…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...