当前位置: 首页 > news >正文

JAVA-Web后端学习4 MyBatis

愛してるばんざーい!ここでよかった 私たちの今がここにある

MyBatis介绍

JDBC代码疑似是有些太复杂了,而且也不太符合我们之前要求的模块化编程,所以我们使用MyBatis框架来进行简化。

MyBatis是一款优秀的持久层框架,用于简化JDBC开发。MyBatis在底层仍然使用 JDBC 来访问数据库,但封装了 JDBC 的复杂性,提供了更简洁、更易用的 API。

//原来的JDBC连接代码
public class JdbcTest {@Testpublic void testQuery() throws ClassNotFoundException, SQLException {//1.注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//2.获取数据库连接String url = "jdbc:mysql://localhost:3306/dbtest";String username = "root";String password = "123456";Connection connection = DriverManager.getConnection(url,username,password);//3.获取SQL语句执行对象PreparedStatement pstmt = connection.prepareStatement("select * from user where username = ? and age = ?");//4.执行SQLpstmt.setString(1,"lvbu");pstmt.setInt(2,28);ResultSet rs = pstmt.executeQuery();//5.处理结果集while(rs.next()) {UserData userData = new UserData(rs.getInt("id"),rs.getString("username"),rs.getString("password"),rs.getString("name"),rs.getInt("age"));System.out.println(userData);}//6.释放资源pstmt.close();connection.close();}
}//MyBatis框架核心代码
@Mapper
public interface UserMapper {@Select("select * from user")public List<UserData> findAll();
}

MyBatis入门编程

首先是准备工作,创建一个SpringBoot工程并引入MyBatis依赖

image

接下来创建数据库,数据表以及相应的数据封装实类,这里就直接略过了

然后在MyBatis的配置文件application.properties中引入相关的数据库驱动依赖

spring.application.name=Mybatis# 配置数据库的连接信息
spring.datasource.url=jdbc:mysql://localhost:3306/dbtest  //数据库地址
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver //MYSQL驱动
spring.datasource.username=root //登录数据库用户名
spring.datasource.password=123456 //登录数据库密码

接下来 配置MyBatis的持久层接口
这是我们使用到了两个注解@Mapper@Select
@Mapper 注解是一个重要的标记注解,用于标识接口,使得 MyBatis 能够识别并将其与相应的 SQL 映射关联起来。使用@Mapper注解的接口,应用程序运行时会自动为该接口创建一个实现类对象(代理对象),并且自动存入IOC容器。
@Select注解是一种用于定义DQL语句的注解,它允许开发者以声明式的方式编写查询操作,从而简化了数据库查询的编写过程。

@Mapper //
public interface UserMapper {@Select("select * from user")public List<UserData> findAll();
}

最后,准备单元测试类

@SpringBootTest //SpringBoot中单元测试的注解 - 当前测试类中的测试方法运行时会启动SpringBoot项目
class MybatisApplicationTests {@Autowiredprivate UserMapper userMapper;@Testpublic void testFindAll() {List<UserData> userList = userMapper.findAll();userList.forEach(System.out::println);}
}

运行结果如下:
image

MyBatis辅助配置

MyBatis中存在一些辅助配置,凭借这些可以提高我们的开发效率

MYSQL语句识别

在IDEA中的@Select中添加MYSQL语句时没有相关提示,因为默认是不识别SQL语句的,那么我们可以注入MYSQL语言

在IDEA中的@Select中的MYSQL语句处右击,然后点击Show Context Actions(显示上下文操作),然后选择Inject language or reference(注入语言或引用),选择MYSQL,这样IDEA就可以识别MYSQL了

配置完后,不出意外user报错了
image

因为IDEA没有和数据库(database)建立连接,也就无法识别其中的表user,所以我们在建立数据源连接的时候需要指定数据库
image

接下来发现IDEA无报错,且可以识别数据库相关字段
image

MYSQL日志输出

在MyBatis配置文件application.properties中加入这一行

# 配置MyBatis日志输出
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

接下来执行代码,日志输出如下所示:
image

JDBC对比MyBatis

JDBC存在三大问题

①代码中需要设置数据库连接以及登录用户名密码的硬编码问题,
②代码繁琐
③涉及到大量连接,资源浪费,性能降低

相较于JDBC,MyBatis只需要考虑两个核心步骤:①application.properties文件的配置 ②Mapper接口层的设置

MyBatis数据库连接池

数据库连接池类似于线程池,负责管理分配数据库连接,允许应用程序多次复用同一个现有的数据库连接,而不是重新建立一个;如果连接保持空闲时间超过最大空闲时间,那么数据库连接池就会自动释放连接从而避免没有释放连接引起的数据库连接遗漏。

优点:①资源重用 ②统一管理提升系统响应速度 ③避免数据库遗漏

数据库连接池标准接口为:DataSource 其核心方法如下:

Connection getConnection() throws SQLExeception; //功能:获取连接

常见产品为:C3P0,DBCP,Druid(常见),Hikari(常见,SpringBoot默认)

我们可以查看IDEA的运行日志,发现了Hikari的存在,其中划线处为添加连接
image

切换连接池

切换连接池需要做两步,修改POM.XML和application.properties
这是切换为国内的Druid的连接池

//POM.XML中配置依赖
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.19</version>
</dependency>//application.properties中添加druid的DataSource连接信息
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

MyBatis完成增删改查

入门MyBatis语句之后,使用MyBatis完成SQL的增删改查操作,其实相较于之前都大差不差

其中为防止硬编码,使用#作为占位符,(有的时候也会看见$占位符,但是常用的是前者)

删除操作

//UserMapper.java中定义
@Delete("delete from user where id = #{id}")
public void deleteByID(Integer id);
//测试方法中调用
@Test
public void testDelete() {userMapper.deleteByID(5);
}

修改操作

这里一定要保证占位符后接的变量名与结构体变量名一致,接下来的插入操作也是如此

//UserMapper.java中定义
@Update("update user set username = #{username},password = #{password},name = #{name},age = #{age} where id = #{id}")
public void updateByID(UserData userData);
//测试方法中调用
@Test
public void testUpdate() {UserData userData = new UserData(6,"xiaohu","123456","小虎",30);userMapper.updateByID(userData);
}

插入操作

//UserMapper.java中定义
@Update("update user set username = #{username},password = #{password},name = #{name},age = #{age} where id = #{id}")
public void updateByID(UserData userData);
//测试方法中调用
@Test
public void testInsert() {UserData userData = new UserData(null,"zhouyu","123456","周瑜",18);userMapper.insertValues(userData);
}

查询操作

//UserMapper.java中定义
@Select("select * from user where username=#{username} and password=#{password}")
public List<UserData> selectByUsernameAndPassword(String username, String password);
//测试方法中调用
@Test
public void testSelect() {List<UserData> userList = userMapper.selectByUsernameAndPassword("xiaohu","123456");;userList.forEach(System.out::println);}

值得注意的是,在有的旧版本中,MyBatis编译之后是无法识别传递进来的username和password的

啥意思,就是说传递进来编译之后是这样的,从而导致无法识别

@Select("select * from user where username=#{username} and password=#{password}")
public List<UserData> selectByUsernameAndPassword(String var1, String var2);

所以需要添加@Param注解,这个需要根据代码版本来了,最新版本的就不用这么做

@Select("select * from user where username=#{username} and password=#{password}")
public List<UserData> selectByUsernameAndPassword(@Param("username") String username,@Param("password") String password);
http://www.jsqmd.com/news/503714/

相关文章:

  • 新唐MCU UART调试踩坑实录:从管脚配置到FIFO溢出的7天血泪史
  • Altium Designer PCB设计效率翻倍:这30个快捷键让你告别鼠标手(附实战技巧)
  • 用PlatformIO给ESP32打造数码管时钟:0.96寸TFT取模与SPI优化心得
  • 医疗机器人企业钓鱼攻击致数据泄露的机理分析与防御重构
  • 【Elasticsearch实战】从零到一:构建安全高效生产集群的网络配置指南
  • 普通人的 AI 智能体入门指南:从选赛道到跑通赚钱闭环,3 步上手 2026 年最火变现风口
  • 【技术解析】CVPR 2024 DSL-FIQA:基于双集退化学习与关键点引导的Transformer人脸质量评估新范式
  • OpenClaw技能共享:ollama-QwQ-32B社区优秀模块推荐
  • 从医院到银行:拆解两个真实案例,看‘四张图’在不同行业信息化方案里怎么画
  • 合并两个有序数组
  • 从PN结到三端放大:BJT双极结型晶体管的工作原理与核心设计
  • 避坑指南:JMeter中RSA加签验签的常见错误与解决方案
  • 自动驾驶入门:为什么自行车模型总爱用后轴中心?3种原点选择全解析
  • BGE M3-Embedding:揭秘统一多语言、多功能、多粒度检索的“三合一”模型
  • Vben Admin:基于Vue3的企业级后台管理系统实战指南
  • 如何用AuraSR实现AI图像4倍无损放大:从零部署到实战应用
  • 基于社交信任链劫持的Konni组织多阶段攻击机制研究
  • PyG环境搭建避坑:从torch-sparse安装失败到一站式解决
  • 保姆级教程:用BGE-M3模型搞定多语言长文档检索(附Python代码与避坑指南)
  • 【C语言程序设计】第34篇:文件的概念与文件指针
  • Python实战:用statsmodels库搞定ARIMA时间序列预测(附完整代码)
  • C#实战:用WebView2和HandyControl打造透明股票盯盘工具(附源码)
  • 实时跟踪算法比较研究:PDA与JPDA在多目标杂波环境下的应用与分析
  • EcomGPT-中英文-7B电商模型Typora风格文档生成:优雅的本地商品知识管理
  • 从矩阵SVD到张量T-SVD:算法演进与核心思想剖析
  • 如何通过llama.cpp模型注册表快速部署30+主流大语言模型:新手入门终极指南
  • 实战演练:基于快马AI开发电商订单与库存联动的数据库应用
  • 为什么BERT和GPT都选择Transformer?拆解NLP模型进化史中的关键设计
  • 2026年压力测试工具对比与性能测试平台选型指南
  • 利用smart_rtmpd与ffmpeg实现高效RTMP推流全攻略