news 2026/5/25 8:53:24

Mybatis基础使用教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Mybatis基础使用教程

什么是MyBatis?

• MyBatis是⼀款优秀的 持久层 框架,⽤于简化JDBC的开发。

• MyBatis本是 Apache的⼀个开源项⽬iBatis,2010年这个项⽬由apache迁移到了google code,并 且改名为MyBatis 。2013年11⽉迁移到Github.

• 官⽹:MyBatis中⽂⽹ 在上⾯我们提到⼀个词:持久层

• 持久层:指的就是持久化操作的层, 通常指数据访问层(dao), 是⽤来操作数据库的.

简单来说 MyBatis 是更简单完成程序和数据库交互的框架,也就是更简单的操作和读取数据库⼯具

MyBatis入门

mybatis操作数据库的步骤:

1. 准备工作(创建springboot工程,数据库表准备,实体类等)

2. 引入mybatis相关依赖,配置mybatis数据库连接信息

3. 通过注解或者XML文件编写SQL语句

4. 测试

准备工程

为了了导入mybatis,必须加入mybatis framework和数据区driver,如果是MySQL,则加入MySQLdriver。

项⽬⼯程创建完成后,⾃动在pom.xml⽂件中,导⼊Mybatis依赖和MySQL驱动依赖

配置数据库连接字符串

为了通过mybatis连接数据库,需要数据库配置以下相关参数:

1. MySQL启动类

2. 用户名

3. 密码

4. 数据库连接字符串

我自己的配置信息: spring: datasource: url: jdbc:mysql://localhost:3306/mybatis_test?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8 username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver mybatis: configuration: map-underscore-to-camel-case: true mapper-locations: classpath:mapper/UserInfoMapperXML.xml

持久层代码

持久层代码放在mapper中,这也就是我们Dao层的另一种写法。

其中,resource文件夹中的mapper,为src文件夹中mapper的xml文件映射。一个数据库操作接口对应着XML文件中的一条sql语句。我们在后面详细介绍。

两种Mybatis的操作方法

1. 使用注解

通过注解直接操作数据库

package com.spring.mybatis.mapper; import com.spring.mybatis.model.UserInfo; import org.apache.ibatis.annotations.*; import org.springframework.stereotype.Component; import java.util.List; @Mapper public interface UserInfoMapper { @Select("select * from user_info") List<UserInfo> selectAll(); @Select("select * from User_info where id=#{id}") UserInfo selectById(int id); @Options(useGeneratedKeys = true, keyProperty = "id") @Insert("insert into user_info(username, password, age) values(#{username}, #{password}, #{age})") Integer insertUser(UserInfo userInfo); @Delete("delete from user_info where id=#{id}") Integer deleteUser(int id); @Update("update user_info set delete_flag =#{delete_flag},phone=#{phone} where id=#{id}") Integer updateUser(int id, int delete_flag, String phone); }

例如:@Select用于操作select语句,@Delete用于操作delete语句。在注解的括号中直接写入SQL语句,放在接口中定义的抽象方法上。

对于调用这个接口的其他类(层),只需要实例化这个接口,然后调用相关抽象方法即可。

package com.spring.mybatis.service; import com.spring.mybatis.mapper.UserInfoMapper; import com.spring.mybatis.model.UserInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service //service层 public class UserService { @Autowired private UserInfoMapper userInfoMapper; //实例化mapper接口 public List<UserInfo> getAllUsers() { //调用接口中的方法 return userInfoMapper.selectAll(); } public UserInfo selectById(int id) { //调用接口中的方法 return userInfoMapper.selectById(id); } public Integer insertUser(UserInfo userInfo) { //调用接口中的方法 System.out.println(userInfo.getId()); return userInfoMapper.insertUser(userInfo); } }

2. XML文件

XML文件实现Mybatis操作原理如下,interface方法定义和xml方法实现相互映射,共同组成数据持久层mapper:

import com.example.demo.model.UserInfo; import org.apache.ibatis.annotations.Mapper; import java.util.List; @Mapper public interface UserInfoXMlMapper { List<UserInfo> queryAllUser(); }

操作

首先,配置连接字符串和Mybatis

application.yml⽂件, 配置内容如下

# 数据库连接配置 spring: datasource: url: jdbc:mysql://127.0.0.1:3306/mybatis_test? characterEncoding=utf8&useSSL=false username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver # 配置 mybatis xml 的⽂件路径,在 resources/mapper 创建所有表的 xml ⽂件 mybatis: mapper-locations: classpath:mapper/**Mapper.xml #这里是xml文件的位置

随后,添加mapper接口

import com.example.demo.model.UserInfo; import org.apache.ibatis.annotations.Mapper; import java.util.List; @Mapper public interface UserInfoXMlMapper { List<UserInfo> queryAllUser(); }

随后,添加UserInfoXMLMapper.xml文件,放在resource文件夹中的mapper文件夹

初始化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="com.spring.mybatis.mapper.UserInfoMapperXML"> </mapper>

注意:xml文件位置要和yml配置文件中定义的路径相对应

Mybatis的操作技巧

1. 打印日志

在yml配置文件中配置如下代码,即可打印日志

mybatis: configuration: # 配置打印 MyBatis⽇志 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

看到SQL的执行内容,参数传递和执行结果:

2. 参数传递

一般而言,SQL语句中的内容不能写成固定值,因为如果这样写每次查找都要修改值,例如查找id=4的用户,对应的SQL就是:select * from user_info where id=4。但是这样的话, 只能查找id=4 的数据, 所以SQL语句中的id值不能写成固定数值

解决方案:在queryById方法中添加⼀个参数(id),将方法中的参数,传给SQL语句

@Select("select username, `password`, age, gender, phone from user_info where id= #{id} ") //此处用的是传值,而非固定值 UserInfo queryById(Integer id);

也可以通过 @Param , 设置参数的别名, 如果用 @Param 设置别名, #{...}的属性名必须和 @Param 设置的⼀样

@Select("select username, `password`, age, gender, phone from user_info where id= #{userid} ") UserInfo queryById(@Param("userid") Integer id);

利用对象传递参数

如果设置了 @Param 属性, #{...} 需要使⽤ 参数.属性 来获取

@Insert("insert into user_info (username, `password`, age, gender, phone) values (#{userInfo.username},#{userInfo.password},#{userInfo.age},# {userInfo.gender},#{userInfo.phone})") //因为使用了@Param,在SQL获取参数时需要加上"userInfo." Integer insert(@Param("userInfo") UserInfo userInfo);

使用对象传递参数的好处

好处1:自动匹配参数

@Insert("insert into user_info (username, `password`, age, gender, phone) values (#{username},#{password},#{age},#{gender},#{phone})") Integer insert(UserInfo userInfo); 直接传入UserInfo类,自动匹配参数

好处2:返回主键

Insert 语句默认返回的是 受影响的⾏数。但有些情况下, 数据插⼊之后, 还需要有后续的关联操作, 需要获取到新插⼊数据的id

如果想要拿到自增id, 需要在Mapper接口的方法上添加⼀个Options的注解

@Options(useGeneratedKeys = true, keyProperty = "id") @Insert("insert into user_info (username, age, gender, phone) values (# {userInfo.username},#{userInfo.age},#{userInfo.gender},#{userInfo.phone})") Integer insert(@Param("userInfo") UserInfo userInfo);

useGeneratedKeys:这会令 MyBatis 使⽤ JDBC 的 getGeneratedKeys ⽅法来取出由数据库内 部⽣成的主键(⽐如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的⾃动递增字 段),默认值:false.

keyProperty:指定能够唯⼀识别对象的属性,MyBatis 会使用 getGeneratedKeys 的返回值或 insert 语句的 selectKey 子元素设置它的值,默认值:未设置(unset)

注意事项:如果SQL中的字段和我们类属性名称不一致,将会发生匹配不上字段的情况。

如下图,框中的三个参数长相不同,无法相互匹配

解决方案:

1. 起别名

直接在SQL语句中起别名

@Select("select id, username, `password`, age, gender, phone, delete_flag as deleteFlag, " + "create_time as createTime, update_time as updateTime from user_info") public List<UserInfo> queryAllUser();

2. 结果映射

@Select("select id, username, `password`, age, gender, phone, delete_flag, create_time, update_time from user_info") //此处进行结果映射,id = "resultMap"指的是这条结果映射的id名为resultMap,其他地方如果需要同样的映射,可以直接调用 @Results(id = "resultMap",value = { @Result(column = "delete_flag",property = "deleteFlag"), @Result(column = "create_time",property = "createTime"), @Result(column = "update_time",property = "updateTime") }) List<UserInfo> queryAllUser(); @Select("select id, username, `password`, age, gender, phone, delete_flag, create_time, update_time " + "from user_info where id= #{userid} ") //此处直接调用上文定义的结果映射id @ResultMap(value = "resultMap") UserInfo queryById(@Param("userid") Integer id);

3. 配置文件开启驼峰命名(推荐)

mybatis: configuration: map-underscore-to-camel-case: true #配置驼峰⾃动转换

3. #{} 和 ${}

直接说差别:#{}为预编译SQL,${}为直接字符串拼接SQL(即时SQL)

预编译SQL可以提高效率,编译⼀次之后会将编译后的SQL语句缓存起来,后面再次执行这条语句时,不会再次编译 (只是输⼊的参数不同), 省去了解析优化等过程, 以此来提⾼效率

预编译SQL可以防止SQL注入。比如sql 注入代码: ' or 1='1,如果使用${}就会被sql注入,而#{}就不会。

4. 切换数据库连接池

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用⼀个现有的数据库连接,而不是再重新建⼀个.

常⻅的数据库连接池: C3P0,DBCP,Druid,Hikari

Mybatis操作数据库进阶

1. 动态SQL

if标签

注册分为两种字段:必填字段和非必填字段,那如果在添加用户的时候有不确定的字段传入,程序应该如何实现呢?这个时候就需要使⽤动态标签 来判断了,如添加的时候性别 gender 为非必填字段,具体实现如下:

<insert id="insertUserByCondition"> INSERT INTO userinfo ( username, `password`, age, <if test="gender != null"> gender, </if> phone) VALUES ( #{username}, #{age}, <if test="gender != null"> #{gender}, </if> #{phone}) </insert>

trim标签

之前的插入用户功能,只是有⼀个 gender 字段可能是选填项,如果有多个字段,⼀般考虑使用标签结合标签,对多个字段都采取动态生成的方式。

标签中有如下属性:

• prefix:整个语句块,以prefix的值作为前缀

• suffix:整个语句块,以suffix的值作为后缀

• prefixOverrides:整个语句块要去除掉的前缀

• suffixOverrides:整个语句块要去除掉的后缀

还有如:

where标签

set标签

foreach标签

include标签

等,在这里不再详细讲解。

总之,这些标签可以让SQL语句更加灵活,适应不同的操作条件。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/25 8:26:30

蓝牙电话-acceptCall-调用流程

BluetoothHeadsetClient.java acceptCall 调用流程及日志分析 1. 完整的 acceptCall 调用流程 1.1 调用时序图 应用层 (App)↓ 1. 调用 acceptCall() 框架层 (BluetoothHeadsetClient.java)↓ 2. 通过Binder IPC 蓝牙服务进程 (HeadsetClientService)↓ 3. 状态机处理 HeadsetC…

作者头像 李华
网站建设 2026/5/25 21:19:50

OpenAI gpt-oss-20b支持13万token长上下文

OpenAI gpt-oss-20b支持13万token长上下文 [【免费下载链接】gpt-oss-20b gpt-oss-20b —— 基于OpenAI开源权重的轻量级高性能语言模型&#xff08;21B参数&#xff0c;3.6B活跃参数&#xff09; 项目地址: https://ai.gitcode.com/hf_mirrors/openai/gpt-oss-20b](https://…

作者头像 李华
网站建设 2026/5/24 14:10:22

文件清单提取

背景 在现代企业数据管理和文件整理工作中&#xff0c;经常需要对大量文件进行统计分析、归档整理和批量处理。传统的手动整理方式效率低下&#xff0c;难以应对复杂的文件组织结构&#xff0c;且容易出错。特别是在需要生成文件清单报表、进行文件分类统计时&#xff0c;人工…

作者头像 李华
网站建设 2026/5/25 17:20:18

淘宝秒杀系统架构实战 - 百万级并发技术方案

一、业务场景分析1.1 秒杀特点瞬时流量: 开场10秒内100万请求读写比例: 1000:1 (99.9%用户抢不到)库存稀缺: 1000件商品,100万人抢强一致性: 不能超卖,不能少卖用户体验: P99延迟 < 200ms1.2 核心技术挑战100万并发 ↓网关层(5万) 应用层(2万) 数据层(1万)如何削峰? 如何防…

作者头像 李华
网站建设 2026/5/25 9:41:56

kotaemon本地化隐私保护方案详解

Kotaemon本地化隐私保护方案详解 在AI技术加速渗透企业核心业务的当下&#xff0c;一个尖锐的问题摆在开发者面前&#xff1a;如何在享受大模型智能红利的同时&#xff0c;守住数据安全的生命线&#xff1f;尤其对于金融、医疗等敏感行业&#xff0c;哪怕是最细微的数据外泄风险…

作者头像 李华
网站建设 2026/5/26 3:51:14

Python爬虫实战:基于异步技术的大宗商品期货交易数据爬取与趋势分析

引言:期货数据爬虫的重要性与挑战 在当今数字化金融时代,期货市场交易数据已成为投资者、分析师和研究人员进行大宗商品价格趋势分析的关键资源。期货数据不仅反映了市场供需关系,还包含了宏观经济、政策变化和全球事件的影响。然而,获取高质量、实时的期货交易数据面临着…

作者头像 李华