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,TCP协议栈就无法从CLOSED状态变成LISTEN状态,客户端发起连接,TCP协议栈会直接返回RST报文,从而导致客户端连接失败 关于accept accept发送在三次握手完成之后,从全连接队列中取出一个节…...
MySQL学习笔记 ------ 子查询
#进阶7:子查询 /* 含义: 出现在其他语句中的select语句,称为子查询或内查询 外部的查询语句,称为主查询或外查询 分类: 按子查询出现的位置: select后面: 仅仅支持标量子查询 …...
自然语言处理应用程序设计
原文地址:https://zhanghan.xyz/posts/22426/ 文章目录 一、摘要二、数据集三、相关环境四、功能展示1.系统主界面2.中文分词3.命名实体识别4.文本分类5.文本聚类6.其他界面 五、源码链接 一、摘要 将自然语言处理课程设计中实现的模型集成到自然语言处理应用程序…...
LeetCode 436. Find Right Interval【排序,二分;双指针,莫队】中等
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...
正则表达式 —— Sed
Sed Sed 类似于vim就是一个文本编辑器,按行来进行编辑和排序 Sed的原理:读取,执行,显示 读取:读取文本内容之后,读取到的内容存放到临时的缓冲区—模式空间 执行:在模式空间,根据…...
TypeScript中数组,元组 和 枚举类型
数组 方式一 let arr: number[] [1, 2, 3, 4]方式二,使用泛型定义 let arr: Array<number> [1, 2, 3, 4]方式三,使用any let arr: any[] [12, string, true] console.log(arr[1]) // string元组 可以定义不同类型定义类型顺序需保持一直 …...
MyBatis-Plus-Join 多表查询的扩展
文章目录 网站使用方法安装使用Lambda形式用法(MPJLambdaWrapper)简单的连表查询一对多查询 网站 官方网站:https://mybatisplusjoin.com/Github地址:https://github.com/yulichang/mybatis-plus-joinGitee地址:https…...
认清现实重新理解游戏的本质
认清现实重新理解游戏的本质 OVERVIEW 认清现实重新理解游戏的本质现实两条小路的启发四个动机1.当前的学习任务或工作任务太艰巨2.完美主义3.对未来太过于自信/无知4.大脑小看未来的收益 四个方法1.让未来的收益足够巨大2.让未来的收益感觉就在眼前3.玩游戏有恶劣的结果4.玩游…...
LeetCode 2050. Parallel Courses III【记忆化搜索,动态规划,拓扑排序】困难
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...
ETHERNET/IP转RS485/RS232网关什么是EtherNet/IP?
网络数据传输遇到的协议不同、数据互通麻烦等问题,一直困扰着大家。然而,现在有一种神器——捷米JM-EIP-RS485/232,它将ETHERNET/IP网络和RS485/RS232总线连接在一起,让数据传输更加便捷高效。 那么,它是如何实现这一功…...
使用node内置test runner,和 Jest say 拜拜
参考 https://nodejs.org/dist/latest-v20.x/docs/api/test.html#test-runner 在之前,我们写单元测试,必须安装第三方依赖包,而从node 20.0.0 版本之后,可以告别繁琐的第三方依赖包啦,可直接使用node的内置test runner…...
《面试1v1》Kafka的架构设计是什么样子
🍅 作者简介:王哥,CSDN2022博客总榜Top100🏆、博客专家💪 🍅 技术交流:定期更新Java硬核干货,不定期送书活动 🍅 王哥多年工作总结:Java学习路线总结…...
比较常见CPU的区别:Intel、ARM、AMD
一、开发公司不同 1、Intel:是英特尔公司开发的中央处理器,有移动、台式、服务器三个系列。 2、ARM:是英国Acorn有限公司设计的低功耗成本的第一款RISC微处理器。 3、AMD:由AMD公司生产的处理器。 二、技术不同 1、Intel&…...
CAN转EtherNet/IP网关can协议是什么意思
你是否曾经遇到过不同的总线协议难以互相通信的问题?远创智控的YC-EIP-CAN网关为你解决了这个烦恼! 远创智控YC-EIP-CAN通讯网关是一款自主研发的设备,它能够将各种CAN总线和ETHERNET/IP网络连接起来,解决不同总线协议之间的通信…...
java可变字符序列:StringBuffer、StringBuilder
文章目录 StringBuffer与StringBuilder的理解StringBuilder、StringBuffer的API StringBuffer与StringBuilder的理解 因为String对象是不可变对象,虽然可以共享常量对象,但是对于频繁字符串的修改和拼接操作,效率极低,空间消耗也…...
Mac/win开发快捷键、vs插件、库源码、开发中的专业名词
目录 触控板手势(2/3指) 鼠标右键 快捷键 鼠标选择后shift⬅️→改变选择 mac command⬅️:删除←边的全部内容 commadtab显示下栏 commandshiftz向后撤回 commandc/v复制粘贴 command ⬅️→回到行首/末 commandshift3/4截图 飞…...
linux 系统编程
C标准函数与系统函数的区别 什么是系统调用 由操作系统实现并提供给外部应用程序的编程接口。(Application Programming Interface,API)。是应用程序同系统之间数据交互的桥梁。 一个helloworld如何打印到屏幕。 每一个FILE文件流(标准C库函数ÿ…...
Python策略模式介绍、使用方法
一、Python策略模式介绍 Python策略模式(Strategy Pattern)是一种软件设计模式,用于通过将算法封装为独立的对象,而使得它们可以在运行时动态地相互替换。该模式使得算法的变化独立于使用它们的客户端,从而达到代码的…...
城市气象数据可视化:洞察气候变化,构建智慧城市
随着城市化进程的加速,城市气象数据的采集和分析变得越来越重要。气象数据不仅影响着人们的生活和出行,还与城市的发展和规划息息相关。在数字化时代,如何将城市中各个气象数据进行可视化,让复杂的数据变得简单易懂,成…...
AI头像生成器开发者必备:GitHub项目管理核心技巧详解
AI头像生成器开发者必备:GitHub项目管理核心技巧详解 1. 引言:为什么GitHub对AI头像生成器项目至关重要 开发一个AI头像生成器项目时,你是否遇到过这些挑战:团队成员同时修改同一文件导致冲突、新功能上线后出现意外bug却无法快速…...
ms-swift多模态训练:图文视频语音混合训练,速度提升100%+
ms-swift多模态训练:图文视频语音混合训练,速度提升100% 1. 多模态训练的新选择 在AI模型开发领域,多模态训练一直是个技术难题。传统方法需要分别处理文本、图像、视频和语音数据,然后手动对齐不同模态的特征表示,整…...
【JAVA基础面经】深拷贝与浅拷贝
文章目录基本概念浅拷贝深拷贝重写 clone() 方法实现深拷贝使用序列化实现深拷贝使用复制构造函数或工厂方法基本概念 浅拷贝:创建一个新对象,然后将原对象的非静态字段(基本类型和引用类型)直接复制到新对象中。对于引用类型字段…...
Phi-3-mini-4k-instruct-gguf效果实测:128ms首token延迟+98%中文基础任务通过率
Phi-3-mini-4k-instruct-gguf效果实测:128ms首token延迟98%中文基础任务通过率 1. 开篇:轻量级文本生成新选择 最近测试了微软Phi-3系列中的轻量级选手——Phi-3-mini-4k-instruct-gguf模型,结果让人惊喜。这个专门优化过的GGUF版本&#x…...
解锁浏览器潜能:用户脚本实用指南
解锁浏览器潜能:用户脚本实用指南 【免费下载链接】greasyfork An online repository of user scripts. 项目地址: https://gitcode.com/gh_mirrors/gr/greasyfork 你是否常常觉得浏览器功能不够用?想让网页自动完成重复操作?希望个性…...
C++ 智能指针陷阱与调试技巧
C智能指针陷阱与调试技巧 在现代C开发中,智能指针是管理动态内存的利器,能有效避免内存泄漏和悬空指针等问题。若使用不当,智能指针本身也可能成为陷阱,导致难以察觉的bug。本文将深入探讨几种常见的智能指针陷阱,并分…...
2026年Java面试最常被问的1000道题目及参考答案
Java学到什么程度可以面试工作? 要达到能够面试Java开发工作的水平,需要掌握以下几个方面的知识和技能: 1. 基础扎实:熟悉Java语法、面向对象编程概念、异常处理、I/O流等基础知识。这是所有Java开发者必备的基础,也…...
如何通过炉石传说自动化工具实现游戏效率提升?
如何通过炉石传说自动化工具实现游戏效率提升? 【免费下载链接】Hearthstone-Script Hearthstone script(炉石传说脚本)(2024.01.25停更至国服回归) 项目地址: https://gitcode.com/gh_mirrors/he/Hearthstone-Scrip…...
告别桌面混乱:NoFences让文件管理效率提升80%的空间收纳方案
告别桌面混乱:NoFences让文件管理效率提升80%的空间收纳方案 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 每天在杂乱的桌面图标中寻找文件,就像在堆…...
别再手动敲命令了!用PyCharm自带功能一键创建Linux桌面快捷方式(附手动配置备份方案)
告别终端:PyCharm内置工具3秒生成Linux桌面快捷方式(附应急手动方案) 每次打开PyCharm都要在终端输入一长串路径?作为开发者,我们的时间应该花在创造价值上,而不是重复输入命令。JetBrains早就为Linux用户准…...
