【JavaEE进阶】mybatis

news2025/1/23 22:42:49

目录:

一、Mybatis是什么

三个映射关系如下图:

二、mybatis的使用(前置工作+简单案例)

第一步:导入MAVEN依赖

第二步: 在spring项目当中新建数据源

第三步:新建一个实体类,是和数据库进行交互的实体类

第四步:新建一个mapper文件夹(src目录下面)

第五步:在mybatis下面新建一个UserMapper.xml的文件夹

第六步:在两个mapper标签之间编写查询的sql语句

resultType属性:用于标记返回的是什么类型,同时指定返回的对象是哪个

第七步:在其他类当中调用getAll方法

总结一下,mybatis的执行流程:

三、复杂操作

3.1根据id查询用户对象

第一步:在UserMapper当中编写一个根据id查询用户对象的方法

第二步:在配置文件当中编写查询的方法

mybatis两种占位符:$和#的区别

3.2把一个对象作为参数进行传递

第一步:在UserMapper当中新建一个以User为参数的方法

第二步:在配置文件当中直接获取user的属性

第三步:进行测试

3.3删改的操作

第一步:在mapper层编写增删改的方法

第二步:在xml文件当中配置增删改的方法(无需返回值)

第三步: 编写测试的方法

3.4新增数据操作(以新增一个User对象为例)

第一步:在mapper当中新建一个方法:

第二步:在xml文件当中配置一个新增方法

第三步:新建一个方法用于测试

四、springBoot单元测试

4.1添加springBoot的测试依赖

4.2生成需要测试方法的测试等价类

第一步:右键需要测试的方法,然后生成get和set方法

第二步:为测试类添加@SpringBootTest注解

第三步:在测试类当中使用@Autowired来获取bean进行测试

如何避免测试的数据影响正常数据库的数据(@Test @Transactional)

一、Mybatis是什么

mybatis是一款优秀的持久层框架(主要与数据库层,也就是mysql层打交道的),它支持自定义sql、存储过程以及数据库对应到实体的映射等等。

也就是把数据库当中的每一行记录与对象建立起来映射的关系


三个映射关系如下图:

数据库当中的属性Java程序当中的属性
数据库表(table)类(class)
记录(record)对象(object)
字段(field)对象的属性(attribute)

二、mybatis的使用(前置工作+简单案例)

第一步:导入MAVEN依赖

       <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

第二步: 在spring项目当中新建数据源

下面我选择的是application.properties文件配置的

需要在resource目录下面新建一个文件夹,文件夹的名称被命名为:mybatis

后续的xml配置文件就需要在这个mybatis文件夹当中编写了。

配置文件的内容: 

spring.datasource.url=jdbc:mysql://localhost:3306/my_blog_system?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=20021111aA#
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
############设置mybatis的保存路径
mybatis.mapper-locations=classpath:/mybatis/*Mapper.xml

第三步:新建一个实体类,是和数据库进行交互的实体类

在这个类当中,需要满足上面的一一对应的关系。

/**
 * @author 25043
 */
@Data
public class User {

    private int id;

    private String username;

    private String password;

}

第四步:新建一个mapper文件夹(src目录下面)

       这个文件夹用于存放和数据库进行直接交互的实体类,但是这些类一般都是接口,我们只需要在这些接口当中定义一些方法即可。

       例如在下面这个类当中,定义一个查询所有用户的方法:

/**
 * 使用这个注解,标记这个类是一个持久层的类
 * @author 25043
 */
@Mapper
public interface UserMapper {
     /**
      * 查询所有用户
      * 查询用户@return
      */
     List<User> getAll();
}

第五步:在mybatis下面新建一个UserMapper.xml的文件夹

在这个文件夹当中,黏贴下面的内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybati
s.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.springLearning.Mapper.UserMapper">

</mapper>

需要注意的是:mapper namespace这个标签的内容为需要返回的User对象的全限定名。


第六步:在两个mapper标签之间编写查询的sql语句

其中,select标签为查询标签,其余的还有update标签(用于修改),指定的id为查询的方法

以及insert标签,用于新增。

<mapper namespace="com.example.springLearning.Mapper.UserMapper">

    
    <select id="getAll" resultType="com.example.springLearning.Entity.User">
         select *from  user
    </select>
</mapper>

resultType属性:用于标记返回的是什么类型,同时指定返回的对象是哪个


第七步:在其他类当中调用getAll方法

需要注意的是,其他类调用的时候,一定要确保

@Service
public class UserServiceImpl implements UserService {
     @Autowired
     private UserMapper userMapper;


     public List<User> getAll(){
          return userMapper.getAll();
     }
}

总结一下,mybatis的执行流程:


三、复杂操作

3.1根据id查询用户对象

第一步:在UserMapper当中编写一个根据id查询用户对象的方法

 /**
      * 根据id查询用户
      * 用户的id@param id
      * 单个实体用户@return
      */
     User getUserById(@Param("id") Integer id);

第二步:在配置文件当中编写查询的方法

 <select id="getUserById" resultType="com.example.springLearning.Entity.User">
        select *from  user where userId=${id};
 </select>


mybatis两种占位符:$和#的区别

占位符主要区别优缺点
${}直接替换,相当于直接拼接

①不可以解决sql注入;

②当查询的数据类型需要手动添加引号的时候,会报错(因为是直接拼接数据)

#{}占位符,也就是"?"进行替换

①可以解决sql注入;

②无需手动添加引号。


3.2把一个对象作为参数进行传递

第一步:在UserMapper当中新建一个以User为参数的方法

/**
      * 处理用户登录
      * 用户对象@param user
      * 用户对象@return
      */
     User login(User user);

第二步:在配置文件当中直接获取user的属性


第三步:进行测试

  @Test
    void login() {
        User user=new User();
        user.setUsername("zhangSan");
        user.setPassword("123");
        User userGet=userMapper.login(user);
        System.out.println(userGet);
    }

3.3删改的操作

第一步:在mapper层编写增删改的方法

 /**
      * 删除user
      * user对象@param user
      * 删除@return
      */
     Integer delete(User user);

注意这里的返回值一定要设置为包装类型,不可以是基本数据类型 


第二步:在xml文件当中配置增删改的方法(无需返回值)

和查询操作类似,但是无需在标签当中指定resultType

 <select id="delete">
        delete from user where username=#{username};
 </select>

第三步: 编写测试的方法

@Test
    void testInsert(){
        User user=new User();
        user.setUsername("lisi");
        userMapper.delete(user);
    }

3.4新增数据操作(以新增一个User对象为例)

第一步:在mapper当中新建一个方法:

Integer insert(User user);

第二步:在xml文件当中配置一个新增方法

<select id="insert">
         insert into user(username,password) values(#{username},#{password});
</select>

第三步:新建一个方法用于测试

public int insert(User user){
          return userMapper.insert(user);
}

四、springBoot单元测试

4.1添加springBoot的测试依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

4.2生成需要测试方法的测试等价类

第一步:右键需要测试的方法,然后生成get和set方法

 然后,就可以看到生成了测试的目录,并且在测试的目录下面生成了这样的代码:


第二步:为测试类添加@SpringBootTest注解


第三步:在测试类当中使用@Autowired来获取bean进行测试

@SpringBootTest
class UserServiceImplTest {


    @Autowired
    private UserMapper userMapper;

    @Test
    void getAll() {
    }

    @Test
    void getUserById() {

        User user=userMapper.getUserById(2);
        System.out.println(user);
    }
}

如何避免测试的数据影响正常数据库的数据(@Test @Transactional)

只需要在一个测试的方法上面标注:@Test注解加上@Transactional两个注解即可。

@Test
@Transactional
void testInsert(){
        User user=new User();
        user.setUsername("张三");
        userMapper.delete(user);
    }

这样子,即使插入了数据,也会在方法调用结束之后,回滚事物。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/632518.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Shell编程规范与变量使用

目录 一、Shell编程概述 1.Shell脚本的概念 2.Shell脚本的应用场景 3.Shell的作用 4.Linux系统中支持的shell 二、Shell编程规范 1.编写Shell脚本规范步骤 2.Shell脚本执行方法 &#xff08;1&#xff09;以绝对路径执行&#xff08;需要赋予脚本文件执行权限&#xf…

stable diffusion webui 文生图(txt2img)api接口调用(使用C#)

唠嗑 本次将跟读者讲一下如何通过C#请求sd webui api 【txt2img】接口&#xff0c;如果读者觉得文章有用&#xff0c;请给【点个赞】吧&#xff0c;有问题可以评论区提问。 实战 1.配置api启用参数 启动webui时&#xff0c;需加上【–api】 命令以保证api接口可以被调用。如…

Shell脚本文本三剑客之awk编辑器

目录 一、sed编辑器简介 二、sed工作流程 三、sed命令 四、sed命令的使用 1.sed打印文件内容&#xff08;p&#xff09; &#xff08;1&#xff09;打印文件所有行 &#xff08;2&#xff09;打印文件指定行 2.sed增加、插入、替换行&#xff08;a、i、c&#xff09; …

Shell脚本之正则表达式详解

目录 一、正则表达式简介 二、正则表达式的组成 三、正则表达式分类 四、正则表达式字符用法 1.基础正则表达式常见元字符&#xff08;支持grep、egrep、sed、awk&#xff09; 2. 扩展正则表达式元字符&#xff08;支持&#xff1a;egrep、grep -E、awk、sed -r&#xff…

C语言之数据在内存中的存储(2)

本章重点&#xff1a;浮点数在内存中的存储 浮点数&#xff1a;数学中的小数 eg.123.45 12.345*10^1 1.2345*10^2 1E10&#xff1a;1.0*10^10 整型家族的类型&#xff0c;表示范围&#xff1a;limits.h 浮点数&#xff1a;float.h 大家可以猜测一下打印的这四个数字…

Unity中动画系统的性能优化

降低骨骼数&#xff0c;减少面片数。 方法&#xff1a; 1.勾选Optimize Game Objects&#xff0c;以剔除骨骼节点对应的Transform节点 2.开启多线程渲染选项 主要影响的函数调用开销&#xff0c;可以在profiler中查看&#xff1a; Animators.Update MeshSkinning.Update C…

【TCP/IP】多进程服务器的实现(进阶) - 信号处理及signal、sigaction函数

目录 信号 signal函数 sigaction函数 尝试用信号来处理僵尸进程 我们在之前学习了如何处理“僵尸进程”&#xff0c;但也会有疑问&#xff1a;调用wait和waitpid函数时我们关注的始终是在子进程上&#xff0c;那么父进程上的管控&#xff08;对于子进程&#xff09;该如何实…

STM32——05-按键、时钟控制、中断复位 点亮LED灯

如何点亮一颗LED灯 编程实现点灯 常用的 GPIO HAL 库函数&#xff1a; void HAL_GPIO_Init ( GPIO_TypeDef * GPIOx , GPIO_InitTypeDef * GPIO_Init ); void HAL_GPIO_WritePin ( GPIO_TypeDef * GPIOx , uint16_t GPIO_Pin , GPIO_PinState PinState ); void HAL_GPIO_Togg…

chatgpt赋能python:Python如何创建新项目

Python如何创建新项目 Python已经成为了全球最受欢迎的编程语言之一。如果您是一个有经验的Python工程师&#xff0c;您可能已经知道如何在命令行上创建新项目。但是&#xff0c;如果您是一个新手或初学者&#xff0c;您可能需要一些指导来开始创建新的项目。在本篇文章中&…

Vue中如何进行样式绑定?

Vue中如何进行样式绑定&#xff1f; 在Vue中&#xff0c;我们可以很方便地进行样式绑定。样式绑定是将CSS样式与Vue组件中的数据进行关联的一种技术。通过样式绑定&#xff0c;我们可以根据组件的状态动态地修改其外观。本文将介绍Vue中的样式绑定&#xff0c;包括类绑定、内联…

chatgpt赋能python:Python如何进行升序排列?

Python如何进行升序排列&#xff1f; Python是一门广泛应用于Web开发、数据科学、人工智能、机器学习等领域的编程语言。在这个快速发展的世界中&#xff0c;如何高效地排序数据是非常重要的。本文将介绍Python中如何进行升序排序。 基本排序方法 Python提供了一个内置函数s…

Vue 中的列表渲染

Vue 中的列表渲染 在 Vue 中&#xff0c;列表渲染是非常常见的操作。它允许我们将一个数组中的数据渲染为一个列表&#xff0c;从而实现数据的展示和交互。在本文中&#xff0c;我们将探讨 Vue 中的列表渲染的基本原理和用法&#xff0c;并给出一些实例代码来帮助读者更好地理…

【模块三:职业成长】38|能力维度三:如何提升解决跨领域冲突的能力?

你好&#xff0c;我是郭东白。今天我们来讨论架构师核心能力的第三个层次——解决跨领域冲突。 上节课我们讲了从程序员到兼职架构师的跨越&#xff0c;也就是如何搭建解决横向问题的能力。 不过&#xff0c;在兼职架构师这个角色中&#xff0c;架构能力是一个加分项&#xff…

chatgpt赋能python:如何使用Python升序排列一个列表?

如何使用Python升序排列一个列表&#xff1f; 在Python编程中&#xff0c;我们经常需要对列表进行排序。列表排序是一种常见的操作&#xff0c;可以帮助我们对数据进行分析和管理。在这篇文章中&#xff0c;我们将学习如何使用Python对一个列表进行升序排列。 什么是升序排列…

时间同步/集群时间同步/在线/离线

目录 一、能够连接外网 二、集群不能连接外网--同步其它服务器时间 一、能够连接外网 1.介绍ntp时间协议 NTP&#xff08;Network Time Protocol&#xff09;网络时间协议&#xff0c;是用来使计算机时间同步的一种协议&#xff0c;它可以使计算机对其服务器或时钟源做同步…

【python】【Word】用正则表达式匹配正文中的标题(未使用样式)并通过win32com指定相应样式

标题的格式 二级标题&#xff1a; 数字.数字. 文字 三级标题&#xff1a;数字.数字.数字 文字 python代码 使用方法 只保留一个需要应用的WORD文档运行程序&#xff0c;逐行匹配 使用效果 代码 import win32com.client import redef compile_change_Word_titlestyle():#…

shell脚本语句控制命令(exit、break、continue)

一、exit exit用于直接退出shell脚本程序并返回状态码&#xff08;状态码可在执行命令执行后用$&#xff1f;查看&#xff09; 如果不在exit后添加状态码&#xff0c;会默认返回最后一条命令执行后的状态码 exit 加状态码&#xff0c;代表退出程序并向系统指定状态码 状态码…

基于zinx的go tcp通信案例

基于zinx的go tcp通信示例 一、zinx简介:(https://gitee.com/Aceld/zinx/) Zinx是一个基于Golang的轻量级tcp服务框架&#xff0c;根据官方的定位&#xff0c;zinx是在游戏领域或者其他长链接的领域的轻量级企业框架&#xff0c;其使用简单&#xff0c;性能高效&#xff0c;能…

Baumer工业相机堡盟工业相机如何使用BGAPISDK的相机图像时间戳计算运行时间以及时间差(C#)

Baumer工业相机堡盟工业相机如何使用BGAPISDK的相机图像时间戳计算运行时间以及时间差&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机BGAPI SDK和图像时间戳的技术背景Baumer工业相机使用BGAPISDK控制相机数据流的方式1.引用合适的类文件2.使用BGAPISDK获取时间戳的…

Vue中如何进行条件渲染

Vue中如何进行条件渲染 Vue是一款流行的前端框架&#xff0c;它提供了许多方便的功能来处理数据和视图。其中一个非常有用的功能是条件渲染。条件渲染可以根据条件来控制视图的显示和隐藏。在本文中&#xff0c;我们将介绍Vue中如何进行条件渲染&#xff0c;并提供一些示例代码…