MyBatis概述

MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集的过程。

核心特点

优势:

  • SQL语句与Java代码分离,便于维护
  • 支持动态SQL,灵活性高
  • 提供了强大的映射功能
  • 与Spring框架集成良好
  • 学习成本相对较低

与其他框架对比:

  • 相比Hibernate:更轻量级,SQL可控性更强
  • 相比JDBC:减少了大量样板代码
  • 相比JPA:更适合复杂查询和性能优化

MyBatis核心组件

1. SqlSessionFactory

// 创建SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

2. SqlSession

// 获取SqlSession
SqlSession session = sqlSessionFactory.openSession();
try {// 执行操作UserMapper mapper = session.getMapper(UserMapper.class);User user = mapper.selectUser(1);
} finally {session.close();
}

3. Mapper接口

public interface UserMapper {User selectUser(int id);List<User> selectAllUsers();void insertUser(User user);void updateUser(User user);void deleteUser(int id);
}

4. XML映射文件

<?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.mapper.UserMapper"><select id="selectUser" parameterType="int" resultType="User">SELECT * FROM users WHERE id = #{id}</select><insert id="insertUser" parameterType="User">INSERT INTO users (name, email) VALUES (#{name}, #{email})</insert>
</mapper>

IDEA中的MyBatis开发

1. 项目创建与依赖配置

Maven依赖:

<dependencies><!-- MyBatis核心依赖 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.13</version></dependency><!-- 数据库驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency><!-- Spring Boot集成(可选) --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.2</version></dependency>
</dependencies>

2. IDEA插件推荐

MyBatis相关插件:

  • MyBatis Log Plugin:日志格式化显示
  • MyBatis Mapper Generator:代码生成
  • Free MyBatis Plugin:XML与Mapper跳转
  • MyBatis Plus:增强功能支持

3. 配置文件设置

mybatis-config.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="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis_db"/><property name="username" value="root"/><property name="password" value="password"/></dataSource></environment></environments><mappers><mapper resource="mapper/UserMapper.xml"/></mappers>
</configuration>

4. 实体类设计

public class User {private Integer id;private String name;private String email;private Date createTime;// 构造方法、getter、setter省略
}

5. Mapper接口与XML映射

UserMapper.java:

@Mapper
public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{id}")User selectById(Integer id);List<User> selectAll();@Insert("INSERT INTO users(name, email) VALUES(#{name}, #{email})")@Options(useGeneratedKeys = true, keyProperty = "id")void insert(User user);void update(User user);@Delete("DELETE FROM users WHERE id = #{id}")void deleteById(Integer id);
}

UserMapper.xml:

<?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.mapper.UserMapper"><resultMap id="userResultMap" type="User"><id property="id" column="id"/><result property="name" column="name"/><result property="email" column="email"/><result property="createTime" column="create_time"/></resultMap><select id="selectAll" resultMap="userResultMap">SELECT id, name, email, create_time FROM users</select><update id="update" parameterType="User">UPDATE users SET name = #{name},email = #{email}WHERE id = #{id}</update><!-- 动态SQL示例 --><select id="selectByCondition" parameterType="User" resultMap="userResultMap">SELECT * FROM users<where><if test="name != null and name != ''">AND name LIKE CONCAT('%', #{name}, '%')</if><if test="email != null and email != ''">AND email = #{email}</if></where></select>
</mapper>

动态SQL详解

1. if标签

<select id="selectByCondition" parameterType="User" resultType="User">SELECT * FROM users<where><if test="name != null and name != ''">AND name = #{name}</if><if test="email != null">AND email = #{email}</if></where>
</select>

2. choose、when、otherwise

<select id="selectByIdOrName" parameterType="User" resultType="User">SELECT * FROM users<where><choose><when test="id != null">id = #{id}</when><when test="name != null and name != ''">name = #{name}</when><otherwise>1 = 1</otherwise></choose></where>
</select>

3. foreach标签

<select id="selectByIds" parameterType="list" resultType="User">SELECT * FROM users WHERE id IN<foreach collection="list" item="id" open="(" close=")" separator=",">#{id}</foreach>
</select>

Spring Boot集成

1. 配置文件

# application.yml
mybatis:mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.example.entityconfiguration:map-underscore-to-camel-case: truespring:datasource:url: jdbc:mysql://localhost:3306/mybatis_dbusername: rootpassword: passworddriver-class-name: com.mysql.cj.jdbc.Driver

2. 主启动类

@SpringBootApplication
@MapperScan("com.example.mapper")
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

3. Service层实现

@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public User getUserById(Integer id) {return userMapper.selectById(id);}public List<User> getAllUsers() {return userMapper.selectAll();}@Transactionalpublic void saveUser(User user) {userMapper.insert(user);}
}

IDEA开发技巧

1. 代码生成器使用

MyBatis Generator配置:

<generatorConfiguration><context id="MySQLTables" targetRuntime="MyBatis3"><jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/mybatis_db"userId="root"password="password"/><javaModelGenerator targetPackage="com.example.entity" targetProject="src/main/java"/><sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"/><javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java"/><table tableName="users" domainObjectName="User"/></context>
</generatorConfiguration>

2. 调试技巧

  • 使用MyBatis Log Plugin查看SQL执行情况
  • 在IDEA中设置断点调试Mapper方法
  • 利用Database工具直接测试SQL语句

3. 性能优化

  • 合理使用缓存机制
  • 避免N+1查询问题
  • 使用批量操作提高效率
  • 监控SQL执行计划
  1. 命名规范:Mapper接口与XML文件保持一致的命名
  2. 事务管理:合理使用@Transactional注解
  3. 异常处理:统一处理数据访问异常
  4. 参数验证:在Service层进行业务逻辑验证
  5. 日志记录:记录关键操作的执行日志

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

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

相关文章

LangGraph教程6:LangGraph工作流人机交互

文章目录 Human-in-the-loop(人机交互) interrupt Warning Human-in-the-loop(人机交互) 人机交互(或称“在循环中”)工作流将人类输入整合到自动化过程中,在关键阶段允许决策、验证或修正。这在基于 LLM 的应用中尤其有用,因为基础模型可能会产生偶尔的不准确性。在合规、…

Linux部署Milvus数据库及Attu UI工具完全指南

一、准备工作1.1 环境要求操作系统&#xff1a;Ubuntu 20.04/Debian 11/CentOS 7硬件配置&#xff1a;至少8GB内存&#xff0c;4核CPU&#xff0c;50GB磁盘空间网络要求&#xff1a;可访问互联网&#xff08;用于拉取Docker镜像&#xff09;1.2 安装Docker和Docker Compose1.2.…

开疆智能Profinet转ModbusTCP网关连接康耐视InSight相机案例

相机配置&#xff1a;硬件连接部分可以查询我的博客&#xff1a;点击 这里不做说明。在电子表格视图下&#xff0c;点击菜单 “传感器–网络设置”&#xff1a;选择工业协议&#xff0c;如图。保存作业&#xff0c;并按照提示重启相机。3. 相机的控制/状态字&#xff1a;上图中…

BERT技术架构

### **一、整体定位&#xff1a;纯编码器架构**#### **核心设计思想**> **预训练微调**&#xff1a;> 1. **预训练**&#xff1a;在海量无标签文本上学习通用语言规律> 2. **微调**&#xff1a;用少量标注数据适配具体任务&#xff08;如分类/问答&#xff09;> **…

Python+ArcGIS+AI蒸散发与GPP估算|Penman-Monteith模型|FLUXNET数据处理|多源产品融合|专业科研绘图与可视化等

结合Python编程与ArcGIS工具&#xff0c;通过AI辅助方法实现蒸散发与植被总初级生产力估算。学习国际流行的Penman-Monteith模型&#xff0c;掌握数据获取、处理、分析和可视化全流程&#xff0c;培养生态水文与双碳领域的实践应用能力。通过DeepSeek、豆包等AI工具辅助代码编写…

elasticsearch+logstash+kibana+filebeat实现niginx日志收集(未过滤日志内容)

单点部署 环境准备 基于Rocky9虚拟机&#xff0c;内存大小为4G yum -y install lrzsz useradd elkf passwd elkf#密码随意su - elk rz 导入包&#xff0c;笔者导使用版本为7.17.8下载地址&#xff1a;https://www.elastic.co/downloads/past-releases/ tar -xf elasticsearch-7…

hadoop 集群问题处理

1.1.JournalNode 的作用在 HDFS HA 配置中&#xff0c;为了实现两个 NameNode 之间的状态同步和故障自动切换&#xff0c;Hadoop 使用了一组 JournalNode 来管理共享的编辑日志。具体来说&#xff0c;JournalNode 的主要职责包括&#xff1a;共享编辑日志&#xff1a;JournalNo…

LeetCode--46.全排列

解题思路&#xff1a;1.获取信息&#xff1a;给定一个不含重复数字的数组&#xff0c;返回所有可能的全排列&#xff0c;可以按任意顺序返回提示信息&#xff1a;1 < nums.length < 6-10 < nums[i] < 102.分析题目&#xff1a;要获取到所有可能的全排列我们每次会从…

云徙科技----一面(全栈开发)

一、公司是做什么业务的&#xff1f;二、介绍一下自己会用的&#xff0c;熟悉的技术栈&#xff1f;三、“在 Spring 应用中&#xff0c;当你发起一个 RESTful API 请求时&#xff08;例如 GET /api/users/1&#xff09;&#xff0c;计算机系统是如何知道这个请求的&#xff1f;…

我是怎么设计一个订单号生成策略的(库存系统)

我是怎么设计一个订单号生成策略的&#xff08;库存系统&#xff09;一、背景 最近我在做一套自研的库存管理系统&#xff0c;其中有一个看似简单、实则很关键的功能&#xff1a;订单号生成策略。 订单号不仅要全局唯一&#xff0c;还要有一定的可读性和业务含义&#xff0c;比…

问津集 #1:Rethinking The Compaction Policies in LSM-trees

文章目录引言正文结束语引言 陪女朋友出门&#xff0c;我大概有两个小时左右的空闲时间&#xff0c;遂带上电脑&#xff0c;翻了下论文列表&#xff0c;选择了这篇文章做一个简读。 因为这一年负责时序系统的存储引擎和计算引擎演进&#xff0c;而Compaction又是串联读写的核心…

数据产品结构:从数据接入到可视化的完整架构指南

在数据驱动决策的时代&#xff0c;一套高效的数据产品结构是企业挖掘数据价值的基础。无论是巨头企业自建的完整体系&#xff0c;还是中小企业依赖的第三方工具&#xff0c;其核心逻辑都是实现 “数据从产生到呈现” 的全链路管理。本文将拆解数据产品的五层架构&#xff0c;对…

python学智能算法(二十三)|SVM-几何距离

引言 前序学习文章中&#xff0c;已经探究了电荷超平面的距离计算方法&#xff0c;相关文章为点与超平面的距离。 在这片文章中&#xff0c;我们了解到计算距离的公式&#xff1a; Fmin⁡i1...myi(w⋅xib)F\min_{i1...m}y_{i}(w\cdot x_{i}b)Fi1...mmin​yi​(w⋅xi​b) 计算…

[每日随题11] 贪心 - 数学 - 区间DP

整体概述 难度&#xff1a;1000 →\rightarrow→ 1400 →\rightarrow→ 1600 P3918 [国家集训队] 特技飞行 标签&#xff1a;贪心 前置知识&#xff1a;无 难度&#xff1a;橙 1000 题目描述&#xff1a; 输入格式&#xff1a; 输出格式&#xff1a; 样例输入&#xff1a;…

Elasticsearch 9.x 搜索执行流程(源码解读)

1. 搜索执行流程概述 Elasticsearch的搜索执行是一个分布式过程,涉及协调节点和数据节点之间的多阶段交互 #mermaid-svg-QGh2GjrUKcs5jzQp {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QGh2GjrUKcs5jzQp .error…

暑期训练8

E. G-C-D, Unlucky!题目要求判断是否存在一个长度为 n 的数组 a&#xff0c;使得p[i] 是 a[0..i] 的前缀 GCDs[i] 是 a[i..n-1] 的后缀 GCD思路前缀 GCD 非递增后缀 GCD 非递减首尾 GCD 一致桥梁条件成立对于每个位置 i&#xff0c;gcd(p[i], s[i1]) 必须等于整个数组的 GCD&am…

深入解析Hadoop HDFS高可用性:原理、故障切换与元数据同步

Hadoop HDFS高可用性(HA)概述在分布式存储领域&#xff0c;Hadoop分布式文件系统(HDFS)作为Hadoop生态系统的核心存储组件&#xff0c;其高可用性(HA)设计一直是架构师们关注的焦点。传统HDFS架构中&#xff0c;NameNode作为单一主节点管理整个文件系统的元数据&#xff0c;这种…

Freertos源码分析:任务创建/删除

任务创建/删除流程1.简介FreeRTOS 中任务创建通过 xTaskCreate() 或 xTaskCreateStatic() 实现。动态创建&#xff08;xTaskCreate&#xff09;会自动分配任务栈和TCB&#xff08;任务控制块&#xff09;&#xff0c;静态创建&#xff08;xTaskCreateStatic&#xff09;需用户预…

warning: _close is not implemented and will always fail

相关问题&#xff1a; 一、undefined reference to _exit undefined reference to ‘end‘ warning: _close is not implemented and will always fail 一、环境&#xff1a; ubuntu24.04实体机、 arm-none-eabi-gcc gcc version 13.2.1 20231009 (15:13.2.rel1-2) 二…

MyBatis之缓存机制详解

MyBatis之缓存机制详解一、MyBatis缓存的基本概念1.1 缓存的核心价值1.2 MyBatis的两级缓存体系二、一级缓存&#xff08;SqlSession级别缓存&#xff09;2.1 工作原理2.2 实战案例&#xff1a;一级缓存演示2.2.1 基础用法&#xff08;默认开启&#xff09;2.2.2 一级缓存失效场…