Java Web-MyBatis

devtools/2025/2/7 14:02:49/

MyBatis简介

MyBatis 是一个优秀的 Java 持久层框架,它可以帮助开发者将 Java 对象映射到数据库表,并执行 SQL 语句来操作数据库。以下从基础概念、核心组件、使用步骤及代码示例等方面详细介绍:

一、基础概念

MyBatis 允许开发者使用 XML 或注解来配置和映射原生信息,将 Java 接口和 POJO(Plain Old Java Objects,普通 Java 对象)映射成数据库中的记录。它的主要优势在于灵活的 SQL 编写、良好的封装性以及对多种数据库的支持。

优点
  • 代码简洁:开发者只需编写 Mapper 接口和对应的 SQL 语句(通过 XML 或注解),无需编写具体的 SQL 执行和结果映射代码,MyBatis 会自动处理这些细节。
  • 可读性和维护性好:Mapper 接口中的方法名通常与业务逻辑相关,使得代码的意图更加清晰,后续维护和扩展也更加方便。
  • 类型安全:由于 Mapper 接口是强类型的,在编译时就能发现方法调用的错误,提高了代码的稳定性。

二、核心组件

  1. SqlSessionFactory:是 MyBatis 的核心,用于创建 SqlSession。它通过读取配置文件(如mybatis - config.xml)获取数据库连接等信息来构建。
  2. SqlSession:提供了执行 SQL 语句、提交事务、回滚事务等方法。通过它可以获取 Mapper 接口的代理对象,从而执行数据库操作。
  3. Mapper 接口:定义了数据库操作的抽象方法,MyBatis 通过动态代理生成其实现类,将方法调用转化为 SQL 执行。

三、使用步骤及代码示例

以下以操作 MySQL 数据库为例,假设数据库中有一张tb_user表,包含idusernamepasswordgenderaddr字段。

1. 引入依赖

如果使用 Maven 项目,在pom.xml中添加 MyBatis 和 MySQL 驱动依赖:

<dependencies><!-- MyBatis核心依赖 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.5</version></dependency><!-- MySQL驱动     --><dependency><groupId>mysql</groupId><artifactId>mysql - connector - java</artifactId><version>8.0.15</version></dependency>
</dependencies>
2. 创建 POJO 类
java">public class User {private Integer id;private String username;private String password;private String gender;private String addr;// 省略getter和setter方法
}
3. 配置 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><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><!--数据库连接信息--><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql:///mybatis?useSSL=false&amp;serverTimezone=Asia/Shanghai"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><mappers><!--加载SQL映射文件-->
<!--方式一--><mapper resource="com/itheima/Mapper/UserMapper.xml"/>
<!--方式二--><!--Mapper代理方式:包扫描-->
<!--        <package name="com.itheima.Mapper"/>--></mappers>
</configuration>
4. 创建 Mapper 接口
java">package com.itheima.mapper;import com.itheima.pojo.User;
import java.util.List;public interface UserMapper {List<User> selectAll();
}
5. 创建 Mapper 映射文件(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.itheima.Mapper.UserMapper"><select id="selectAll" resultType="com.itheima.pojo.User">select * from tb_user;</select>
</mapper>
6. 编写测试代码
java">package com.itheima;import com.itheima.Mapper.UserMapper;
import com.itheima.pojo.User;
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;
import java.util.List;/**Mybatis 快速入门代码*/
public class MyBatisDemo2 {public static void main (String [] args) throws IOException {
//1. 加载 mybatis 的核心配置文件,获取 SqlSessionFactoryString resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream (resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build (inputStream);//2. 获取 SqlSession 对象,用它来执行 sqlSqlSession sqlSession = sqlSessionFactory.openSession ();//        //3.1 执行 sql
//        List<User> users =  sqlSession.selectList("com.itheima.Mapper.UserMapper.selectAll");//3.2 获取 UserMapper 接口的代理对象UserMapper userMapper = sqlSession.getMapper (UserMapper.class);List<User> users = userMapper.selectAll();System.out.println(users);
//4. 释放资源sqlSession.close ();}
}

上述代码展示了 MyBatis 的基本使用流程,从配置环境、定义 Mapper 接口和映射文件,到最终执行数据库查询操作并输出结果。通过这种方式,MyBatis 实现了 Java 对象与数据库的交互,使数据库操作更加简洁和高效。

Mapper代理开发

MyBatis 的 Mapper 代理开发是一种方便快捷的数据库操作方式,它通过接口和 XML 配置文件(或注解)的结合,让开发者可以像调用普通 Java 方法一样执行数据库操作,而无需编写大量的样板代码。以下是对 Mapper 代理开发的详细介绍:

特点和优势

  • 简化开发:避免了传统 JDBC 开发中大量重复的数据库连接、SQL 执行、结果集处理等代码,使数据访问层的代码更加简洁、清晰。
  • 解耦性好:Mapper 接口与实现分离,业务逻辑层只需要依赖 Mapper 接口,具体的数据库操作实现可以在不影响业务逻辑的情况下进行替换或修改。
  • 提高可维护性:将 SQL 语句集中管理在 XML 配置文件(或注解)中,便于统一修改和维护。

实现步骤

  • 定义 Mapper 接口:在 Java 代码中定义一个接口,接口中的方法对应着要执行的数据库操作。例如:
java">import java.util.List;
import com.itheima.pojo.User;public interface UserMapper {List<User> selectAll();User selectById(int id);void insert(User user);void update(User user);void delete(int id);
}

  • 编写 Mapper XML 配置文件:创建一个与 Mapper 接口同名的 XML 文件,在其中定义 SQL 语句和参数映射等信息。例如:
<?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.itheima.mapper.UserMapper"><select id="selectAll" resultMap="UserResultMap">SELECT * FROM users</select><select id="selectById" resultMap="UserResultMap">SELECT * FROM users WHERE id = #{id}</select><insert id="insert" keyProperty="id" useGeneratedKeys="true">INSERT INTO users (username, password, age) VALUES (#{username}, #{password}, #{age})</insert><update id="update">UPDATE users SET username = #{username}, password = #{password}, age = #{age} WHERE id = #{id}</update><delete id="delete">DELETE FROM users WHERE id = #{id}</delete><resultMap id="UserResultMap" type="com.itheima.pojo.User"><id property="id" column="id" /><result property="username" column="username" /><result property="password" column="password" /><result property="age" column="age" /></resultMap>
</mapper>
  • 在 MyBatis 配置文件中注册 Mapper:在 MyBatis 的核心配置文件(通常是 mybatis-config.xml)中,通过<mappers>标签注册 Mapper XML 文件或 Mapper 接口。例如:
<mappers><mapper resource="com/itheima/mapper/UserMapper.xml" /><!-- 或者使用以下方式注册Mapper接口 --><!-- <package name="com.itheima.mapper" /> -->
</mappers>
  • 使用 Mapper 代理:在业务逻辑层中,通过 MyBatis 的SqlSession获取 Mapper 接口的代理对象,然后调用接口中的方法来执行数据库操作。例如:
java">import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.itheima.mapper.UserMapper;
import com.itheima.pojo.User;
import com.itheima.utils.MyBatisUtils;public class UserServiceImpl {public List<User> getAllUsers() {try (SqlSession sqlSession = MyBatisUtils.getSqlSession()) {UserMapper userMapper = sqlSession.getMapper(UserMapper.class);return userMapper.selectAll();}}public User getUserById(int id) {try (SqlSession sqlSession = MyBatisUtils.getSqlSession()) {UserMapper userMapper = sqlSession.getMapper(UserMapper.class);return userMapper.selectById(id);}}public void addUser(User user) {try (SqlSession sqlSession = MyBatisUtils.getSqlSession()) {UserMapper userMapper = sqlSession.getMapper(UserMapper.class);userMapper.insert(user);sqlSession.commit();}}public void updateUser(User user) {try (SqlSession sqlSession = MyBatisUtils.getSqlSession()) {UserMapper userMapper = sqlSession.getMapper(UserMapper.class);userMapper.update(user);sqlSession.commit();}}public void deleteUser(int id) {try (SqlSession sqlSession = MyBatisUtils.getSqlSession()) {UserMapper userMapper = sqlSession.getMapper(UserMapper.class);userMapper.delete(id);sqlSession.commit();}}
}

注意事项

  • Mapper 接口方法签名与 XML 中 SQL 语句的对应关系:Mapper 接口中的方法名要与 XML 配置文件中<select><insert><update><delete>等标签的id属性值一致,并且方法的参数类型和返回值类型要与 SQL 语句的参数和结果映射相匹配。
  • 参数传递:在 Mapper 接口方法中可以使用@Param注解来指定参数名称,以便在 SQL 语句中通过#{参数名}的方式获取参数值。如果方法只有一个参数,且不是复杂对象(如 JavaBean),可以省略@Param注解。
  • 命名空间(namespace):Mapper XML 文件中的<mapper>标签的namespace属性值必须与 Mapper 接口的全限定名一致,这是 MyBatis 能够正确找到并绑定 Mapper 接口和 XML 配置的关键。
  • 事务管理:在使用 Mapper 代理执行数据库操作时,需要注意事务的管理。一般情况下,可以在业务逻辑层中通过SqlSession来控制事务的提交和回滚。

通过以上介绍和代码示例,希望你对 MyBatis 及其 Mapper 代理方式有更深入的理解。在实际的 Java Web 开发中,MyBatis 能够大大简化数据库操作,提高开发效率。


http://www.ppmy.cn/devtools/156830.html

相关文章

04树 + 堆 + 优先队列 + 图(D1_树(D15_哈夫曼树/霍夫曼树))

目录 一、基本介绍 二、哈夫曼树的创建 三、哈夫曼编码 1. 基本介绍 2. 编码原理解析 3. 哈夫曼编码的实现 4. 使用哈夫曼编码实现数据压缩与解压 文件压缩 & 解压 一、基本介绍 给定n个权值作为n个叶子结点&#xff0c;构造一棵二叉树&#xff0c;若该树的带权路径…

【C语言】自定义类型讲解

文章目录 一、前言二、结构体2.1 概念2.2 定义2.2.1 通常情况下的定义2.2.2 匿名结构体 2.3 结构体的自引用和嵌套2.4 结构体变量的定义与初始化2.5 结构体的内存对齐2.6 结构体传参2.7 结构体实现位段 三、枚举3.1 概念3.2 定义3.3 枚举的优点3.3.1 提高代码的可读性3.3.2 防止…

前端VSCode常用插件

一、VSCode常用的插件 vscode之所以被称为宇宙第一神器&#xff0c;其中丰富的插件功不可没&#xff0c;安装起来超级简单&#xff0c;给我们开发带来了极大的便捷。 注意&#xff0c;新手学习期间&#xff0c;不建议安装形形色色的插件&#xff0c;用到啥就安装啥。几个常用的…

工作流项目BPMN.JS_Question梳理

工作流项目 想了解如果候选人熟悉工作流技术、bpmn.js和Flowable工作流引擎&#xff0c;面试官会对哪些信息感兴趣。我需要分析这个问题&#xff0c;并给出一个全面而结构化的回答。 首先&#xff0c;用户可能希望了解作为前端面试官&#xff0c;应该关注候选人哪些方面的知识和…

谷歌的最新 AI 模型发布,Gemini 迎来“思考”能力!

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

kubernetes 核心技术-集群安全机制 RBAC

随着 Kubernetes 在企业级应用中的广泛采用&#xff0c;确保集群的安全性变得至关重要。Kubernetes 提供了多种安全机制来保护集群及其资源免受未授权访问和潜在威胁的影响。其中&#xff0c;基于角色的访问控制&#xff08;Role-Based Access Control, 简称 RBAC&#xff09;是…

iOS UI开发

UIView&#xff1a; 生命周期&#xff1a; UITabBar&#xff1a; UINavigationController&#xff1a; UIWindow&#xff1a; UIWindow作为容器是一个基础画面 storyboard会自动给我们创建一个UIWindow 自己创建一个呢&#xff1a; 更改一下看区别 代理&#xff1a; 代理方法…

【Day32 LeetCode】动态规划DP Ⅴ 完全背包

一、动态规划DP Ⅴ 完全背包 1、完全背包理论 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包里物品价值总和…