🎬 那我掉的头发算什么:个人主页
🔥 个人专栏: 《javaSE》《数据结构》《数据库》《javaEE》
⛺️待到苦尽甘来日

大家好~ 对于 Java 后端学习者来说,操作数据库是绕不开的核心技能。传统 JDBC 开发繁琐,配置冗余,还存在 SQL 与代码耦合等问题,而 MyBatis 作为一款轻量级 ORM 框架,恰好完美解决了这些痛点 —— 它简化了数据库操作流程,让开发者能更专注于 SQL 本身,无需过多关注底层连接管理和结果映射。今天就从入门开始,一步步解锁 MyBatis 的核心用法,带你快速上手这款后端开发必备工具~
文章目录
- 入门
-
- 准备工作
-
- 创建工程
- 数据准备
- 设置配置文件
- 第一个Mybatis代码
- 测试代码
-
- 测试方法
-
- 手打测试代码
- 不用手打,直接生成
- 通过接口测试
- @SpringBootTest的作用
- Mybatis基础操作
-
- 打印日志
- 参数传递
-
- 1.传递单个参数
- 2.传递多个参数
- 3.传递对象
- 4.参数绑定(@Param)
入门
准备工作
创建工程
咱们之后用到需要使用Mybatis的项目时,需要加上下面这俩依赖: 
数据准备
首先我们需要建立一个这样的用户信息类(注意,命名规则像我的代码一样严格遵循大驼峰规则哦!)
package com.hbu.springmybatisdemo.model;
import lombok.Data;
import java.util.Date;
@Data
public class UserInfo {
private Integer id;
private String username;
private String password;
private Integer age;
private Integer gender;
private String phone;
private Integer deleteFlag;
private Date createTime;
private Date updateTime;
}
在MySQL中创建这样一个数据库:
— 使⽤数据数据
USE mybatis_test;
— 创建表[⽤⼾表]
DROP TABLE IF EXISTS user_info;
CREATE TABLE `user_info` (
`id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
`username` VARCHAR ( 127 ) NOT NULL,
`password` VARCHAR ( 127 ) NOT NULL,
`age` TINYINT ( 4 ) NOT NULL,
`gender` TINYINT ( 4 ) DEFAULT '0' COMMENT '1-男 2-⼥ 0-默认',
`phone` VARCHAR ( 15 ) DEFAULT NULL,
`delete_flag` TINYINT ( 4 ) DEFAULT 0 COMMENT '0-正常, 1-删除',
`create_time` DATETIME DEFAULT now(),
`update_time` DATETIME DEFAULT now() ON UPDATE now(),
PRIMARY KEY ( `id` )
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;
— 添加⽤⼾信息
INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone )
VALUES ( 'admin', 'admin', 18, 1, '18612340001' );
INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone )
VALUES ( 'zhangsan', 'zhangsan', 18, 1, '18612340002' );
INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone )
VALUES ( 'lisi', 'lisi', 18, 1, '18612340003' );
INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone )
VALUES ( 'wangwu', 'wangwu', 18, 1, '18612340004' );
设置配置文件
# 数据库配置
datasource:
url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
username:
password:
driver–class–name: com.mysql.cj.jdbc.Driver
咱们在yml文件中自行加入一下数据库连接的配置。
第一个Mybatis代码
我们Mybatis接口规范一般都叫xxxMapper,因此建立一个Mapper包存储。
package com.hbu.springmybatisdemo.mapper;
import com.hbu.springmybatisdemo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface UserInfoMapper {
@Select("select * from user_info")
List<UserInfo> selectAll();
}
注意:这是个接口。 接下来我们需要测试一下我们的代码是否是正确的。
测试代码
测试方法
手打测试代码
两种测试方法: 第一种:新建一个测试类 这里UserInfoMapper作为一个接口却能”实例化“的原因: 当UserInfoMapper加了@Mapper注解之后,MyBatis 会通过 JDK 动态代理 技术,在程序运行时自动生成一个实现了 UserInfoMapper 接口的代理类,Spring注入时注入的也是这个代理类,所以看上去我们好像是给这个接口实例化了。
package com.hbu.springmybatisdemo.mapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class UserInfoMapperTest {
@Autowired
private UserInfoMapper userInfoMapper;
@Test
void selectAll() {
System.out.println(userInfoMapper.selectAll());
}
}
第二种:在启动类里使用Spring上下文对象拿到实例。
package com.hbu.springmybatisdemo;
import com.hbu.springmybatisdemo.mapper.UserInfoMapper;
import com.hbu.springmybatisdemo.model.UserInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import java.util.List;
@SpringBootTest
class SpringMybatisDemoApplicationTests {
@Autowired
private ApplicationContext context;
@Test
void contextLoads() {
UserInfoMapper bean = context.getBean(UserInfoMapper.class);
bean.selectAll().stream().forEach(x -> System.out.println(x));
// List<UserInfo> userInfos = bean.selectAll();
// for(UserInfo userInfo:userInfos){
// System.out.println(userInfo);
// }
}
}
不用手打,直接生成
通过Generate的方法,直接生成测试代码,也是比较常用的方法。
package com.hbu.springmybatisdemo.mapper;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class UserInfoMapperTest {
@Autowired
private UserInfoMapper userInfoMapper;
@Test
void selectAll() {
System.out.println(userInfoMapper.selectAll());
}
@BeforeEach
void setUp() {
}
@AfterEach
void tearDown() {
}
}

通过接口测试
package com.hbu.springmybatisdemo.mapper;
import com.hbu.springmybatisdemo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/*
* 当你给接口加上 @Mapper 注解后,
* MyBatis 会通过 JDK 动态代理 技术,在程序运行时自动生成一个实现了 UserInfoMapper 接口的代理类
* Spring注入时注入的也是这个代理类
* */
@Mapper
public interface UserInfoMapper {
@Select("select * from user_info")
List<UserInfo> selectAll();
}
package com.hbu.springmybatisdemo.Service;
import com.hbu.springmybatisdemo.mapper.UserInfoMapper;
import com.hbu.springmybatisdemo.model.UserInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserSeivice {
@Autowired
private UserInfoMapper userInfoMapper;
public List<UserInfo> selectAll() {
return userInfoMapper.selectAll();
}
}
package com.hbu.springmybatisdemo.Controller;
import com.hbu.springmybatisdemo.Service.UserSeivice;
import com.hbu.springmybatisdemo.model.UserInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RequestMapping("/user")
@RestController
public class UserController {
@Autowired
private UserSeivice userSeivice;
@RequestMapping("/selectAll")
public List<UserInfo> selectAll(){
return userSeivice.selectAll();
}
}

@SpringBootTest的作用
加了这个就会在测试环境中部署Spring,比如测试代码需要用到Spring的东西,像@Autowired啥的注解。不加的话就没有Spring,可以进行简单的测试,比如说测试个1+1啦啥的根本用不上Spring。
Mybatis基础操作
打印日志
大家看着这个日志信息,是不是这个输出看上去太丑太丑了。。。 确实,还好有好方法:
mybatis:
configuration: # 配置打印 MyBatis⽇志
log–impl: org.apache.ibatis.logging.stdout.StdOutImpl
依旧配置文件里面加一个配置:
原先的打印还在,正好可以对比一下,加了配置之后的文件打印十分的清晰美观。
现在还没有传递参数,后面就可以看到了。
参数传递
1.传递单个参数

这里使用${}表示这是一个待传递的参数。
我这里使用Integer id设置的参数名称,其实只有一个参数的时候,参数名称设置成什么是无所谓的,但是两个及以上参数时这个名字就有要求了。
2.传递多个参数
@Select("SELECT * FROM `user_info` where username = #{username} and `password` = #{password} ")
List<UserInfo> selectByUserNamePassword(String username,String password);
@Select("SELECT * FROM `user_info` where username = #{username} and `password` = #{password} ")
List<UserInfo> selectByUserNamePassword2(String aa,String bb);
第一个是正常案例,最终Mybatis会根据变量名称对变量进行映射赋值。 第二个这种变量名称不对应的情况就会产生报错:
我们观察这个报错信息,虽然没有找到想要的username,但是找到了下面这四个参数,aa对应着param1,bb对应着param2。
@Select("SELECT * FROM `user_info` where username = #{param1} and `password` = #{param2} ")
List<UserInfo> selectByUserNamePassword2(String aa,String bb);
所以这段代码除了将参数名改变之外,还可以向上面这样使用param1,param2指代。
3.传递对象
@Select("SELECT id FROM `user_info` where username = #{username} and `password` = #{password} ")
List<UserInfo> selectIdByUserNamePassword(UserInfo userInfo);
需要传递的参数可以封装成一个对象,或者他们本来就是一个类里面的成员变量,我们就可以传递一个实例化的对象。Mybatis会根据对象的成员变量的名称和需要的参数名进行对应,相同就直接赋值了。
4.参数绑定(@Param)
@Select("SELECT * FROM `user_info` where username = #{user_name} and `password` = #{pass_word} ")
List<UserInfo> selectByUserNamePassword(@Param("user_name") String username,@Param("pass_word") String password);
如果我们有特殊需求,就想传递一个跟需要的参数名不一样的参数,并且也不想使用param1这样的形式,可以试试@Param这个注解。只需要将注解里面的字符串设置的和需要的参数名一致,你想定义成什么变量名都行。
@Select("SELECT id FROM `user_info` where username = #{username} and `password` = #{password} ")
List<UserInfo> selectIdByUserNamePassword(@Param("userinfo") UserInfo userInfo);
但是,如果我们给对象加上这个注解:
此时却找不到参数。 要想将参数对应起来,需要这样做:
@Select("SELECT id FROM `user_info` where username = #{userinfo.username} and `password` = #{userinfo.password} ")
List<UserInfo> selectIdByUserNamePassword(@Param("userinfo") UserInfo userInfo);
以上就是本篇博客全部内容!
