为了账号安全,请及时绑定邮箱和手机立即绑定

Mybatis持久层框架学习指南

标签:
Java 数据库
概述

Mybatis是一款优秀的持久层框架,支持自定义SQL、存储过程以及高级映射,简化了数据库操作。本文将详细介绍Mybatis的安装与配置、核心概念、环境搭建以及CRUD操作等内容,帮助读者掌握Mybatis持久层框架学习。

Mybatis基础介绍

Mybatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。Mybatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集,使用简单的 XML 或注解进行配置和原始映射,并将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)进行映射,将数据库返回的记录转换成易于操作的 Java 对象。

Mybatis的核心概念和术语

Mybatis 的核心概念和术语如下:

  • SqlSessionFactory:工厂模式,用于创建 SqlSession 的类。
  • SqlSession:数据库会话对象,用于执行数据库操作。
  • Mapper:映射接口,包含持久化操作的接口。
  • Executor:执行器,负责管理和执行映射语句。
  • Configuration:配置信息,封装了配置文件中的所有配置信息。
  • MappedStatement:映射语句,封装了映射文件中的 SQL 语句。
  • ParameterMapping:SQL 语句中的参数映射。
  • ResultMap:定义了 SQL 语句结果集的映射规则。
  • ResultSetHandler:结果集处理器,负责将数据库查询结果转换为 Java 对象。

示例代码

Java 类示例:

package com.example.dao;

public class User {
  private int id;
  private String name;
  private int age;

  // 构造器、getters 和 setters 方法
}

映射接口示例:

package com.example.mapper;

public interface UserMapper {
  int insert(User user);
  int delete(int id);
  int update(User user);
  List<User> selectAll();
}
Mybatis的安装与配置

安装步骤

  1. 下载 Mybatis 软件包,解压后放到需要使用的项目中。
  2. 配置 Mybatis 的全局配置文件 mybatis-config.xml,该文件位于项目的 resources 目录下。
  3. 配置数据库连接信息,创建数据库连接池。
  4. 配置数据映射文件 mapper.xml,该文件用于描述 SQL 语句的执行。

全局配置文件

一个典型的 Mybatis 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="db.properties"/>
  <typeAliases>
    <typeAlias type="com.example.dao.User" alias="User"/>
  </typeAliases>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="com/example/dao/UserMapper.xml"/>
  </mappers>
</configuration>

数据库连接池配置

数据库连接信息通常放在 db.properties 文件中,如下所示:

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

mybatis-config.xml 中引用该文件。

Mybatis的项目集成

在开发工具中创建一个新的 Java 项目,例如使用 IntelliJ IDEA 或 Eclipse。需要安装 JDK,然后在开发工具中创建一个新的 Java 项目。

Maven项目的创建与配置

使用 Maven 管理项目依赖及构建,示例项目结构如下:

project-root
|-- pom.xml
|-- src
    |-- main
        |-- java
        |-- resources
            |-- db.properties
            |-- mybatis-config.xml
            |-- mapper
                |-- UserMapper.xml
    |-- test
        |-- java
            |-- com.example.test
                |-- UserMapperTest.java

pom.xml 配置文件

<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-SNAPSHOT</version>
  <dependencies>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.26</version>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.6</version>
    </dependency>
  </dependencies>
</project>

Mybatis的项目集成

  • 将 Mybatis 的配置文件 mybatis-config.xml 放在 resources 目录下。
  • 引用配置文件中的数据库连接信息并配置 Mybatis 映射文件。
  • 创建 Java 类,定义持久化对象的映射接口。
Mybatis的CRUD操作

增加数据

创建数据库表:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

Java 代码示例:

package com.example.dao;

public class User {
  private int id;
  private String name;
  private int age;

  // 构造器、getters 和 setters 方法
}

package com.example.mapper;

import com.example.dao.User;

public interface UserMapper {
  int insert(User user);
}

Mapper 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">
  <insert id="insert" parameterType="com.example.dao.User">
    INSERT INTO user(name, age) VALUES (#{name}, #{age})
  </insert>
</mapper>

删除数据

Java 代码示例:

package com.example.mapper;

public interface UserMapper {
  int delete(int id);
}

Mapper XML:

<delete id="delete" parameterType="int">
  DELETE FROM user WHERE id = #{id}
</delete>

修改数据

Java 代码示例:

package com.example.mapper;

public interface UserMapper {
  int update(User user);
}

Mapper XML:

<update id="update" parameterType="com.example.dao.User">
  UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}
</update>

查询数据

Java 代码示例:

package com.example.mapper;

import java.util.List;

public interface UserMapper {
  List<User> selectAll();
}

Mapper XML:

<select id="selectAll" resultType="com.example.dao.User">
  SELECT * FROM user
</select>

映射文件中的标签解析

  • <insert>:插入数据。
  • <delete>:删除数据。
  • <update>:更新数据。
  • <select>:查询数据。
Mybatis的映射文件

映射文件的基本结构

映射文件 UserMapper.xml 的结构如下:

<mapper namespace="com.example.mapper.UserMapper">
  <insert id="insert" parameterType="com.example.dao.User">
    INSERT INTO user(name, age) VALUES (#{name}, #{age})
  </insert>
  <delete id="delete" parameterType="int">
    DELETE FROM user WHERE id = #{id}
  </delete>
  <update id="update" parameterType="com.example.dao.User">
    UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}
  </update>
  <select id="selectAll" resultType="com.example.dao.User">
    SELECT * FROM user
  </select>
</mapper>

如何编写映射文件

  • namespace:映射文件对应的接口。
  • id:映射文件中的 SQL 语句的唯一标识符。
  • parameterType:SQL 语句中参数的数据类型。
  • resultType:结果集映射的 Java 类型。

映射文件中的标签解析

  • <insert>:插入数据。
  • <delete>:删除数据。
  • <update>:更新数据。
  • <select>:查询数据。
Mybatis的动态SQL

动态SQL的基本使用

动态 SQL 是 Mybatis 的一个强大特性,它允许你根据条件动态生成 SQL 语句。

Java 代码示例:

package com.example.mapper;

import java.util.List;

public interface UserMapper {
  List<User> selectByCondition(User condition);
}

Mapper XML:

<select id="selectByCondition" parameterType="com.example.dao.User" resultType="com.example.dao.User">
  SELECT * FROM user
  <where>
    <if test="name != null">
      AND name = #{name}
    </if>
    <if test="age != null">
      AND age = #{age}
    </if>
  </where>
</select>

if标签的应用

Java 代码示例:

package com.example.mapper;

import java.util.List;

public interface UserMapper {
  List<User> selectByCondition(User condition);
}

Mapper XML:

<select id="selectByCondition" parameterType="com.example.dao.User" resultType="com.example.dao.User">
  SELECT * FROM user
  <where>
    <if test="name != null">
      AND name = #{name}
    </if>
    <if test="age != null">
      AND age = #{age}
    </if>
  </where>
</select>

choose标签的应用

Java 代码示例:

package com.example.mapper;

import java.util.List;

public interface UserMapper {
  List<User> selectByCondition(User condition);
}

Mapper XML:

<select id="selectByCondition" parameterType="com.example.dao.User" resultType="com.example.dao.User">
  SELECT * FROM user
  <where>
    <choose>
      <when test="name != null">
        AND name = #{name}
      </when>
      <when test="age != null">
        AND age = #{age}
      </when>
      <otherwise>
        AND id = 1
      </otherwise>
    </choose>
  </where>
</select>

foreach标签的应用

Java 代码示例:

package com.example.mapper;

import java.util.List;
import java.util.ArrayList;

public interface UserMapper {
  List<User> selectByIds(ArrayList<Integer> ids);
}

Mapper XML:

<select id="selectByIds" parameterType="java.util.List" resultType="com.example.dao.User">
  SELECT * FROM user WHERE id IN
  <foreach item="item" index="index" collection="list" open="(" separator="," close=")">
    #{item}
  </foreach>
</select>
Mybatis的高级特性

结果集的处理

Mybatis 支持多种结果集的处理方式,例如:

Java 代码示例:

package com.example.mapper;

import java.util.List;

public interface UserMapper {
  List<User> selectUsers();
}

Mapper XML:

<select id="selectUsers" resultMap="UserResultMap">
  SELECT id, name, age FROM user
</select>

<resultMap id="UserResultMap" type="com.example.dao.User">
  <id column="id" property="id"/>
  <result column="name" property="name"/>
  <result column="age" property="age"/>
</resultMap>

分页查询

可以使用 Mybatis 的 RowBounds 类进行简单的分页查询。

Java 代码示例:

package com.example.mapper;

import java.util.List;
import org.apache.ibatis.session.RowBounds;

public interface UserMapper {
  List<User> selectByRowBounds(User condition, RowBounds rowBounds);
}

Mapper XML:

<select id="selectByRowBounds" parameterType="java.lang.Integer" resultType="com.example.dao.User">
  SELECT * FROM user
    <if test="offset != null and limit != null">
      LIMIT #{offset}, #{limit}
    </if>
</select>

事务管理

Mybatis 支持事务管理,可以通过配置文件或编程方式来管理事务。

mybatis-config.xml 中配置事务管理器:

<transactionManager type="JDBC"/>

在 Java 代码中执行事务:

package com.example.test;

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 java.io.IOException;
import java.io.InputStream;

public class UserMapperTest {
  private SqlSessionFactory sqlSessionFactory;

  public UserMapperTest() throws IOException {
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  }

  public void testTransaction() {
    try (SqlSession session = sqlSessionFactory.openSession()) {
      UserMapper mapper = session.getMapper(UserMapper.class);
      mapper.insert(new User(1, "Tom", 20));
      mapper.insert(new User(2, "Jerry", 25));
      // 提交事务
      session.commit();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

以上是 Mybatis 的基本概念和一些高级特性,通过这些内容,你可以更深入地了解和掌握 Mybatis 的使用。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消