Mybatis 笔记——简单程序样例

142 阅读3分钟

这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战

image-20210704193018557

简介

MyBatis 本是 apache 的一个开源项目 iBatis, 2010年这个项目由 apache software foundation 迁移到了google code,并且改名为 MyBatis 。2013年11月迁移到 GitHub。

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

简单的说:MyBatis 是可以帮助我们快速开发基于数据库操作的程序,能帮助我们快速映射 POJO 对象和数据库中的数据,同时支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。

更简单的说:MyBatis 就是持久层的框架,SSM 中的 M 就是指 MyBatis。还有更方便的是对 MyBatis 进行封装的 MyBatis-Plus,不在这里说了,有兴趣可以去官网了解。


简单程序样例

根据一个简单的使用样例来感受一下多么简单。

  1. 创建 mybatis 数据库,及 user 表

user 表结构:

FieldTypeComment
idint(11) NOT NULL用户 id
namevarchar(30) NULL用户名
passwordvarchar(30) NULL用户密码

sql 代码:

CREATE DATABASE `mybatis`;

USE `mybatis`;

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (
  `id` int(11) NOT NULL COMMENT '用户id',
  `name` varchar(30) DEFAULT 'NULL' COMMENT '用户名',
  `password` varchar(30) DEFAULT 'NULL' COMMENT '用户密码',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

insert  into `user`(`id`,`name`,`password`) values 
(1,'admin','admin'),
(2,'test','test');
  1. IDEA 创建一个 Maven 项目

    image-20210706164615097

  2. pom.xml 导入相关依赖

    mysql 数据库驱动用的 5.1.47 版本,可以根据需要改成 mysql 8+版本,注意改变 URL。

    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.6</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.47</version>
    </dependency>
    
  3. 创建实体类

    创建与数据库的 user 表字段对应的 Javabean 类。

    import lombok.AllArgsConstructor;
    import lombok.Data;
    
    @Data
    @AllArgsConstructor
    public class User {
    
        private int id;
        private String name;
        private String password;
    
    }
    
  4. 编写 Mapper 接口类

    创建 UserMapper 接口类。

    提供基础的增删改查:addUser,deleteUserById,updateUserById,selectUser,selectUserByNameAndPassword。

    import pojo.User;
    
    import java.util.List;
    import java.util.Map;
    
    public interface UserMapper {
    
        int addUser(User user);
    
        int deleteUserById(int id);
    
        int updateUserById(User user);
    
        List<User> selectUser();
    
        User selectUserByNameAndPassword(Map<String, Object> map);
    }
    
  5. 编写 Mapper.xml 配置文件

    编写 UserMapper 接口的 SQL 实现语句。

    <?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="mapper.UserMapper">
    
        <insert id="addUser" parameterType="pojo.User">
            insert into user(id, name, password)
            values (#{id}, #{name}, #{password})
        </insert>
    
        <delete id="deleteUserById" parameterType="int">
            delete
            from user
            where id = #{id}
        </delete>
    
        <update id="updateUserById" parameterType="pojo.User">
            update user
            set name=#{name},
                password = #{password}
            where id = #{id}
        </update>
    
        <select id="selectUser" resultType="pojo.User">
            select *
            from user
        </select>
    
        <select id="selectUserByNameAndPassword" parameterType="map" resultType="pojo.User">
            select *
            from user
            where name = #{name}
              and password = #{password}
        </select>
    
    </mapper>
    
  6. 编写 jdbc.properties 文件

    url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8
    driver=com.mysql.jdbc.Driver
    username=root
    password=123456
    
  7. 编写 MyBatis 核心配置文件

    <?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>
    
        <properties resource="jdbc.properties"/>
    
        <!--环境配置-->
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="${driver}"/>
                    <property name="url" value="${url}"/>
                    <property name="username" value="${username}"/>
                    <property name="password" value="${password}"/>
                </dataSource>
            </environment>
        </environments>
    
        <!--注册 Mapper-->
        <mappers>
            <mapper class="mapper.UserMapper"/>
        </mappers>
    
    </configuration>
    
  8. 编写 MybatisUtils 工具类

    设置 SqlSession 连接,并设置自动提交事务。

    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 MybatisUtils {
    
        /**
         * 通过输入流从 XML 文件中构建 SqlSessionFactory 的实例
         */
        private static SqlSessionFactory sqlSessionFactory;
    
        static {
            try {
                InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 获取 SqlSession 连接,并设置自动提交事务
         *
         * @return SqlSession连接
         */
        public static SqlSession getSession() {
            return sqlSessionFactory.openSession(true);
        }
    
    }
    
  9. 编写测试类

    import lombok.Cleanup;
    import org.apache.ibatis.session.SqlSession;
    import org.junit.Test;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class UserMapperTest {
    
        @Test
        public void addUser() {
            @Cleanup SqlSession sqlSession = MybatisUtils.getSession();
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            int num = userMapper.addUser(new User(3, "tes", "123123"));
            System.out.println(num);
        }
    
        @Test
        public void deleteUserById() {
            @Cleanup SqlSession sqlSession = MybatisUtils.getSession();
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            int num = userMapper.deleteUserById(3);
            System.out.println(num);
        }
    
        @Test
        public void updateUserById() {
            @Cleanup SqlSession sqlSession = MybatisUtils.getSession();
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            int num = userMapper.updateUserById(new User(1, "admin", "123465"));
            System.out.println(num);
        }
    
        @Test
        public void selectUser() {
            @Cleanup SqlSession sqlSession = MybatisUtils.getSession();
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            List<User> userList = userMapper.selectUser();
            for (User user : userList) {
                System.out.println(user);
            }
        }
    
        @Test
        public void selectUserByNameAndPassword() {
            @Cleanup SqlSession sqlSession = MybatisUtils.getSession();
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            Map<String, Object> map = new HashMap<>();
            map.put("name", "test");
            map.put("password", "test");
            User user = userMapper.selectUserByNameAndPassword(map);
            System.out.println(user);
        }
    
    }
    
  10. 运行测试,成功的查询出来的我们的数据,ok!