初识MyBatis

1、什么是 MyBatis

        MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

2、优点

  • 灵活性高:MyBatis不会对应用程序或数据库的现有设计强加任何影响,开发人员可以使用他们已经熟悉的SQL语句、存储过程和数据库触发器等
  • SQL可控性强:对于复杂查询和多表关联查询时,MyBatis的优势尤为明显,因为可以更加灵活地控制生成的SQL语句,并在需要的情况下针对不同的数据库实现进行优化。
  • 缓存机制好:MyBatis提供了一级缓存和二级缓存,可以有效地减少数据库访问次数,提高响应速度,而且它们的使用非常方便,并且默认情况下处于开启状态。
  • 生态系统完善:MyBatis有着非常强大的社区支持,同时它也与Spring,Spring Boot等流行框架或中间件无缝整合,方便企业级项目的开发。

3、缺点

  • 性能问题:相比于Hibernate等ORM框架,在大规模数据处理能力和并发性方面,MyBatis的性能表现略逊一筹。
  • 配置复杂:相比Hibernate等ORM框架,MyBatis的配置文件相对较为复杂,需要花费更多的时间和精力进行配置。
  • 映射错误难以追踪:由于映射文件是通过XML描述符或注解进行的,为了解决常见的SQL问题,需要对SQL语句的编写和映射文件的正确描述非常敏感,出现异常时排查起来也较为繁琐。

4、MyBatis的安装

<dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version></dependency>
</dependencies>

自动生成Java代码和MyBatis映射文件

<plugins><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.4.0</version><configuration><!-- MyBatis Generator配置文件的位置 --><configurationFile>src/main/resources/generatorConfig.xml</configurationFile><overwrite>true</overwrite><verbose>true</verbose></configuration></plugin>
</plugins>

5、数据库连接池

MyBatis并没有内置数据库连接池,因此需要使用第三方的数据库连接池。常见的数据库连接池有如下几种:

  • HikariCP:性能最好的连接池,也是目前最流行的连接池之一。
  • Apache Commons DBCP2:Apache官方开发的连接池,支持连接池配置和管理、连接有效性验证、闲置连接回收等功能。
  • Alibaba Druid:阿里巴巴开发的连接池,支持JDBC规范、多数据源、SQL防注入、监控等功能。
<dependencies><dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId><version>4.0.3</version></dependency>
</dependencies>

6、MyBatis配置方式

6.1、基于xml配置文件配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 数据库连接信息 --><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="com.zaxxer.hikari.HikariDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test?useSSL=false&amp;serverTimezone=Asia/Shanghai"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><!-- 扫描映射文件 --><mappers><mapper resource="com/example/demo/mapper/UserMapper.xml"/></mappers>
</configuration>

6.2、基于yaml配置文件配置

# MyBatis 配置
mybatis:# 别名配置typeAliasesPackage: com.example.demo.entity# Mapper XML文件存放路径mapperLocations: classpath*:mapper/*.xml# 数据库连接池配置datasource:url: jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=Asia/Shanghaiusername: rootpassword: rootdriver-class-name: com.mysql.jdbc.Drivertype: com.zaxxer.hikari.HikariDataSourcehikari:minimumIdle: 5maximumPoolSize: 20idleTimeout: 300000connectionTimeout: 30000

6.3、基于注解配置文配置

/ 实体类
public class User {private Long id;private String username;private Integer age;// getter、setter方法省略
}// Dao接口
@Mapper
public interface UserDao {@Select("SELECT * FROM user WHERE id = #{id}")User findById(Long id);@Insert("INSERT INTO user(username, age) VALUES (#{username}, #{age})")int save(User user);@Update("UPDATE user SET username = #{username}, age = #{age} WHERE id = #{id}")int update(User user);@Delete("DELETE FROM user WHERE id = #{id}")int deleteById(Long id);
}// 配置类
@Configuration
@MapperScan("com.example.demo.mapper")
public class MybatisConfig {@Beanpublic SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();sessionFactory.setDataSource(dataSource);PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();sessionFactory.setMapperLocations(resolver.getResources("classpath*:mapper/*.xml"));return sessionFactory.getObject();}
}

7、MyBatis使用

7.1、Java类

@Mapper
public interface UserMapper {User findById(Long id);int save(User user);int update(User user);int deleteById(Long id);
}

7.2、mapper文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.example.demo.mapper.UserMapper"><!-- 查询操作 --><select id="findById" parameterType="Long" resultType="User">SELECT *FROM userWHERE id = #{id}</select><!-- 插入操作 --><insert id="save" parameterType="User">INSERT INTO user(username, age)VALUES (#{username}, #{age})</insert><!-- 更新操作 --><update id="update" parameterType="User">UPDATE user SETusername = #{username},age = #{age}WHERE id = #{id}</update><!-- 删除操作 --><delete id="deleteById" parameterType="Long">DELETE FROM userWHERE id = #{id}</delete>
</mapper>

8、MyBatis的注意事项以及常见问题

在使用MyBatis时,需要注意以下事项:

  1. 避免使用SELECT *:使用明确指出需要查询的字段,而不是查询全部字段,可以提高查询效率。
  2. 显式指定参数类型:在使用Mapper接口调用SQL查询时,参数类型必须与Mapper接口方法参数类型一致或者符合JavaBean规范。
  3. 使用动态SQL:可以根据不同的条件排除或者包含某个SQL片段,以达到避免重复代码的作用。
  4. 使用缓存:MyBatis支持多种缓存方式,可以提高查询效率。但是需要注意缓存更新策略,以免出现数据不一致问题。
  5. 配置文件管理:MyBatis的配置文件中包含了许多的配置信息,需要注意配置信息的管理和维护。

在使用MyBatis过程中,也存在一些常见问题,例如:

  1. 多表查询使用联合查询的性能问题。
  2. 分页查询时,使用游标或者取所有数据的性能问题。
  3. MyBatis缓存机制带来的数据不一致问题。
  4. SQL语句过于复杂,导致难以调试和维护。
  5. 数据库连接池的优化问题。

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

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

相关文章

[LeetCode系列] 30天pandas挑战

很久没有写AI或者Python相关的代码&#xff0c;毕竟现在已经不是一个算法工程师了。所以就用白嫖版的leetcode练练手。 先丢个代码&#xff0c;再慢慢填坑把 import pandas as pd# 1.大的国家&#xff0c;选出面基至少为300万或者人口至少为2500万的国家 # 简单的pandas过滤 …

【数据结构与算法篇】一文详解数据结构之二叉树

树的介绍及二叉树的C实现 一 . 树的概念二 . 相关术语三 . 树的表示四 . 什么是二叉树1> 二叉树的特性2> 特殊的二叉树3> 二叉树的性质 五 . 二叉树的存储结构1> 二叉树的顺序存储2> 二叉树的链式存储 六 . 堆1> 什么是堆2> 用堆存储数据3> 堆的Cpp代码…

木马病毒是怎么进入服务器的,要如何防范

木马病毒通常是基于计算机网络&#xff0c;基于客户端和服务端的通信、监控程序。名称来源于公元前十二世纪希腊和特洛伊之间的一场战争。能够在计算机管理员未发觉的情况下开放系统权限、泄漏用户信息、甚至窃取整个计算机管理使用权限&#xff0c;隐匿性高。 木马病毒的入侵方…

【恋上数据结构】哈夫曼树学习笔记

哈夫曼树 哈夫曼编码&#xff08;Huffman Coding&#xff09; 哈夫曼编码&#xff0c;又称为霍夫曼编码&#xff0c;它是现代压缩算法的基础 假设要把字符串 [ABBBCCCCCCCCDDDDDDEE] 转成二进制编码进行传输。 可以转成 ASCII 编码 (6569&#xff0c;10000011000101) &…

Python脚本模拟真实设备刷视频播放量、浏览量

简述 Python3脚本刷视频播放量 前情提示 系统:centOS7,8阿里云一折优惠云小站_专享特惠_云产品推荐-阿里云 宝塔8.x 一说 部分截图、链接等因过期、更换域名、MD语法等可能不显示,可联系反馈(备注好博文地址),谢谢❤带有#号、删除线、不操作、不执行字样的为提示或者…

C++学习之路(十九)C++ 用Qt5实现一个工具箱(用SQLite数据库来管理粘贴板数据)- 示例代码拆分讲解

上篇文章&#xff0c;我们用 Qt5 实现了在小工具箱中添加了《点击按钮以新窗口打开功能面板》功能。今天我们把粘贴板功能用SQLite数据库来管理&#xff0c;用SQLite来实现增删改查。下面我们就来看看如何来规划开发这样的小功能并且添加到我们的工具箱中吧。 老规矩&#xff…

基于51单片机多功能时钟闹钟系统

**单片机设计介绍&#xff0c;基于51单片机多功能时钟闹钟系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于51单片机的多功能时钟闹钟系统是一种基于单片机的电子设备&#xff0c;能够显示时间、设置闹钟、进行计时以及提…

随机链表的复制[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你一个长度为n的链表&#xff0c;每个节点包含一个额外增加的随机指针random&#xff0c;该指针可以指向链表中的任何节点或空节点。构造这个链表的深拷贝。深拷贝应该正好由n个全新节点组成&#xff0c;其中每个新节点的值都设为…

sip 用户名密码注册通信流程

SIP&#xff08;Session Initiation Protocol&#xff09;用户注册的通信流程涉及客户端向SIP服务器注册&#xff0c;并在需要时进行身份验证。以下是基本的SIP注册通信流程&#xff0c;其中包含了用户名密码的注册和身份验证&#xff1a; 1. SIP REGISTER 请求: - 客户端&…

Java File类详解(中)

File的常见成员方法 判断、获取相关的方法 方法名称 说明 public boolean isDirectory() 判断此路径名表示的File是否为文件夹 public boolean isFile() 判断此路径名表示的File是否为文件 public boolean exists() 判断此路径名表示的File是否存在 public long lengt…

在 CentOS 7 上使用 `redis` 用户安装 Redis 7.2.3 的完整步骤

在 CentOS 7 上使用 redis 用户安装 Redis 7.2.3 的完整步骤如下&#xff1a; 安装依赖&#xff1a;首先&#xff0c;您需要安装一些必要的软件包&#xff0c;以编译和运行 Redis。打开终端并执行以下命令&#xff1a; sudo yum install gcc make创建 Redis 用户&#xff1a;为…

Hadoop学习笔记(HDP)-Part.18 安装Flink

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

查看Linux服务器的CPU利用率常用的命令

查看Linux服务器的CPU利用率常用的命令 在Linux服务器上&#xff0c;可以使用多种命令来查看CPU的利用率。以下是一些常用的命令&#xff1a; 1 top命令&#xff1a; top 命令是一个实时的系统监视器&#xff0c;可以显示当前系统的 CPU 利用率、内存利用率、进程信息等。在…

sort by modulus of a complex number

描述 复数E包含实部x和虚部y, Exyi;E的模为: 输入n(<1000)和n对(x,y); 按模数升序对复合体进行排序&#xff0c;如果模数相等&#xff0c;则按输入顺序排序。 排序后输出n行of (x_i,y_i,mod_i)&#xff0c;保留2个十进制小数。 输入 输入n和n对(x,y); 输出 输出排序后的n行(…

驱动模块--内核模块

内核模块宏都有什么&#xff0c;分别有什么作用&#xff1f; 1.__init的作用: 展开后为&#xff1a;__attribute__((__section_(".init.text")))实际是gcc的一个特殊链接标记 指示链接器将该函数放置在.init.text区段&#xff0c;在模块插入时方便内核从ko文件指定位…

P=NP?

背景&#xff1a;   2000年5月24日&#xff0c;新罕布什尔州的克莱数学研究所列出了数学和计算机科学中七个未解决的问题。然而&#xff0c;直到今天&#xff0c;这些问题中只有一个被解决了&#xff0c;那就是庞加莱猜想&#xff08;Poincar Conjecture&#xff09;——被俄…

前端】全局替换(replace//g)

//比如\ [] " 以[]为例 var ch"微笑"; var str"[微笑]我是小仙女&#xff01;[微笑]我是小仙女&#xff01;";alert(str.replace(ch,"哈")); //输出 哈我是小仙女&#xff01;[微笑]我是小仙女&#xff01;var encodeeval("/"&q…

手机如何设置防骚扰电话?

很多人都曾接到过烦人的推销电话&#xff0c;这些电话不仅让人感到烦恼&#xff0c;而且有时候还会接二连三地打来&#xff0c;让人不胜其烦。我们的手机号码似乎已经被泄露&#xff0c;很难避免这些骚扰。 有时&#xff0c;我们因无法忍受骚扰电话而选择立即将其拉黑&#xff…

深入理解Redis分片策略:提升系统性能的关键一步

目录 引言 1. 一致性哈希算法 2. 范围分片 3. 哈希槽分片 实战经验分享 结论 引言 Redis作为一款高性能的键值存储系统&#xff0c;为了应对大规模数据和高并发的访问&#xff0c;引入了分片策略&#xff0c;使得数据能够分布存储在多个节点上&#xff0c;实现系统的横向…

考研数据结构

851专业课 线性表线性表的定义线性表的顺序表示顺序表代码 线性表的链式存储表示单链表代码 顺序表和链表的比较 栈和队列栈顺序栈链栈 队列顺序队列链队列 串和数组kmp数组广义表 树和二叉树二叉树二叉树代码 线索二叉树线索二叉树代码 树和森林树的存储结构 哈夫曼树 图图的存…