Mybatis - 入门

117 阅读2分钟

Mybatis - 入门

官方文档(中文)
官方文档永远是最重要的参考资料.

mybatis 是一个半自动化(对象的属性和数据库表中的字段的对应关系需要程序员手动维护)的对象-关系映射框架,可以方便地将数据库中存储的记录与 Java 对象建立对应关系。

本文以对 mysql 数据库中的单个表格的增删改查演示 mybitis 的基本配置和使用。

创建一个 Maven 工程 helloworld

修改 pom.xml 文件,添加依赖

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.28</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.9</version>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>5.8.2</version>
    </dependency>
</dependencies>

创建数据库 demo 及 t_user 表格

create table t_user
(
    id         int primary key auto_increment,
    username   varchar(200),
    password   varchar(64),
    email      varchar(256)
);

insert into t_user (id, username, password, email) VALUES (1, 'zs', 'zs', 'zs@163.com');
insert into t_user (id, username, password, email) VALUES (2, 'ls', 'ls', 'ls@163.com');
insert into t_user (id, username, password, email) VALUES (3, 'ww', 'ww', 'ww@163.com');
insert into t_user (id, username, password, email) VALUES (4, 'a', 'a', 'a@163.com');
insert into t_user (id, username, password, email) VALUES (5, 'b', 'b', 'b@163.com');
insert into t_user (id, username, password, email) VALUES (6, 'c', 'c', 'c@163.com');
insert into t_user (id, username, password, email) VALUES (7, 'd', 'd', 'd@163.com');
insert into t_user (id, username, password, email) VALUES (8, 'e', 'e', 'e@163.com');
insert into t_user (id, username, password, email) VALUES (9, 'f', 'f', 'f@163.com');
insert into t_user (id, username, password, email) VALUES (10, 'g', 'g', 'g@163.com');
insert into t_user (id, username, password, email) VALUES (11, 'h', 'h', 'h@163.com');

创建实体类 User.java

package com.demo.helloworld.entity;

public class User {
    private Integer id;
    private String username;
    private String password;
    private String email;

    // 省略 get 和 set 方法
}

创建 UserMapper 接口文件

package com.demo.batis.mapper;

import com.demo.batis.entity.User;

import java.util.List;

public interface UserMapper {
    User getUserById(Integer id);

    List<User> findUsers();

    Integer insertUser(User user);

    Integer deleteUserById(Integer id);

    Integer updateUser(User user);
}

在 Resources 目录下创建 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>
    <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/helloworld"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/><!--改成你自己的数据库用户名和密码-->
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
</configuration>

在 Resources 目录下创建 mapper 目录及 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.helloworld.batis.mapper.UserMapper">
    <select id="getUserById" resultType="com.helloworld.batis.entity.User">
        select * from t_user where id = #{id}
    </select>

    <select id="findUsers" resultType="com.helloworld.batis.entity.User">
        select * from t_user
    </select>

    <insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
        insert into t_user (id, username, password, email) values (#{id}, #{username}, #{password}, #{email})
    </insert>

    <delete id="deleteUserById">
        delete from t_user where id = #{id}
    </delete>

    <update id="updateUser" parameterType="User">
        update t_user set username = #{username}, password = #{password}, email = #{email} where id = #{id}
    </update>
</mapper>

至此,项目的配置文件均已完成,可以编写相关的测试类,检查增删改查的功能是否正确。

在 test 目录中新建类 com.demo.helloworld.mapper.UserMapperTest


class UserMapperTest {

    @Test
    void getUserById() throws IOException {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        Integer id = 1;
        User user = userMapper.getUserById(id);
        Assertions.assertEquals(1, user.getId());
    }

    @Test
    void findUsers() throws IOException {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List<User> users = userMapper.findUsers();
        Assertions.assertTrue(users.size() > 0);
    }

    @Test
    void insertUser() throws IOException {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = new User();
        user.setUsername("admin");
        user.setPassword("admin");
        user.setEmail("admin@admin.com");
        Integer result = userMapper.insertUser(user);
        Assertions.assertTrue(result > 0);
    }

    @Test
    void deleteUserById() throws IOException {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();

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

        Integer result = userMapper.deleteUserById(1);
        Assertions.assertEquals(1, result);
    }

    @Test
    void updateUser() {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.getUserById(1);
        user.setUsername("test");
        user.setPassword("test");
        Integer result = userMapper.updateUser(user);
        Assertions.assertEquals(1, result);
    }
}

其中,为了方便获得 SqlSession,创建了一个工具类 SqlSessionUtil

public class SqlSessionUtil {
    public static SqlSession getSqlSession() {
        SqlSession sqlSession = null;
        try {
            InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            sqlSession = sqlSessionFactory.openSession(true); // 开启事务的自动提交
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sqlSession;
    }
}

至此,一个简单的利用mybatis对数据库单表进行增删改查的操作就完成了!