Java持久层框架:MyBatis介绍

MyBatis

概述

MyBatis,是支持定制化 SQL 、存储过程和高级映射的优秀持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object ,普通的 Java 对象)映射成数据库中的记录。

MyBatis 特点

  • 简单易学:没有任何第三方依赖。易于学习和使用

  • 灵活:MyBatis 不会对应用程序或数据库的现有设计强加任何影响。 SQL 写在 xml 里,便于统一管理和优化

  • 解除 SQL 与程序代码的耦合:通过提供 DAO 层,将业务逻辑和数据访问逻辑分离,使系统设计更清晰,也更易维护和单元测试。同时提高了可维护性

  • 提供映射标签,支持对象与数据库的 ORM 字段关系映射

  • 提供对象关系映射标签,支持对象关系组建维护

  • 提供 xml 标签,支持编写动态 SQL
    MyBatis 功能架构

  • API 接口层:提供给外部使用的接口 API ,开发者通过这些本地 API 来操作数据库。接口层接收到调用请求便会调用数据处理层来完成具体的数据处理

  • 数据处理层:负责具体的 SQL 查找、SQL 解析、SQL 执行和执行结果映射处理等。主要目的是根据调用的请求完成一次数据库操作

  • 基础支撑层:负责最基础的功能支撑(连接管理、事务管理、配置加载和缓存处理),这些都是共用的,将其抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑

简单示例:

首先,创建一个 Maven 的 Java 项目

接着,在 pom.xml 配置文件中添加以下配置

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/maven-v4_0_0.xsd">

  <modelVersion>4.0.0</modelVersion>
  <groupId>MyBatisDemo</groupId>
  <artifactId>MyBatisDemo</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>MyBatisDemo</name>
  <url>http://maven.apache.org</url>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>compile</scope>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.6</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.25</version>
    </dependency>
  </dependencies>

  <!-- 错误:Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource cn/edu/MyBatisDemo/model/UserMapper.xml -->
  <!-- 解决方案:-->
  <!--   UserMapper.xml 配置文件写在 src 找不到问题解决方案     -->
  <build>
    <resources>
      <resource>
        <!-- directory:指定资源文件的位置 -->
        <directory>src/main/java</directory>
        <includes>
          <!-- "**":表示任意级目录    "*":表示任意任意文件 -->
          <!-- mvn resources:resources :对资源做出处理,先于 compile 阶段  -->
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <!--  filtering:开启过滤,用指定的参数替换 directory 下的文件中的参数(eg. ${name}) -->
        <filtering>false</filtering>
      </resource>
      <resource>
        <directory>src/main/resources</directory>
      </resource>
    </resources>
  </build>
</project>

然后,创建一个数据表 user

并在 model 目录下创建与数据表 user 一一映射的实体类 User

java 复制代码
package cn.edu.MyBatisDemo.model;

import java.util.Date;

public class User {
    private int id;
    private String name;
    private String password;
    private Date date; //注册日期
    private int state; //用户状态

    public User() {
        super();
    }

    public User(int id, String name, String password, Date date, int state) {
        this.id = id;
        this.name = name;
        this.password = password;
        this.date = date;
        this.state = state;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", password='" + password + '\'' +
                ", date=" + date +
                ", state=" + state +
                '}';
    }
}

再在 mapper 目录下创建一个接口 UserMapper ,声明获取指定用户信息的方法

java 复制代码
package cn.edu.MyBatisDemo.mapper;

import cn.edu.MyBatisDemo.model.User;

//不需要写实现类,配置 UserMapper.xml 配置文件即可
public interface UserMapper {
    public User selectUserById(int id); // 获取指定用户的信息
}

在此不需要写实现类,在 model 目录下创建 UserMapper.xml 配置文件配置即可

xml 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- namespace 必须为接口的全类名 -->
<mapper namespace="cn.edu.MyBatisDemo.mapper.UserMapper">
    <!-- id 必须为接口对应的方法名 -->
    <select id="selectUserById" resultType="cn.edu.MyBatisDemo.model.User">
        SELECT `id`,`name`,`password`,`date`,`state` FROM `user` WHERE id=#{id}
    </select>
</mapper>

随之,在 resources 目录下创建 mybatis.xml 配置文件

xml 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC
        "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">

<!-- mybatis 全局配置文件 -->
<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/mybatisdemo?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false&amp;serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="0123"/>
            </dataSource>
        </environment>
    </environments>

    <!-- POJO对象与数据表的映射配置 -->
    <mappers>
        <mapper resource="cn/edu/MyBatisDemo/model/UserMapper.xml" />
    </mappers>
</configuration>

最后,在 test 目录下创建测试类 MyBatisTest ,测试结果

java 复制代码
package cn.edu.MyBatisDemo.test;

import cn.edu.MyBatisDemo.mapper.UserMapper;
import cn.edu.MyBatisDemo.model.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 org.junit.Test;

import java.io.IOException;
import java.io.InputStream;

public class MyBatisTest {
    @Test
    public void test() throws IOException {
        //1.根据配置文件创建数据库连接会话的工厂类
        InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
        //获取工厂类
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2.通过工厂类获取数据库连接的会话
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //3.通过 sqlSession 操作数据库
        try {
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            User user = userMapper.selectUserById(20230815);
            System.out.println(user);
        } finally {
            sqlSession.close();
        }
    }
}

结果如图:

相关推荐
ysy16480672391 天前
Spring、Spring MVC、MyBatis 和 Spring Boot的关系
spring·mvc·mybatis
Mr Aokey1 天前
从BaseMapper到LambdaWrapper:MyBatis-Plus的封神之路
java·eclipse·mybatis
寒士obj1 天前
MyBatis联合查询
mybatis
真实的菜1 天前
MyBatis核心配置深度解析:从XML到映射的完整技术指南
xml·tomcat·mybatis
Asu52022 天前
思途AOP学习笔记 0806
java·sql·学习·mybatis
期待のcode2 天前
配置Mybatis环境
java·tomcat·mybatis
熊猫片沃子2 天前
mybatis 与mybatisplus 比较总结
java·后端·mybatis
寒士obj2 天前
MyBatis基础操作完整指南
mybatis
Asu52023 天前
思途Mybatis学习 0805
java·spring boot·学习·mybatis
Mr Aokey3 天前
注解退散!纯XML打造MyBatis持久层的终极形态
xml·java·mybatis