ORXIAIN ISLAND
博客 / BLOG POST
2025 - 2026
READING

Java - Mybatis基础

+

什么是MyBatis

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

MyBatis中,Mapper 是一个接口,它提供了一种方法与 SQL 语句之间的映射关系。每个 Mapper 方法对应一个 SQL 语句

项目搭建

Mysql数据库

docker pull mysql

记得开docker时指定环境变量中root的密码 连到IDEA(或者直接进shell操作)

# 创建数据库
CREAT DATABASES USER;

然后新建一个user表,随便插入些数据 需要注意的是列的顺序创建后无法改变,要是想要返回特定顺序的话用select id, username, data即可

MyBatis简单项目

idea选择maven项目,这里jdk用了1.8

pom.xml

<properties>  
    <maven.compiler.source>8</maven.compiler.source>  
    <maven.compiler.target>8</maven.compiler.target>  
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
</properties>  
  
<dependencies>  
    <dependency>  
        <groupId>org.mybatis</groupId>  
        <artifactId>mybatis</artifactId>  
        <version>3.5.0</version>  
    </dependency>  
    
    <dependency>  
        <groupId>mysql</groupId>  
        <artifactId>mysql-connector-java</artifactId>  
        <version>5.1.46</version>  
    </dependency>  
  
    <dependency>  
        <groupId>org.projectlombok</groupId>  
        <artifactId>lombok</artifactId>  
        <version>1.16.10</version>  
    </dependency>  
    
    <dependency>  
        <groupId>junit</groupId>  
        <artifactId>junit</artifactId>  
        <version>4.12</version>  
    </dependency>  
</dependencies>

这里加入了junit来辅助测试,因为MyBatis是一个持久层框架,主要负责关于数据库的操作,需要依赖javaweb框架(Springboot等)作为网页交互部分

MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息

详细的配置文档

创建一个user类,用alt+insert快速创建getter和setter,最后写好tostring方法方便输出

package com.orxiain.pojo;  
  
//用户类  
public class User {  
    private int id;  
    private String username;  
    private String Data;  
  
    // 构造方法  
    public User(int id, String username, String Data) {  
        this.id = id;  
        this.username = username;  
        this.Data = Data;  
    }  
    public int getId() {  
        return id;  
    }  
    public void setId(int id) {  
        this.id = id;  
    }  
    public String getUsername() {  
        return username;  
    }  
    public void setUsername(String username) {  
        this.username = username;  
    }  
    public String getData() {  
        return Data;  
    }  
    public void setData(String data) {  
        Data = data;  
    }  
    @Override  
    public String toString() {  
        return "[id = " + this.getId() + " name = " + this.getUsername() + " data = " + this.getData() + "]";  
    }  
}

java/resource下新建一个sqlMapConfig.xml文件,用于MyBatis的数据库和Mapper,后面的mappers属性注册了UserMapper这个mapper

<?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>  
    <!--配置数据库的环境变量(数据库连接配置)-->  
    <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://192.168.1.6:32770/USER?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>  
                <property name="username" value="root"/>  
                <property name="password" value="root"/>  
            </dataSource>  
        </environment>  
    </environments>  
    <mappers>  
        <mapper resource="UserMapper.xml"></mapper>  
    </mappers>  
</configuration>

关于mapper还有几种指定方式:

<mapper resource="org/mybatis/builder/PostMapper.xml"/>
<mapper url="file:///var/mappers/PostMapper.xml"/>
<mapper class="org.mybatis.builder.PostMapper"/>
<package name="org.mybatis.builder"/> // 这个直接放在mappers标签内,它会将包内所有mapper注册

java/resource下新建一个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.orxiain.mapper.UserMapper">  
    <select id="getByid" resultType="com.orxiain.pojo.User">  
        select ID, username, DATA from USER.user where ID=#{id}  
    </select>  
    <select id="getAll" resultType="com.orxiain.pojo.User">  
        select ID, username, DATA from USER.user  
    </select>  
</mapper>
  1. mapper:这是 XML 文件的根元素,它代表一个 Mapper。
  2. namespace:这是 mapper 元素的属性,它对应一个 Java 接口的全限定名。这个接口定义了一些方法,这些方法对应 XML 文件中的 SQL 语句。com.orxiain.mapper.UserMapper 是一个接口,它有 getAll 和 getByid 这两个方法。
  3. select:这是一个元素,它代表一个 SELECT SQL 语句。而select里就是执行的sql语句,注意第二个select使用#{id}来传入参数,获取指定id的user对象
  4. id:这是 select 元素的属性,它对应 namespace 指定的接口中的一个方法名。getAll 和 getByid 是 com.orxiain.mapper.UserMapper 接口的方法。
  5. resultType:这是 select 元素的属性,它指定了 SQL 语句的返回结果的类型。这个类型应该是一个 Java 类的全限定名。com.orxiain.pojo.User 是一个 Java 类,它应该有 IDusername 和 DATA 这三个属性,对应 SQL 语句中的列。

可以新建一个接口来实现通过类似调用普通java方法的方式来调用它

package com.orxiain.mapper;  
  
import com.orxiain.pojo.User;  
  
import java.util.List;  
  
public interface UserMapper {  
    User getByid(int id);  
    List<User> getAll();  
}

在test下创建test类

public class Test1 {  
    @Test  
    public void testA() throws IOException {  
        InputStream input = Resource.class.getResourceAsStream("/sqlMapConfig.xml");  
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(input);  
        SqlSession sqlSession = factory.openSession();  
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);  
        User user2 = mapper.getByid(2);  
        List<User> users = mapper.getAll();  
        users.forEach(user -> System.out.println(user));;  
        System.out.println(user2);  
        sqlSession.close();  
    }}

代码做了什么? 首先需要加载mybatis的配置文件,如果写在xml里就通过输入流获取,这里的Resource.class.getResourceAsStream是Mybatis提供的一个方法,它可以读取资源文件并返回为输入流

使用 MyBatis 的主要 Java 接口就是 SqlSession。你可以通过这个接口来执行命令,获取映射器实例和管理事务。在介绍 SqlSession 接口之前,我们先来了解如何获取一个 SqlSession 实例。SqlSessions 是由 SqlSessionFactory 实例创建的。SqlSessionFactory 对象包含创建 SqlSession 实例的各种方法。而 SqlSessionFactory 本身是由 SqlSessionFactoryBuilder 创建的,它可以从 XML、注解或 Java 配置代码来创建 SqlSessionFactory。

mybatis中对数据库的操作都是通过SqlSession的对象进行的,获取其对象需要先用到SqlSessionFactory并输入刚才的输入流得到生成SqlSession的Factory

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(input);

然后通过调用Factory的openSession()方法返回对象

SqlSession sqlSession = factory.openSession();

例如这里调用需要参数输入的getByid方法,首先 需要创建接口UserMapper的代理对象,这里用的是sqlsession对象的getMapper方法

UserMapper mapper = sqlSession.getMapper(UserMapper.class);

创建之后就可以直接调用方法

User user2 = mapper.getByid(2);

除了以接口的方式作为mapper,也可以直接在namespace里添加mapper的名称,然后以sqlsession的方法调用(共有20个方法🤔)

public class Test2 {  
    @Test  
    public void testB() throws IOException {  
        InputStream input = Resource.class.getResourceAsStream("/sqlMapConfig.xml");  
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(input);  
        SqlSession sqlSession = factory.openSession();  
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);  
  
        List<User> users = sqlSession.selectList("com.orxiain.mapper.UserMapper.getAll");  
        users.forEach(user -> System.out.println(user));  
  
        sqlSession.close();  
    }}

以上就是比较简单的实现了查找 接下来实现增删改的操作😋

CRUD 实现

在mapper中有以下几个标签,通过指定标签并编写相应的sql语句来实现CRUD

  • insert – 映射插入语句。
  • update – 映射更新语句。
  • delete – 映射删除语句。
  • select – 映射查询语句。

先在UserMapper.xml写出sql语句

<insert id="addUser" parameterType="com.orxiain.pojo.User">  
    insert into USER.user(username, ID, DATA) values (#{username}, #{id}, #{Data});  
</insert>

接口实现类

public interface UserMapper {  
    User getByid(int id);  
    List<User> getAll();  
    Boolean addUser(User user); //返回类型直接void也可以
}

<delete id="delUser" parameterType="com.orxiain.pojo.User">  
    delete from USER.user where ID=#{id};  
</delete>
void delUser(int id);
    public void testB() throws IOException {  
        InputStream input = Resource.class.getResourceAsStream("/sqlMapConfig.xml");  
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(input);  
        SqlSession sqlSession = factory.openSession();  
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);  
  
        User newuser = new User(4,"or2","something~");  
        mapper.addUser(newuser);  
  
        mapper.delUser(1);  
  
        List<User> nowusers = sqlSession.selectList("com.orxiain.mapper.UserMapper.getAll");  
        nowusers.forEach(user -> System.out.println(user));  
  
        sqlSession.close();  
    }}

也就是update标签,基本上都是以上的形式,这里直接给例子

<update id="updateAuthor">
  update Author set
    username = #{username},
    password = #{password},
    email = #{email},
    bio = #{bio}
  where id = #{id}
</update>

补充

如果可以自动生成主键,设置useGeneratedKeys为true并指定keyProperty

<insert id="insertAuthor" useGeneratedKeys="true"
    keyProperty="id">

还可以多行插入:

<insert id="insertAuthor" useGeneratedKeys="true"
    keyProperty="id">
  insert into Author (username, password, email, bio) values
  <foreach item="item" collection="list" separator=",">
    (#{item.username}, #{item.password}, #{item.email}, #{item.bio})
  </foreach>
</insert>

同时,在mapper中可以设置运行主要sql语句前的操作: 这个例子就是生成了一个随机id作为主键,设置了order

<insert id="insertAuthor">
  <selectKey keyProperty="id" resultType="int" order="BEFORE">
    select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1
  </selectKey>
  insert into Author
    (id, username, password, email,bio, favourite_section)
  values
    (#{id}, #{username}, #{password}, #{email}, #{bio}, #{favouriteSection,jdbcType=VARCHAR})
</insert>

其余的:mybatis – MyBatis 3 | XML 映射器

Links

END