文章目录

  • MyBatis简介
  • 环境搭建
    • Maven依赖
    • 数据库表结构
  • 核心配置
    • MyBatis配置文件
    • 数据库配置文件
    • 实体类
  • 基础CRUD操作
    • Mapper接口
    • Mapper XML映射文件
    • 工具类
    • 测试类
  • 动态SQL
    • 常用标签
  • 高级特性
    • 一对一关联映射
    • 一对多关联映射
    • 分页查询
    • 使用注解方式

MyBatis简介

MyBatis是Apache的一个开源项目,前身是iBatis。它是一个基于Java的持久层框架,主要特点包括:相比Hibernate等ORM框架,MyBatis更加轻量级,并且支持自定义SQL,能够充分利用数据库特性。

环境搭建

Maven依赖

首先在pom.xml中添加MyBatis相关依赖:

<dependencies><!-- MyBatis核心依赖 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.13</version></dependency><!-- MySQL驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency>
</dependencies>

数据库表结构

创建一个用户表:

CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(50) NOT NULL,`email` varchar(100) DEFAULT NULL,`age` int(3) DEFAULT NULL,`created_time` datetime DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (`id`)
);

核心配置

MyBatis配置文件

创建mybatis-config.xml核心配置文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 属性配置 --><properties resource="database.properties"/><!-- 设置 --><settings><!-- 开启驼峰命名自动映射 --><setting name="mapUnderscoreToCamelCase" value="true"/></settings><!-- 类型别名 --><typeAliases><package name="com.example.entity"/></typeAliases><!-- 环境配置 --><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${database.driver}"/><property name="url" value="${database.url}"/><property name="username" value="${database.username}"/><property name="password" value="${database.password}"/></dataSource></environment></environments><!-- 映射器配置 --><mappers><mapper resource="mapper/UserMapper.xml"/></mappers>
</configuration>

数据库配置文件

创建database.properties文件:

database.driver=com.mysql.cj.jdbc.Driver
database.url=jdbc:mysql://localhost:3306/mybatis
database.username=root
database.password=123456

实体类

创建User实体类:

package com.example.entity;import java.time.LocalDateTime;public class User {private Integer id;private String username;private String email;private Integer age;private LocalDateTime createdTime;// 构造方法public User() {}public User(String username, String email, Integer age) {this.username = username;this.email = email;this.age = age;}// getter和setter方法public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public LocalDateTime getCreatedTime() {return createdTime;}public void setCreatedTime(LocalDateTime createdTime) {this.createdTime = createdTime;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", email='" + email + '\'' +", age=" + age +", createdTime=" + createdTime +'}';}
}

基础CRUD操作

Mapper接口

创建UserMapper接口:

package com.example.mapper;import com.example.entity.User;
import java.util.List;public interface UserMapper {// 插入用户int insertUser(User user);// 根据ID删除用户int deleteUserById(Integer id);// 更新用户信息int updateUser(User user);// 根据ID查询用户User selectUserById(Integer id);// 查询所有用户List<User> selectAllUsers();// 根据用户名查询用户List<User> selectUsersByUsername(String username);
}

Mapper XML映射文件

创建UserMapper.xml映射文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//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="username" column="username"/><result property="email" column="email"/><result property="age" column="age"/><result property="createdTime" column="created_time"/></resultMap><!-- 插入用户 --><insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">INSERT INTO user (username, email, age)VALUES (#{username}, #{email}, #{age})</insert><!-- 根据ID删除用户 --><delete id="deleteUserById" parameterType="int">DELETE FROM user WHERE id = #{id}</delete><!-- 更新用户信息 --><update id="updateUser" parameterType="User">UPDATE user SETusername = #{username},email = #{email},age = #{age}WHERE id = #{id}</update><!-- 根据ID查询用户 --><select id="selectUserById" parameterType="int" resultMap="userResultMap">SELECT id, username, email, age, created_timeFROM userWHERE id = #{id}</select><!-- 查询所有用户 --><select id="selectAllUsers" resultMap="userResultMap">SELECT id, username, email, age, created_timeFROM userORDER BY created_time DESC</select><!-- 根据用户名查询用户 --><select id="selectUsersByUsername" parameterType="string" resultMap="userResultMap">SELECT id, username, email, age, created_timeFROM userWHERE username LIKE CONCAT('%', #{username}, '%')</select></mapper>

工具类

创建MyBatis工具类:

package com.example.util;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;public class MyBatisUtil {private static SqlSessionFactory sqlSessionFactory;static {try {// 读取配置文件InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");// 创建SqlSessionFactorysqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {e.printStackTrace();}}// 获取SqlSessionpublic static SqlSession getSqlSession() {return sqlSessionFactory.openSession();}// 获取自动提交的SqlSessionpublic static SqlSession getSqlSession(boolean autoCommit) {return sqlSessionFactory.openSession(autoCommit);}
}

测试类

创建测试类验证CRUD操作:

package com.example.test;import com.example.entity.User;
import com.example.mapper.UserMapper;
import com.example.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;import java.util.List;public class MyBatisTest {public static void main(String[] args) {// 测试插入testInsert();// 测试查询testSelect();// 测试更新testUpdate();// 测试删除testDelete();}// 测试插入public static void testInsert() {SqlSession sqlSession = MyBatisUtil.getSqlSession();try {UserMapper mapper = sqlSession.getMapper(UserMapper.class);User user = new User("张三", "zhangsan@example.com", 25);int result = mapper.insertUser(user);sqlSession.commit();System.out.println("插入结果: " + result + ", 用户ID: " + user.getId());} finally {sqlSession.close();}}// 测试查询public static void testSelect() {SqlSession sqlSession = MyBatisUtil.getSqlSession();try {UserMapper mapper = sqlSession.getMapper(UserMapper.class);// 查询所有用户List<User> users = mapper.selectAllUsers();System.out.println("所有用户: " + users);// 根据ID查询if (!users.isEmpty()) {User user = mapper.selectUserById(users.get(0).getId());System.out.println("根据ID查询: " + user);}} finally {sqlSession.close();}}// 测试更新public static void testUpdate() {SqlSession sqlSession = MyBatisUtil.getSqlSession();try {UserMapper mapper = sqlSession.getMapper(UserMapper.class);List<User> users = mapper.selectAllUsers();if (!users.isEmpty()) {User user = users.get(0);user.setAge(30);user.setEmail("updated@example.com");int result = mapper.updateUser(user);sqlSession.commit();System.out.println("更新结果: " + result);}} finally {sqlSession.close();}}// 测试删除public static void testDelete() {SqlSession sqlSession = MyBatisUtil.getSqlSession();try {UserMapper mapper = sqlSession.getMapper(UserMapper.class);List<User> users = mapper.selectAllUsers();if (!users.isEmpty()) {int result = mapper.deleteUserById(users.get(0).getId());sqlSession.commit();System.out.println("删除结果: " + result);}} finally {sqlSession.close();}}
}

动态SQL

MyBatis提供了强大的动态SQL功能,可以根据条件动态生成SQL语句:

常用标签

<!-- if标签:条件判断 -->
<select id="selectUsersByCondition" parameterType="User" resultMap="userResultMap">SELECT * FROM userWHERE 1=1<if test="username != null and username != ''">AND username LIKE CONCAT('%', #{username}, '%')</if><if test="email != null and email != ''">AND email = #{email}</if><if test="age != null">AND age = #{age}</if>
</select><!-- where标签:智能处理WHERE关键字和AND/OR -->
<select id="selectUsersWithWhere" parameterType="User" resultMap="userResultMap">SELECT * FROM user<where><if test="username != null and username != ''">username LIKE CONCAT('%', #{username}, '%')</if><if test="email != null and email != ''">AND email = #{email}</if><if test="age != null">AND age = #{age}</if></where>
</select><!-- choose、when、otherwise:类似switch语句 -->
<select id="selectUsersByChoose" parameterType="User" resultMap="userResultMap">SELECT * FROM user<where><choose><when test="username != null and username != ''">username LIKE CONCAT('%', #{username}, '%')</when><when test="email != null and email != ''">email = #{email}</when><otherwise>age &gt; 18</otherwise></choose></where>
</select><!-- set标签:用于UPDATE语句 -->
<update id="updateUserSelective" parameterType="User">UPDATE user<set><if test="username != null and username != ''">username = #{username},</if><if test="email != null and email != ''">email = #{email},</if><if test="age != null">age = #{age}</if></set>WHERE id = #{id}
</update><!-- foreach标签:循环处理集合 -->
<select id="selectUsersByIds" parameterType="list" resultMap="userResultMap">SELECT * FROM userWHERE id IN<foreach collection="list" item="id" open="(" separator="," close=")">#{id}</foreach>
</select>

高级特性

一对一关联映射

<!-- 用户订单一对一关系 -->
<resultMap id="userWithOrderResultMap" type="User"><id property="id" column="user_id"/><result property="username" column="username"/><association property="order" javaType="Order"><id property="id" column="order_id"/><result property="orderNo" column="order_no"/><result property="amount" column="amount"/></association>
</resultMap><select id="selectUserWithOrder" resultMap="userWithOrderResultMap">SELECT u.id as user_id, u.username, o.id as order_id, o.order_no, o.amountFROM user uLEFT JOIN order o ON u.id = o.user_idWHERE u.id = #{id}
</select>

一对多关联映射

<!-- 用户订单一对多关系 -->
<resultMap id="userWithOrdersResultMap" type="User"><id property="id" column="user_id"/><result property="username" column="username"/><collection property="orders" ofType="Order"><id property="id" column="order_id"/><result property="orderNo" column="order_no"/><result property="amount" column="amount"/></collection>
</resultMap><select id="selectUserWithOrders" resultMap="userWithOrdersResultMap">SELECT u.id as user_id, u.username,o.id as order_id, o.order_no, o.amountFROM user uLEFT JOIN order o ON u.id = o.user_idWHERE u.id = #{id}
</select>

分页查询

<!-- 分页查询 -->
<select id="selectUsersWithPage" parameterType="map" resultMap="userResultMap">SELECT * FROM userORDER BY created_time DESCLIMIT #{offset}, #{pageSize}
</select><!-- 查询总数 -->
<select id="countUsers" resultType="int">SELECT COUNT(*) FROM user
</select>

使用注解方式

public interface UserMapper {@Insert("INSERT INTO user (username, email, age) VALUES (#{username}, #{email}, #{age})")@Options(useGeneratedKeys = true, keyProperty = "id")int insertUserWithAnnotation(User user);@Delete("DELETE FROM user WHERE id = #{id}")int deleteUserByIdWithAnnotation(@Param("id") Integer id);@Update("UPDATE user SET username = #{username}, email = #{email}, age = #{age} WHERE id = #{id}")int updateUserWithAnnotation(User user);@Select("SELECT * FROM user WHERE id = #{id}")@Results({@Result(property = "id", column = "id"),@Result(property = "username", column = "username"),@Result(property = "email", column = "email"),@Result(property = "age", column = "age"),@Result(property = "createdTime", column = "created_time")})User selectUserByIdWithAnnotation(@Param("id") Integer id);
}

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

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

相关文章

go与grpc

目录下载与安装遇到的问题cmd中protoc找不到命令cmd中--go_out: protoc-gen-go: Plugin failed with status code 1.下载与安装 下载protoc&#xff1a; https://github.com/protocolbuffers/protobuf/releases 点击下载相应电脑版本即可&#xff0c;我是windows系统下载了pro…

2025年AI面试重构招聘新生态

当企业面临业务扩张与人才竞争的双重压力&#xff0c;传统招聘模式已难以满足高效、精准、公平的人才筛选需求。尤其在校招季、蓝领用工潮等关键节点&#xff0c;面试官超负荷运转、跨地域协调困难、评估标准模糊等问题频发。AI技术的深度介入正推动招聘行业从“经验驱动”向“…

Rust进阶-part5-trait

Rust进阶[part5]_trait trait概述 在 Rust 中,trait 是一种定义共享行为的方式。它类似于其他语言中的接口,允许我们定义一组方法签名,然后让不同的类型去实现这些方法。通过 trait,我们可以实现多态性,即不同类型可以以统一的方式处理。 普通实现 使用 trait 关键字来…

【人工智能-18】机器学习:决策树、随机森林

上一期【人工智能-17】机器学习&#xff1a;KNN算法、模型选择和调优、朴素贝叶斯分类 文章目录一、决策树1.使用理由2.技术二、随机森林1.使用理由2.原理核心&#xff1a;Bagging 随机特征子集3.优点和缺点一、决策树 决策树是一种监督学习算法&#xff0c;主要用于分类&…

RFID高频读写器在工业生产线的使用优势

在工业4.0浪潮下&#xff0c;智能制造对生产效率与精准度的要求日益提升。RFID技术凭借其独特的技术优势&#xff0c;成为工业场景中实现数据实时采集与流程优化的关键工具。本文主要从RFID高频读写器出发&#xff0c;系统解析其在工业生产线中的使用优势。RFID高频读写器一、技…

大模型学习笔记

prompt 提示词的构成&#xff1a; 指示&#xff1a;描述让它做什么上下文&#xff1a;给出与任务相关的背景信息输入&#xff1a; 任务的输入信息输出&#xff1a;输出的格式 生成与检索 生成&#xff1a; 优点&#xff1a;内容的多样性、创造性缺点&#xff1a;存在不可控制 检…

龙虎榜——20250806

上证指数继续收阳线&#xff0c;创新高的概率较大&#xff0c;个股上涨多于下跌&#xff0c;但板块轮动较明显&#xff0c;高位板块注意风险。深证指数较昨天放量收阳线&#xff0c;站上5日和10日均线继续上线&#xff0c;大科技方向资金关注更多。2025年8月6日龙虎榜行业方向分…

数据可视化发展历程

数据可视化是数据描述的图形表示&#xff0c;是当今数据分析发展最快速、最引人注目的领域之一。借助于可视化工具的发展&#xff0c;或朴实&#xff0c;或优雅&#xff0c;或绚烂的可视化作品给我们讲述着各种数据故事。在这个领域中&#xff0c;科学、技术和艺术完美地结合在…

深入理解C++中的stack、queue和priority_queue

目录 前言 1. stack&#xff08;栈&#xff09; 1.1 基本概念 1.2 常用接口 1.3 应用示例&#xff1a;最小栈 1.4 模拟实现 2. queue&#xff08;队列&#xff09; 2.1 基本概念 2.2 常用接口 2.3 模拟实现 3. priority_queue&#xff08;优先队列&#xff09; 3.1…

C++ 操作 Redis 客户端

引言 前面几篇文章都在介绍 Redis 原生命令行客户端&#xff0c;在实际应用开发中&#xff0c;开发人员更希望使用针对特定编程语言的专用客户端&#xff0c;通过编程的方式操作 Redis 数据库。因此&#xff0c;Redis 支持多种编程语言。本文将介绍 如何使用 C 语言来操作 Red…

批量提问程序开发方案:基于Python的百度文小言接口实现

批量提问程序开发方案&#xff1a;基于Python的百度文小言接口实现 1. 项目概述 1.1 项目背景 在现代信息检索和自动化办公场景中&#xff0c;批量提问功能已成为提高工作效率的重要工具。本项目旨在开发一个基于Python的批量提问程序&#xff0c;专门针对百度文小言平台&am…

Apollo中三种相机外参的可视化分析

Apollo中三种相机外参的可视化分析一、什么是相机外参&#xff1f;为什么需要可视化&#xff1f;二、不同外参来源对比三、详细操作步骤1. 环境准备2. 获取 NuScenes外参数据3. 外参到空间位置的转换及可视化四、可视化对比1. NuScenes数据集外参2. Apollo BEV模型外参3. Apoll…

虚拟化KVM常用命令汇总

KVM&#xff08;Kernel-based Virtual Machine&#xff09;是一种开源的硬件虚拟化解决方案&#xff0c;它是 Linux 内核的一部分&#xff0c;允许在支持虚拟化技术的硬件&#xff08;如 Intel VT-x 或 AMD-V&#xff09;上运行虚拟机。KVM 将 Linux 内核转变为一个裸机虚拟机监…

6s081环境配置以及使用vscode连接本地wsl2

6s081环境配置以及使用vscode连接wsl2 本人环境&#xff1a;windows11、wsl2ubuntu20.04 课程&#xff1a;6s081的2020版本的:https://pdos.csail.mit.edu/6.S081/2020/schedule.html 一、wsl2ubuntu20.04配置6s081环境 注&#xff1a;关于如何在window中安装wsl&#xff0c;这…

C++实现线程池(3)缓存线程池

三. CachedThreadPool 的实现3.1 需求:动态调整线程数量&#xff1a;与 FixedThreadPool 不同&#xff0c;CachedThreadPool 的线程数量是动态调整的。当有新任务提交时&#xff0c;如果线程池中有空闲的线程&#xff0c;则会立即使用空闲线程执行任务&#xff1b;如果线程池中…

WMS+自动化立库:无人仓的现在进行时

传统仓库正面临严峻挑战&#xff1a;效率瓶颈日益凸显&#xff0c;人力成本持续攀升&#xff0c;空间利用率逼近极限&#xff0c;而订单响应速度却难以满足市场需求。如何破局&#xff1f;WMS&#xff08;仓库管理系统&#xff09;与自动化立体库&#xff08;AS/RS&#xff09;…

多模态大模型研究每日简报【2025-08-05】

训练数据相关 EditGarment: An Instruction-Based Garment Editing Dataset Constructed with Automated MLLM Synthesis and Semantic-Aware Evaluation (https://arxiv.org/abs/2508.03497)&#xff1a;提出了一种自动化的流程&#xff0c;用于构建服装编辑数据集EditGarmen…

4、docker数据卷管理命令 | docker volume

1、命令总览命令作用出现频率备注★ docker volume create新建卷高-d 指定驱动&#xff0c;-o 指定驱动选项★ docker volume ls列出卷高--filter danglingtrue 查孤儿卷★ docker volume inspect查看卷详情高输出 JSON&#xff0c;可加 --format★ docker volume rm删除卷高只…

计数组合学7.14(对偶 RSK 算法)

7.14 对偶 RSK 算法 存在 RSK 算法的一种变体&#xff0c;其与乘积 ∏i,j(1xiyj)\prod_{i,j}(1 x_{i}y_{j})∏i,j​(1xi​yj​) 的关系类似于 RSK 算法本身与 ∏i,j(1−xiyj)−1\prod_{i,j}(1 - x_{i}y_{j})^{-1}∏i,j​(1−xi​yj​)−1 的关系。我们称此变体为对偶 RSK 算法…

C语言中的进程、线程与进程间通信详解

目录 引言 基本概念 1. 进程&#xff08;Process&#xff09; 2. 线程&#xff08;Thread&#xff09; 线程编程实战 1. 常见线程库 2. 合理设置线程数 3. pthread 创建线程 线程同步机制 1. 互斥锁 pthread_mutex_t 2. 条件变量 pthread_cond_t 3. 读写锁 pthread…