【测试开发】知识点-mybatis,主要使用方式:接口式编程

简介: 【测试开发】知识点-mybatis,主要使用方式:接口式编程

昨天写了一个 mybatis 的helloWord,虽然能跑起来,但是那种方式还是会存在一些问题。


1268169-20211111223208132-254350038.png


  • 每次进行增删改查,方法里传入的 sql 唯一标识id 就好长一串。
  • 再者就是传入的查询入参类型是一个object,也就是什么都可以往里面传,如果传"a",肯定查不出来数据。


那么,mybatis 还提供了另一种更高级的使用方式:接口式编程,这也是后续开发中主要使用的方式。


我们可以使用一个接口来描述一个给定的sql语句,它的参数和返回值。


一、接口与配置文件动态绑定


在测试平台项目下的 dao 层新建一个接口com.pingguo.bloomtest.dao.UserMapper:


package com.pingguo.bloomtest.dao;
import com.pingguo.bloomtest.pojo.User;
public interface UserMapper {
    User getUserById(Integer id);
}


定义好了接口,里面有一个方法getUserById,顾名思义就是通过id查询数据,返回 User 对象。


按照以往,定义好了接口,接下来还需要定义出接口的实现类。


但是现在这个接口就是用来查询出 user 表记录数据并封装成 User 对象返回,而在之前定义好的 sql 映射文件UserMapper.xml里,<select>标签里的 sql 也是做这个事情。


<mapper namespace="org.mybatis.example.UserMapper">
    <select id="selectUser" resultType="com.pingguo.bloomtest.pojo.User">
      select * from user where id = #{id}
    </select>
</mapper>


那么,现在就可以把接口与配置文件进行动态绑定:


  • namespace:不要随便写了,对应接口的全类名
  • id: 对应接口里的方法名


改完之后应该是这样了:


<mapper namespace="com.pingguo.bloomtest.dao.UserMapper">
    <select id="getUserById" resultType="com.pingguo.bloomtest.pojo.User">
      select * from user where id = #{id}
    </select>
</mapper>


再写一个测试方法查询一下:


@Test
    void test2() throws IOException {
        // 根据配置文件,创建一个 SqlSessionFactory 对象
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        // 获取 SqlSession 实例,可以执行已经映射的 sql 语句
        SqlSession session = sqlSessionFactory.openSession();
        // 获取接口的实现类对象
        UserMapper userMapper = session.getMapper(UserMapper.class);
        User user = userMapper.getUserById(4);
        System.out.println(user);
    }


getMapper方法可以获取到这个接口的实现对象。


第一步因为要经常使用,所以抽出去了:


public SqlSessionFactory getSqlSessionFactory() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        return new SqlSessionFactoryBuilder().build(inputStream);
    }


执行测试,查询成功。


1268169-20211111231805241-1418368372.png


那么问题来了,这个接口还没写实现类,那么


`UserMapper userMapper = session.getMapper(UserMapper.class);`


获取到的是什么?


加个打印System.out.println(userMapper.getClass());看下输出。


1268169-20211111232317863-2018541925.png


原来是个代理对象


所以说,只要把接口和 xml文件进行动态绑定,mybatis 会为接口自动创建一个代理对象,然后由代理对象去执行增删改查方法。


二、关于 SqlSession


SqlSession代表和数据库的一次会话。用完必须关闭,我上面的事例应该加上session.close();


另外,SqlSession也是非线程安全


  • 线程安全:就是在多线程环境下也不会出现数据不一致,
  • 非线程安全: 就有可能出现数据不一致的情况。


所以不能像这样写:


1268169-20211111233309965-842532762.png


如果这样写,可能会出现A线程 用了 SqlSession,然后关掉了,但是线程B 还在用。所以每次使用都应该去获取新的对象,不要放在成员变量中。

相关文章
|
18天前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
52 3
|
2月前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
40 10
|
2月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
68 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
3月前
|
移动开发 JSON Java
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
252 7
Jmeter实现WebSocket协议的接口测试方法
|
3月前
|
JSON 移动开发 监控
快速上手|HTTP 接口功能自动化测试
HTTP接口功能测试对于确保Web应用和H5应用的数据正确性至关重要。这类测试主要针对后台HTTP接口,通过构造不同参数输入值并获取JSON格式的输出结果来进行验证。HTTP协议基于TCP连接,包括请求与响应模式。请求由请求行、消息报头和请求正文组成,响应则包含状态行、消息报头及响应正文。常用的请求方法有GET、POST等,而响应状态码如2xx代表成功。测试过程使用Python语言和pycurl模块调用接口,并通过断言机制比对实际与预期结果,确保功能正确性。
263 3
快速上手|HTTP 接口功能自动化测试
|
3月前
|
JavaScript 前端开发 测试技术
ChatGPT与接口测试
ChatGPT与接口测试,测试通过
49 5
|
2月前
|
JavaScript 前端开发 API
vue尚品汇商城项目-day02【9.Home组件拆分+10.postman测试接口】
vue尚品汇商城项目-day02【9.Home组件拆分+10.postman测试接口】
41 0
|
2月前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
121 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
2月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
58 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
2月前
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
371 1
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个