一、Mybatis简介

1、什么是MyBatis?

  1. MyBatis 是一款优秀的持久层框架。
  2. 它支持自定义 SQL、存储过程以及高级映射。
  3. MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
  4. MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
  5. MyBatis本是apach的一个开源项目iBatis,2010年这个项目有apache softWare foundation迁移到了google code,并且改名为MyBatis。
  6. 2013年11月迁移到了Github。

2、如何获得MyBatis?

  • Maven仓库 ```html org.mybatis mybatis 3.5.2
  1. - Github
  2. - 中文文档
  3. <a name="Q6VLg"></a>
  4. ## 3、持久化
  5. **数据持久化**
  6. - 持久化就是将程序的数据在持久状态和瞬时状态转化的过程。
  7. - 内存特点:断电即失
  8. - 数据持久化·的方式:数据库(jdbc),io文件持久化。
  9. **为什么需要持久化?**
  10. - 有一些对象,不能让他丢掉。
  11. - 内存太贵了。
  12. <a name="Hzboi"></a>
  13. ## 4、持久层
  14. Dao层,Service层,Controller层...
  15. - 完成持久化工作的代码块。
  16. - 层界限十分明显。
  17. <a name="ORass"></a>
  18. # 二、我的第一个Mybatis程序
  19. <a name="N7zSv"></a>
  20. ## 1、创建数据库
  21. ```plsql
  22. CREATE DATABASE `mybatis`; -- 创建数据库
  23. DROP TABLE IF EXISTS `user`; -- 创建user表
  24. CREATE TABLE `user` (
  25. `id` int(11) NOT NULL AUTO_INCREMENT,
  26. `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  27. `pwd` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  28. PRIMARY KEY (`id`) USING BTREE
  29. ) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
  30. -- 插入数据
  31. INSERT INTO `user` VALUES (1, '张三', '123');
  32. INSERT INTO `user` VALUES (2, '李四', '456');
  33. INSERT INTO `user` VALUES (3, '王五', '789');
  34. SET FOREIGN_KEY_CHECKS = 1;

2、创建Maven工程,导入坐标

<!--导入依赖-->
<dependencies>
    <!--导入mysql驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>

    <!--mybatis-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.2</version>
    </dependency>

    <!--junit-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>

3、编写Mybatis核心配置文件

在resources里面创建一个配置文件,后缀名为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.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL&amp;
                useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
       <mapper resource="mapper/UserMapper.xml"></mapper>
    </mappers>
</configuration>

4、编写mybatis工具类

package utils;


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;

//sqlSessionFactory --> sqlSession
public class MybatisUtils {

    //提升一下作用域
    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            //使用Mybatis第一步:获取slqSession对象
            String resource="mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
    // SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句
    public static SqlSession getSqlSession(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        return sqlSession;
    }
}

5、编写代码

5.1、实体类

package domain;

public class User {
    private int id;
    private String name;
    private String pwd;

    public int getId() {
        return id;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public User() {
    }

    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }
}

5.2、Dao接口

package dao;
import domain.User;
import java.util.List;

public interface UserDao {
    public List<User> getUserList();
}

5.3、编写Mapper配置文件

接口类由原来的UserDaoImpl转变为一个Mapper配置文件

<?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">
<!--namespace:绑定一个对应的Dao/Mapper接口-->
<mapper namespace="dao.UserDao">
    <!--select查询语句-->
   <select id="getUserList" resultType="domain.User">  <!--resultType:写全包名-->
       select *from mybatis.user;
   </select>
</mapper>

6、测试

6.1、注意点

org.apache.ibatis.binding.BindingException: Type interface dao.UserDao is not known to the MapperRegistry.

MapperRegistry是什么?
意思就是要在核心配置文件中注册mappers
Snipaste_2021-07-10_17-56-16.jpg

还会报一个 java.lang.ExceptionInInitializerError
需要在pom.xml中添加,注意,千万不能有中文注释

<!-- 在build中配置resources,来防止我们资源导入失败的问题-->
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>

            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>

6.2、Junits

import domain.User;
import mapper.UserMapper;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import utils.MybatisUtils;

import java.util.List;

public class test {
    @Test
    public void test(){
        //获取SqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        //执行sql
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = mapper.getUserList();
        for (User user : userList) {
            System.out.println(user);
        }

        //关闭资源
        sqlSession.close();
    }
}