欢迎光临
我们一直在努力

【Mybatis】正式学习Mybatis前,你需要知道这些——

在这里插入图片描述

🎬 那我掉的头发算什么:个人主页

🔥 个人专栏: 《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:
driverclassname: 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⽇志
logimpl: 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);

以上就是本篇博客全部内容!

赞(0)
未经允许不得转载:171主机测评 » 【Mybatis】正式学习Mybatis前,你需要知道这些——
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址