第一个MyBatis程序

 本节,我们就来介绍如何创建第一个 MyBaitis 程序,具体步骤如下。

配置开发环境

想要创建一个 Spring MVC 项目,首先我们必须先配置好开发环境。具体的开发环境配置,如下表。

MyBatis 3.5.13
JDK 版本 17+
Maven 3.6+
MySQL 8.0.23
IntelliJ IDEA IntelliJ IDEA 2022.x

浏览器访问 IntelliJ IDEA 官方下载页面,下载并安装 IntelliJ IDEA。

创建数据库表

首先,我们需要在 MySQL 数据库中新建一个名为 54benniao_mybatis 的数据库,然后在该数据库中执行以下 SQL 语句创建一个名为 user 的表。
SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int NOT NULL AUTO_INCREMENT,
  `username` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `password` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `status` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'admin', 'admin', '2');
INSERT INTO `user` VALUES ('2', '用户1', '123456', '0');

创建 MyBatis 项目

接下来我们就可以在 Intellij IDEA 中借助 Maven 创建一个 MyBatis 项目了。

1. 创建 Maven 父工程

首先,我们先创建一个 Maven 父工程,并通过它来管理我们在本教程中所创建的所有 MyBatis 项目,具体步骤如下。

1) 点击 IntelliJ IDEA 左上角的 File 菜单,然后依次选择 New -> Project -> New Project,并在 New Project 窗口完善 Maven 父工程的 Name(名称)、Location(位置)、Language(编程语言)、Build system(构建方式)、JDK 以及 GroupId 和 ArtifactId 等信息,如下图。
 


图1:创建父工程


2)Maven 父工程 my-baitis-parent-project 创建完成后,其目录结构如下图。
 


图2:父工程目录结构

作为 Maven 父工程,my-baitis-parent-project 中并不会包含任何的 Java 代码,因此我们可以将该工程下的 src 目录直接删除,让项目结构更加清晰整洁。当然,如果不删除,也并不会造成任何影响。

2. 创建子模块

在完成了 Maven 父工程的创建之后,接下来我们就可以在该父工程(my-baitis-parent-project)中创建 MyBatis 项目了,该项目是作为 my-baitis-parent-project 中的一个子模块而存在的。

1) 右键点击 Maven 主工程 my-baitis-parent-project,然后在弹出的菜单中依次选择 New -> Module...,如下图。
 


图3:新建子模块


2)在 New Module 窗口的右侧分别完善 Spring 项目的 Name(子模块名称)、Location(位置)、Language(编程语言)、Build system(构建方式)、JDK 以及 GroupId 和 ArtifactId 等信息,最后点击下方的“Create”完成创建,如下图。
 

创建子模块
图4:创建子模块


3) 子模块 my-first-mybatis-demo 创建完成之后,整个工程的目录结构如下图。
 


图5:目录结构

3. 引入依赖

在完成了 Maven 父工程以及第一个子模块的创建之后,接下来,我们可以将 MyBatis 相关的 Maven 依赖引入到 my-first-mybatis-demo 中。

1) 在 my-first-mvc-demo 的 pom.xml 中将相关依赖引入到该模块之中,具体配置内容如下。

<dependencies>
    <!--MyBatis 核心依赖-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.13</version>
    </dependency>

    <!--mysql 驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.32</version>
    </dependency>

    <!--Junit 测试-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>
    </dependency>

    <!-- log4j日志 -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
</dependencies>


2)  如果我们第一次将上面的依赖引入到工程模块中时,Maven 会自动联网去下载依赖包。下载完成后,点击  IntelliJ IDEA 最右侧的 Maven 选项,此时会弹出一个 Maven 窗口,这里我们可以看到子模块 my-first-mybatis-demo 的依赖(Dependencies),如下图。
 

Maven 依赖
图6:Maven 依赖

温馨提示,当我们在项目的 POM 文件中引入了新的依赖后,若 IDEA 并未自动将下载,则可以手动点击一下图 6 左上角的 Reload All Maven Projects 按钮,重新加载所有的 Maven 工程,此时 IDEA 会重新下载并引入所有依赖。

4. 创建 MyBatis 核心配置文件

在 src/main/resources 目录下创建 MyBatis 的核心配置文件,该配置主要用于配置连接数据库的环境以及 MyBatis 的全局配置信息。该文件的名称可以使任意的,但习惯上会被命名为 mybatis-config.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"/>
                <!--连接数据库的 url-->
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/54benniao_mybatis"/>
                <!--连接数据库的用户名-->
                <property name="username" value="root"/>
                <!--连接数据库的密码-->
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <!--引入映射文件-->
    <mappers>
        <mapper resource="mappers/UserMapper.xml"/>
    </mappers>

</configuration>

5. 添加实体类

在 src/main/java 目录下新建一个 net.biancheng.c.entity 包,然后在该包下新建一个名为 User 的 Java 类,代码如下。
package net.biancheng.c.entity;

/**
* 实体类 User
* 与 MySql 数据库中的 user 表相对应
*/
public class User {
    //唯一标识
    private Integer id;
    //用户名
    private String username;
    //密码
    private String password;
    //状态
    private Integer status;

    public Integer getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

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

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

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

6. 创建 mapper 接口

在 src/main/java 目录下新建一个 net.biancheng.c.mapper 包,并在该包下创建一个名为 UserMapper 的接口,该接口代码如下。
package net.biancheng.c.mapper;

import net.biancheng.c.entity.User;

import java.util.List;

/**
* Mapper 接口
*/
public interface UserMapper {
    /**
     * 查询 user 表中的所有数据
     *
     * @return
     */
    public List<User> getUsers();

    /**
     * 根据 id 查询指定的 user 数据
     *
     * @param id
     * @return
     */
    public User getUserById(int id);

    /**
     * 插入新数据
     *
     * @param user
     * @return
     */
    public int insertUser(User user);

    /**
     * 修改 user 信息
     *
     * @param user
     * @return
     */
    public int updateStatus(User user);

    /**
     * 删除指定的 uer 信息
     *
     * @param user
     * @return
     */
    public int deleteUser(User user);
}

7. 创建 MyBatis 映射文件

MyBatis 的映射文件是用来编写 SQL 语句,访问以及操作数据库表中数据的,因此一个映射文件都只与一个实体类相对应,一个映射文件也只与一张数据库表相对应。

MyBatis 的映射文件需要遵守以下命名规则:
表所对应的实体类的类名 + Mapper.xml
例如,数据库 user 表,映射的实体类为 User,所对应的映射文件为 UserMapper.xml

在 src/main/resrouces 目录下新建一个名为 mappers 的文件夹,然后在这个文件夹下创建一个名为 UserMapper 的 MyBatis 的映射文件,具体配置内容下。
<?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="net.biancheng.c.mapper.UserMapper">

    <!--结果映射,手动将实体类中属性映射到数据库表中的字段上-->
    <resultMap id="userMaps" type="net.biancheng.c.entity.User">
        <id property="id" column="id"></id>
        <result property="username" column="username"></result>
        <result property="password" column="password"></result>
        <result property="status" column="status"></result>
    </resultMap>

    <!--查询 user 表中的所有数据-->
    <select id="getUserById" resultType="net.biancheng.c.entity.User">
        select * from user where id = #{id}
    </select>

    <!--插入新数据-->
    <insert id="insertUser">
        insert into user value (null,#{username},#{password},#{status});
    </insert>

    <!--修改用户状态-->
    <update id="updateStatus">
        update user set status = #{status} where id = #{id};
    </update>
   
    <!--修改数据库表中的设置-->
    <select id="getUsers" resultMap="userMaps">
        select * from user;
    </select>
</mapper>

在上面的配置文件中中,namespace 属性指定了映射文件对应的 mapper 接口的全类名。各个 SQL 操作都使用了不同的标签,例如 <select> 用于查询语句,<insert> 用于插入语句,<update> 用于更新语句,<delete> 用于删除语句。每个标签都有一个 id 属性,该属性值应与 mapper 接口中对应方法的方法名保持一致。

8. 创建 log4j 日志配置文件

在 src/main/resources 下创建一个名为 log4j.xml 的日志配置文件,配置内容如下。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
        <param name="Encoding" value="UTF-8" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS}
%m (%F:%L) \n" />
        </layout>
    </appender>
    <logger name="java.sql">
        <level value="debug" />
    </logger>
    <logger name="org.apache.ibatis">
        <level value="info" />
    </logger>
    <root>
        <level value="debug" />
        <appender-ref ref="STDOUT" />
    </root>
</log4j:configuration>

9. 创建测试类

在 src/test/java 目录下,新建一个名为 UserTest 的 测试类,代码如下。
import net.biancheng.c.entity.User;
import net.biancheng.c.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.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class UserTest {

    @Test
    public void test() throws IOException {
        //加载 MyBatis 的核心配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
        //获取 SqlSessionFactoryBuilder 对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //通过 SqlSessionFactoryBuilder 构建 SqlSessionFactory 对象
        SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);
        //获取 SqlSession 对象,设置为自动提交
        SqlSession sqlSession = sessionFactory.openSession(true);
        //获取 Mapper 接口对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        System.out.println();
        System.out.println("开始新增数据...");
        //新增用户
        User user = new User();
        user.setUsername("root");
        user.setPassword("root");
        user.setStatus(0);
        mapper.insertUser(user);

        List<User> users = mapper.getUsers();
        System.out.println("id    用户名    密码    登陆状态");
        for (User u : users) {
            System.out.println(u.getId() + "    " + u.getUsername() + "    " + u.getPassword() + "    " + (u.getStatus() == 0 ? "未登录" : "已登录"));
        }

        System.out.println();
        System.out.println("开始修改数据...");

        //修改用户状态
        User user1 = new User();
        user1.setId(1);
        user1.setStatus(2);
        mapper.updateStatus(user1);

        System.out.println();
        System.out.println("查询是否修改成功...");
        User userById = mapper.getUserById(user1.getId());
        System.out.println(userById.getId() + "    " + userById.getUsername() + "    " + userById.getPassword() + "    " + (userById.getStatus() == 0 ? "未登录" : "已登录"));

    }
}

测试

运行测试类 UserTest 中的 test() 方法,控制态输出内容如下。
开始新增数据...
DEBUG 05-09 17:32:01,633 ==>  Preparing: insert into user value (null,?,?,?); (BaseJdbcLogger.java:135)
DEBUG 05-09 17:32:01,690 ==> Parameters: root(String), root(String), 0(Integer) (BaseJdbcLogger.java:135)
DEBUG 05-09 17:32:01,707 <==    Updates: 1 (BaseJdbcLogger.java:135)
DEBUG 05-09 17:32:01,711 ==>  Preparing: select * from user; (BaseJdbcLogger.java:135)
DEBUG 05-09 17:32:01,712 ==> Parameters:  (BaseJdbcLogger.java:135)
DEBUG 05-09 17:32:01,761 <==      Total: 3 (BaseJdbcLogger.java:135)
id    用户名    密码    登陆状态
1    admin    admin    已登录
2    用户1    123456    未登录
5    root    root    未登录

开始修改数据...
DEBUG 05-09 17:32:01,771 ==>  Preparing: update user set status = ? where id = ?; (BaseJdbcLogger.java:135)
DEBUG 05-09 17:32:01,772 ==> Parameters: 2(Integer), 1(Integer) (BaseJdbcLogger.java:135)
DEBUG 05-09 17:32:01,774 <==    Updates: 1 (BaseJdbcLogger.java:135)

查询是否修改成功...
DEBUG 05-09 17:32:01,775 ==>  Preparing: select * from user where id = ? (BaseJdbcLogger.java:135)
DEBUG 05-09 17:32:01,776 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:135)
DEBUG 05-09 17:32:01,781 <==      Total: 1 (BaseJdbcLogger.java:135)
1    admin    admin    已登录

声明:《MyBatis系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。