Skip to content

simple usage

源代码地址

MyBatis 是一个优秀的持久层框架,它简化了 JDBC 的操作,并且支持定制化 SQL、存储过程以及高级映射。

1. 添加依赖

首先,在你的项目中添加 MyBatis 和数据库驱动的依赖。如果你使用的是 Maven,可以在 pom.xml 文件中加入如下依赖:

xml
  <dependencies>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.19</version>
    </dependency>
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <version>8.3.0</version>
    </dependency>
</dependencies>

2. 配置 MyBatis

创建一个 mybatis-config.xml 文件来配置 MyBatis,包括数据源、事务管理器等信息:

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">
<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/learn?serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="1q2w3e4r"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/jasper/mapper/SystemNoticeMapper.xml"/>
    </mappers>
</configuration>

3. 创建实体类和 Mapper 接口

假设我们有一个用户表 users,可以创建相应的实体类 User 和 Mapper 接口 UserMapper

User.java

java
@Data
public class  SystemNotice {
    private int id;
    private String title;
}

SystemNoticeMapper.java

java
public interface SystemNoticeMapper {

    SystemNotice selectSystemNoticeById(Integer id);

    @Select("select * from system_notice where id = #{id}")
    SystemNotice selectById(Integer id);
}

4. 编写 XML 映射文件

在资源目录下创建与 Mapper 接口对应的 XML 映射文件 SystemNoticeMapper.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">
<mapper namespace="com.jasper.mapper.SystemNoticeMapper">
    <select id="selectSystemNoticeById" resultType="com.jasper.pojo.SystemNotice">
        select * from system_notice where id = #{id}
    </select>
</mapper>

5. 使用 MyBatis

最后,在代码中使用 SqlSessionFactory 来获取 SqlSession 并执行数据库操作。

java
package com.jasper;

import com.jasper.mapper.SystemNoticeMapper;
import com.jasper.pojo.SystemNotice;
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 SimpleUsage {
    public static void main(String[] args) throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        try (SqlSession session = sqlSessionFactory.openSession()) {
            SystemNoticeMapper mapper = session.getMapper(SystemNoticeMapper.class);
            SystemNotice systemNotice = mapper.selectSystemNoticeById(1);
            SystemNotice systemNotice1 = mapper.selectById(2);
            System.out.println(systemNotice.getTitle());
            System.out.println(systemNotice1.getTitle());
        }
    }
}

SqlSessionFactory

SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏习惯”。因此 SqlSessionFactory 的最佳作用域是应用作用域。 有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。

SqlSession

每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。