SSM从入门到实战:2.1 MyBatis框架概述与环境搭建 - 详解

大家好,我是 阿问学长!专注于分享优质开源项目解析、毕业设计项目指导支持、幼小初高教辅资料推荐等,欢迎关注交流!

08-MyBatis框架概述与环境搭建

本文概述

本文是SSM框架系列MyBatis基础篇的第一篇,将全面介绍MyBatis框架的基本概念、核心特性和环境搭建。通过详细的配置示例和入门案例,帮助读者快速掌握MyBatis的基础知识。

学习目标

  • 深入理解MyBatis框架的概念和特点
  • 掌握MyBatis的核心组件和工作原理
  • 学会搭建MyBatis开发环境
  • 完成第一个MyBatis程序
  • 了解MyBatis与其他ORM框架的区别

1. MyBatis框架概述

1.1 什么是MyBatis

/**
* MyBatis框架概述
*/
public class MyBatisOverview
{
/**
* MyBatis是什么?
*
* MyBatis是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。
* MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。
* MyBatis可以通过简单的XML或注解来配置和映射原始类型、接口和Java POJO
* (Plain Old Java Objects,普通老式Java对象)为数据库中的记录。
*/
/**
* MyBatis的前身
*
* MyBatis原名iBatis,是Apache的一个开源项目。
* 2010年这个项目由Apache Software Foundation迁移到了Google Code,
* 并且改名为MyBatis。2013年11月迁移到Github。
*/
/**
* MyBatis的特点:
*
* 1. 简单易学:本身就很小且简单
* 2. 灵活:不会对应用程序或者数据库的现有设计强加任何影响
* 3. 解除SQL与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离
* 4. 提供映射标签:支持对象与数据库的ORM字段关系映射
* 5. 提供对象关系映射标签:支持对象关系组建维护
* 6. 提供XML标签:支持编写动态SQL
*/
}

1.2 MyBatis vs 其他ORM框架

/**
* MyBatis与其他ORM框架对比
*/
public class ORMComparison
{
/**
* MyBatis vs Hibernate
*/
public void myBatisVsHibernate() {
/*
* MyBatis优势:
* 1. SQL可控性强,可以进行SQL优化
* 2. 学习成本低,容易上手
* 3. 对复杂查询支持更好
* 4. 对存储过程支持更好
* 5. 可以使用原生SQL
*
* Hibernate优势:
* 1. 完全面向对象,开发效率高
* 2. 数据库无关性好
* 3. 缓存机制更完善
* 4. 对象关系映射更强大
* 5. 自动生成SQL
*/
}
/**
* MyBatis vs JPA
*/
public void myBatisVsJPA() {
/*
* MyBatis优势:
* 1. SQL控制更灵活
* 2. 性能调优更容易
* 3. 对复杂查询支持更好
* 4. 学习曲线更平缓
*
* JPA优势:
* 1. 标准化,可移植性好
* 2. 面向对象程度更高
* 3. 代码量更少
* 4. 自动化程度更高
*/
}
/**
* MyBatis vs Spring Data JPA
*/
public void myBatisVsSpringDataJPA() {
/*
* MyBatis优势:
* 1. SQL完全可控
* 2. 复杂查询更容易实现
* 3. 性能优化空间大
* 4. 对遗留系统支持更好
*
* Spring Data JPA优势:
* 1. 开发效率极高
* 2. 代码量极少
* 3. 方法名查询很方便
* 4. 与Spring生态集成更好
*/
}
}

1.3 MyBatis核心组件

/**
* MyBatis核心组件介绍
*/
public class MyBatisCoreComponents
{
/**
* 1. SqlSessionFactory
* SqlSession工厂,用于创建SqlSession实例
*/
private SqlSessionFactory sqlSessionFactory;
/**
* 2. SqlSession
* 执行SQL命令的主要接口,包含了面向数据库执行SQL命令所需的所有方法
*/
private SqlSession sqlSession;
/**
* 3. Mapper接口
* 定义数据访问方法的接口
*/
public interface UserMapper {
User selectById(Long id);
List<
User> selectAll();
int insert(User user);
int update(User user);
int delete(Long id);
}
/**
* 4. Mapper XML文件
* 包含SQL语句和结果映射的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="selectById" resultType="User">
      SELECT * FROM users WHERE id = #{id}
    </select>
  </mapper>
  */
  /**
  * 5. Configuration
  * MyBatis的配置信息,包含数据源、事务管理器、映射器等
  */
  private Configuration configuration;
  /**
  * MyBatis工作流程:
  *
  * 1. 读取配置文件,创建SqlSessionFactory
  * 2. 通过SqlSessionFactory创建SqlSession
  * 3. 通过SqlSession获取Mapper接口的代理对象
  * 4. 调用Mapper接口方法执行SQL
  * 5. SqlSession提交事务并关闭
  */
  public void workFlow() {
  // 1. 创建SqlSessionFactory
  SqlSessionFactory factory = new SqlSessionFactoryBuilder()
  .build(Resources.getResourceAsStream("mybatis-config.xml"));
  // 2. 创建SqlSession
  SqlSession session = factory.openSession();
  try {
  // 3. 获取Mapper
  UserMapper mapper = session.getMapper(UserMapper.class)
  ;
  // 4. 执行SQL
  User user = mapper.selectById(1L);
  // 5. 提交事务
  session.commit();
  } finally {
  // 6. 关闭SqlSession
  session.close();
  }
  }
  }

2. 环境搭建

2.1 Maven依赖配置

<!-- pom.xml文件配置 -->
  <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="http://maven.apache.org/POM/4.0.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
    http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>mybatis-demo</artifactId>
  <version>1.0.0</version>
  <packaging>jar</packaging>
    <properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <!-- 版本管理 -->
      <mybatis.version>3.5.13</mybatis.version>
      <mysql.version>8.0.33</mysql.version>
      <junit.version>4.13.2</junit.version>
      <logback.version>1.2.12</logback.version>
      </properties>
      <dependencies>
        <!-- MyBatis核心依赖 -->
          <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
          <version>${mybatis.version}</version>
          </dependency>
          <!-- MySQL驱动 -->
            <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
            </dependency>
            <!-- 日志依赖 -->
              <dependency>
              <groupId>ch.qos.logback</groupId>
              <artifactId>logback-classic</artifactId>
              <version>${logback.version}</version>
              </dependency>
              <!-- 测试依赖 -->
                <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
                <scope>test</scope>
                </dependency>
                <!-- 连接池(可选) -->
                  <dependency>
                  <groupId>com.zaxxer</groupId>
                  <artifactId>HikariCP</artifactId>
                  <version>4.0.3</version>
                  </dependency>
                </dependencies>
                <build>
                  <plugins>
                    <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.1</version>
                      <configuration>
                      <source>8</source>
                      <target>8</target>
                      </configuration>
                    </plugin>
                  </plugins>
                  <!-- 资源文件配置 -->
                    <resources>
                      <resource>
                      <directory>src/main/resources</directory>
                        <includes>
                        <include>**/*.xml</include>
                        <include>**/*.properties</include>
                        </includes>
                      </resource>
                      <resource>
                      <directory>src/main/java</directory>
                        <includes>
                        <include>**/*.xml</include>
                        </includes>
                      </resource>
                    </resources>
                  </build>
                </project>

2.2 数据库准备

-- 创建数据库
CREATE DATABASE mybatis_demo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE mybatis_demo;
-- 创建用户表
CREATE TABLE users (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL UNIQUE,
password VARCHAR(100) NOT NULL,
age INT,
status TINYINT DEFAULT 1 COMMENT '1:正常 0:禁用',
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- 插入测试数据
INSERT INTO users (username, email, password, age) VALUES
('admin', 'admin@example.com', 'admin123', 25),
('user1', 'user1@example.com', 'user123', 30),
('user2', 'user2@example.com', 'user456', 28);
-- 创建角色表
CREATE TABLE roles (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
role_name VARCHAR(50) NOT NULL UNIQUE,
description VARCHAR(200),
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 插入角色数据
INSERT INTO roles (role_name, description) VALUES
('ADMIN', '管理员'),
('USER', '普通用户'),
('GUEST', '访客');
-- 创建用户角色关联表
CREATE TABLE user_roles (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
role_id BIGINT NOT NULL,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE,
UNIQUE KEY uk_user_role (user_id, role_id)
);
-- 插入用户角色关联数据
INSERT INTO user_roles (user_id, role_id) VALUES
(1, 1), -- admin用户拥有ADMIN角色
(2, 2), -- user1用户拥有USER角色
(3, 2);
-- user2用户拥有USER角色

2.3 MyBatis配置文件

<!-- src/main/resources/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>
      <!-- 属性配置 -->
        <properties resource="database.properties"/>
        <!-- 设置 -->
          <settings>
            <!-- 开启驼峰命名自动映射 -->
              <setting name="mapUnderscoreToCamelCase" value="true"/>
              <!-- 开启延迟加载 -->
                <setting name="lazyLoadingEnabled" value="true"/>
                <!-- 设置超时时间 -->
                  <setting name="defaultStatementTimeout" value="30"/>
                  <!-- 开启二级缓存 -->
                    <setting name="cacheEnabled" value="true"/>
                    <!-- 日志实现 -->
                      <setting name="logImpl" value="SLF4J"/>
                    </settings>
                    <!-- 类型别名 -->
                      <typeAliases>
                        <typeAlias type="com.example.entity.User" alias="User"/>
                        <typeAlias type="com.example.entity.Role" alias="Role"/>
                        <!-- 或者使用包扫描 -->
                          <!-- <package name="com.example.entity"/> -->
                        </typeAliases>
                        <!-- 类型处理器 -->
                          <typeHandlers>
                            <!-- 自定义类型处理器 -->
                              <!-- <typeHandler handler="com.example.handler.CustomTypeHandler"/> -->
                            </typeHandlers>
                            <!-- 环境配置 -->
                                <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}"/>
                                        <!-- 连接池配置 -->
                                          <property name="poolMaximumActiveConnections" value="20"/>
                                          <property name="poolMaximumIdleConnections" value="5"/>
                                          <property name="poolMaximumCheckoutTime" value="20000"/>
                                          <property name="poolTimeToWait" value="20000"/>
                                        </dataSource>
                                      </environment>
                                      <!-- 测试环境 -->
                                          <environment id="test">
                                          <transactionManager type="JDBC"/>
                                            <dataSource type="POOLED">
                                            <property name="driver" value="org.h2.Driver"/>
                                            <property name="url" value="jdbc:h2:mem:testdb"/>
                                            <property name="username" value="sa"/>
                                            <property name="password" value=""/>
                                          </dataSource>
                                        </environment>
                                      </environments>
                                      <!-- 映射器 -->
                                        <mappers>
                                          <!-- 单个映射器注册 -->
                                            <mapper resource="mapper/UserMapper.xml"/>
                                            <mapper resource="mapper/RoleMapper.xml"/>
                                            <!-- 或者使用包扫描 -->
                                              <!-- <package name="com.example.mapper"/> -->
                                              <!-- 或者使用类注册 -->
                                                <!-- <mapper class="com.example.mapper.UserMapper"/> -->
                                              </mappers>
                                            </configuration>

2.4 数据库配置文件

# src/main/resources/database.properties
# 数据库连接配置
database.driver=com.mysql.cj.jdbc.Driver
database.url=jdbc:mysql://localhost:3306/mybatis_demo?useSSL=false&serverTimezone=UTC&characterEncoding=utf8
database.username=root
database.password=123456
# 连接池配置
database.initialSize=5
database.maxActive=20
database.maxIdle=10
database.minIdle=5
database.maxWait=60000

2.5 日志配置

<!-- src/main/resources/logback.xml -->
  <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
      <!-- 控制台输出 -->
          <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
          <encoder>
          <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
          </encoder>
        </appender>
        <!-- 文件输出 -->
            <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
          <file>logs/mybatis-demo.log</file>
              <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/mybatis-demo.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
            </rollingPolicy>
            <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
            </encoder>
          </appender>
          <!-- MyBatis SQL日志 -->
            <logger name="com.example.mapper" level="DEBUG"/>
            <!-- 根日志级别 -->
                <root level="INFO">
                <appender-ref ref="CONSOLE"/>
                <appender-ref ref="FILE"/>
              </root>
            </configuration>

3. 实体类设计

3.1 用户实体类

/**
* 用户实体类
*/
package com.example.entity;
import java.time.LocalDateTime;
import java.util.List;
public class User
{
private Long id;
private String username;
private String email;
private String password;
private Integer age;
private Integer status;
private LocalDateTime createTime;
private LocalDateTime updateTime;
// 关联属性
private List<
Role> roles;
// 构造方法
public User() {
}
public User(String username, String email, String password) {
this.username = username;
this.email = email;
this.password = password;
}
public User(String username, String email, String password, Integer age) {
this.username = username;
this.email = email;
this.password = password;
this.age = age;
}
// Getter和Setter方法
public Long getId() {
return id;
}
public void setId(Long 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 String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public LocalDateTime getCreateTime() {
return createTime;
}
public void setCreateTime(LocalDateTime createTime) {
this.createTime = createTime;
}
public LocalDateTime getUpdateTime() {
return updateTime;
}
public void setUpdateTime(LocalDateTime updateTime) {
this.updateTime = updateTime;
}
public List<
Role> getRoles() {
return roles;
}
public void setRoles(List<
Role> roles) {
this.roles = roles;
}
// toString方法
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", email='" + email + '\'' +
", age=" + age +
", status=" + status +
", createTime=" + createTime +
", updateTime=" + updateTime +
'}';
}
// equals和hashCode方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return id != null ? id.equals(user.id) : user.id == null;
}
@Override
public int hashCode() {
return id != null ? id.hashCode() : 0;
}
}

3.2 角色实体类

/**
* 角色实体类
*/
package com.example.entity;
import java.time.LocalDateTime;
import java.util.List;
public class Role
{
private Long id;
private String roleName;
private String description;
private LocalDateTime createTime;
// 关联属性
private List<
User> users;
// 构造方法
public Role() {
}
public Role(String roleName, String description) {
this.roleName = roleName;
this.description = description;
}
// Getter和Setter方法
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public LocalDateTime getCreateTime() {
return createTime;
}
public void setCreateTime(LocalDateTime createTime) {
this.createTime = createTime;
}
public List<
User> getUsers() {
return users;
}
public void setUsers(List<
User> users) {
this.users = users;
}
// toString方法
@Override
public String toString() {
return "Role{" +
"id=" + id +
", roleName='" + roleName + '\'' +
", description='" + description + '\'' +
", createTime=" + createTime +
'}';
}
// equals和hashCode方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Role role = (Role) o;
return id != null ? id.equals(role.id) : role.id == null;
}
@Override
public int hashCode() {
return id != null ? id.hashCode() : 0;
}
}

4. 第一个MyBatis程序

4.1 Mapper接口

/**
* 用户Mapper接口
*/
package com.example.mapper;
import com.example.entity.User;
import java.util.List;
public interface UserMapper {
/**
* 根据ID查询用户
*/
User selectById(Long id);
/**
* 查询所有用户
*/
List<
User> selectAll();
/**
* 根据用户名查询用户
*/
User selectByUsername(String username);
/**
* 插入用户
*/
int insert(User user);
/**
* 更新用户
*/
int update(User user);
/**
* 删除用户
*/
int deleteById(Long id);
/**
* 统计用户数量
*/
long count();
}

4.2 Mapper XML文件

<!-- src/main/resources/mapper/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="username" column="username"/>
          <result property="email" column="email"/>
          <result property="password" column="password"/>
          <result property="age" column="age"/>
          <result property="status" column="status"/>
          <result property="createTime" column="create_time"/>
          <result property="updateTime" column="update_time"/>
        </resultMap>
        <!-- 基础SQL片段 -->
            <sql id="Base_Column_List">
            id, username, email, password, age, status, create_time, update_time
          </sql>
          <!-- 根据ID查询用户 -->
              <select id="selectById" parameterType="long" resultMap="UserResultMap">
              SELECT <include refid="Base_Column_List"/>
              FROM users
              WHERE id = #{id}
            </select>
            <!-- 查询所有用户 -->
                <select id="selectAll" resultMap="UserResultMap">
                SELECT <include refid="Base_Column_List"/>
                FROM users
                ORDER BY id
              </select>
              <!-- 根据用户名查询用户 -->
                  <select id="selectByUsername" parameterType="string" resultMap="UserResultMap">
                  SELECT <include refid="Base_Column_List"/>
                  FROM users
                  WHERE username = #{username}
                </select>
                <!-- 插入用户 -->
                    <insert id="insert" parameterType="User" useGeneratedKeys="true" keyProperty="id">
                    INSERT INTO users (username, email, password, age, status)
                    VALUES (#{username}, #{email}, #{password}, #{age}, #{status})
                  </insert>
                  <!-- 更新用户 -->
                      <update id="update" parameterType="User">
                      UPDATE users
                      SET username = #{username},
                      email = #{email},
                      password = #{password},
                      age = #{age},
                      status = #{status},
                      update_time = CURRENT_TIMESTAMP
                      WHERE id = #{id}
                    </update>
                    <!-- 删除用户 -->
                        <delete id="deleteById" parameterType="long">
                        DELETE FROM users WHERE id = #{id}
                      </delete>
                      <!-- 统计用户数量 -->
                          <select id="count" resultType="long">
                          SELECT COUNT(*) FROM users
                        </select>
                      </mapper>

4.3 测试程序

/**
* MyBatis测试程序
*/
package com.example.test;
import com.example.entity.User;
import com.example.mapper.UserMapper;
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 org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MyBatisTest
{
private SqlSessionFactory sqlSessionFactory;
private SqlSession sqlSession;
private UserMapper userMapper;
@Before
public void setUp() throws IOException {
// 读取配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
// 创建SqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 创建SqlSession
sqlSession = sqlSessionFactory.openSession();
// 获取Mapper
userMapper = sqlSession.getMapper(UserMapper.class)
;
}
@After
public void tearDown() {
if (sqlSession != null) {
sqlSession.close();
}
}
@Test
public void testSelectById() {
User user = userMapper.selectById(1L);
System.out.println("查询结果: " + user);
}
@Test
public void testSelectAll() {
List<
User> users = userMapper.selectAll();
System.out.println("用户总数: " + users.size());
for (User user : users) {
System.out.println(user);
}
}
@Test
public void testInsert() {
User user = new User("testuser", "test@example.com", "test123", 25);
user.setStatus(1);
int result = userMapper.insert(user);
sqlSession.commit();
// 提交事务
System.out.println("插入结果: " + result);
System.out.println("生成的ID: " + user.getId());
}
@Test
public void testUpdate() {
User user = userMapper.selectById(1L);
if (user != null) {
user.setAge(30);
user.setEmail("updated@example.com");
int result = userMapper.update(user);
sqlSession.commit();
// 提交事务
System.out.println("更新结果: " + result);
}
}
@Test
public void testDelete() {
int result = userMapper.deleteById(3L);
sqlSession.commit();
// 提交事务
System.out.println("删除结果: " + result);
}
@Test
public void testCount() {
long count = userMapper.count();
System.out.println("用户总数: " + count);
}
@Test
public void testSelectByUsername() {
User user = userMapper.selectByUsername("admin");
System.out.println("查询结果: " + user);
}
}

5. 工具类封装

5.1 MyBatis工具类

/**
* 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 MyBatisUtils
{
private static SqlSessionFactory sqlSessionFactory;
static {
try {
// 读取配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
// 创建SqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
throw new RuntimeException("初始化MyBatis失败", e);
}
}
/**
* 获取SqlSessionFactory
*/
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
/**
* 获取SqlSession
*/
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession();
}
/**
* 获取自动提交的SqlSession
*/
public static SqlSession getSqlSession(boolean autoCommit) {
return sqlSessionFactory.openSession(autoCommit);
}
/**
* 获取Mapper
*/
public static <
T> T getMapper(Class<
T> mapperClass) {
SqlSession sqlSession = getSqlSession();
return sqlSession.getMapper(mapperClass);
}
/**
* 执行操作并自动管理SqlSession
*/
public static <
T> T execute(SqlSessionCallback<
T> callback) {
SqlSession sqlSession = getSqlSession();
try {
T result = callback.doInSqlSession(sqlSession);
sqlSession.commit();
return result;
} catch (Exception e) {
sqlSession.rollback();
throw new RuntimeException("执行数据库操作失败", e);
} finally {
sqlSession.close();
}
}
/**
* SqlSession回调接口
*/
public interface SqlSessionCallback<
T> {
T doInSqlSession(SqlSession sqlSession);
}
}

5.2 使用工具类的示例

/**
* 使用工具类的DAO实现
*/
package com.example.dao;
import com.example.entity.User;
import com.example.mapper.UserMapper;
import com.example.util.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import java.util.List;
public class UserDao
{
/**
* 根据ID查询用户
*/
public User selectById(Long id) {
return MyBatisUtils.execute(sqlSession ->
{
UserMapper mapper = sqlSession.getMapper(UserMapper.class)
;
return mapper.selectById(id);
});
}
/**
* 查询所有用户
*/
public List<
User> selectAll() {
return MyBatisUtils.execute(sqlSession ->
{
UserMapper mapper = sqlSession.getMapper(UserMapper.class)
;
return mapper.selectAll();
});
}
/**
* 插入用户
*/
public int insert(User user) {
return MyBatisUtils.execute(sqlSession ->
{
UserMapper mapper = sqlSession.getMapper(UserMapper.class)
;
return mapper.insert(user);
});
}
/**
* 更新用户
*/
public int update(User user) {
return MyBatisUtils.execute(sqlSession ->
{
UserMapper mapper = sqlSession.getMapper(UserMapper.class)
;
return mapper.update(user);
});
}
/**
* 删除用户
*/
public int deleteById(Long id) {
return MyBatisUtils.execute(sqlSession ->
{
UserMapper mapper = sqlSession.getMapper(UserMapper.class)
;
return mapper.deleteById(id);
});
}
/**
* 手动管理SqlSession的示例
*/
public User selectByIdManual(Long id) {
SqlSession sqlSession = MyBatisUtils.getSqlSession();
try {
UserMapper mapper = sqlSession.getMapper(UserMapper.class)
;
return mapper.selectById(id);
} finally {
sqlSession.close();
}
}
}

6. 小结

本文全面介绍了MyBatis框架的基础知识:

  1. 框架概述:MyBatis的特点和与其他ORM框架的对比
  2. 核心组件:SqlSessionFactory、SqlSession、Mapper等核心组件
  3. 环境搭建:Maven依赖、数据库准备、配置文件等
  4. 实体设计:用户和角色实体类的设计
  5. 第一个程序:完整的MyBatis程序示例
  6. 工具封装:MyBatis工具类的设计和使用

掌握MyBatis基础的关键点:

  • 理解MyBatis的工作原理和核心组件
  • 正确配置MyBatis环境和数据库连接
  • 熟练编写Mapper接口和XML映射文件
  • 掌握基本的CRUD操作
  • 学会使用工具类简化开发

下一篇预告

下一篇文章将介绍MyBatis基本操作与映射配置,深入学习MyBatis的映射配置和各种操作技巧。


相关文章:

posted @ 2025-08-22 22:49  yjbjingcha  阅读(8)  评论(0)    收藏  举报