MyBatis初体验

112 阅读6分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情

1. 什么是MyBatis

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

上面这段话是来自于MyBatis官网的对MyBatis的介绍,大家轻微的看看就行,然后后续慢慢理解这段话。

2. 安装MyBatis

如果使用 Maven 来构建项目,则需将下面的依赖代码置于 pom.xml 文件中:

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>x.x.x</version> 这了是你想使用的版本
</dependency>

如果是其他方式,那就去下载jar包,然后导包就可以了

3. 首次尝试

3.1 数据库准备

在MySql上创建一个数据库,同时创建一个表,自己写自己能想到的,顺便联系一下sql语句,下面是我的表结构 在这里插入图片描述

3.2 创建一个Maven项目

这个我有一篇博客写了,大家也可以根据自己的idea版本上网查找相应的创建方式 在这里插入图片描述

3.3 导入依赖

这一步所在的目录: 在这里插入图片描述

必须导入的两个依赖:数据库驱动依赖、MyBatis依赖

<!--MySql驱动,或者你使用的数据库驱动-->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>5.1.46</version>
</dependency>

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

可选择的依赖:lombok 和 junit(junit最好也选择) 下面是我的依赖配置,可以直接复制

    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
        </dependency>
    </dependencies>

3.4 编写核心配置文件

这一步所在的目录 在这里插入图片描述

src/main/resources目录下创建一个mybatis-config.xml文件,里面编写(是从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>
  <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>
  
  <!--这个mappers可以暂时不管-->
  <mappers>
    <mapper resource="org/mybatis/example/BlogMapper.xml"/>
  </mappers>
</configuration>

核心配置文件标签解读 <configuration> :配置,这里面全是配置内容

<environments>:环境,复数,里面可以有一个及一个以上的环境配置 ,default 是默认使用哪个环境

<environment> :环境的具体内容id是环境的标识(我是这样理解的)

<transactionManager>:事务管理,上面使用的是jdbc的事务管理

<dataSource>:数据源,这个和数据库连接是一个意思,后面的跟的四个参数也是一样的

根据上述模板来编写我的核心配置文件

<?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/shea_school?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=GMT"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

3.5编写MyBatis工具类

这一步所在的目录 在这里插入图片描述

每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。 上面这段话是官网的入门《从 XML 中构建 SqlSessionFactory》的第一段话,来仔细缕一缕这句话: 1.要使用MyBatis需要一个SqlSessionFactory实例 2.这个实例可以通过SqlSessionFactoryBuilder获得 3.SqlSessionFactoryBuilder可以从XML配置文件中构建一个SqlSessionFactory

那我们反过来一下:首先我们写好了一个XML文件,这是没有问题的。然后SqlSessionFactoryBuilder可以通过我们编写的XML配置文件,来构建SqlSessionFactory 那我们使用编程语句来翻译这句话就是

//这是我们预先编写好的XML配置文件,并把它转换成输入流
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//这里是SqlSessionFactoryBuilder使用XML来构建(build)sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

去掉注解就是官网给我们的三句话,这三句话是固定的,我们可以将这个写成一个工具类 工具类的编写代码

package com.shea.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;

public class MyBatisUtils {
    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }
}

注意: 不要抄这段代码!自己去写,问问自己为什么这样写?如果不知道那你就要补习一下java基础咯,static的特性还记得吗?

3.6 编写POJO实体类

本步骤所在目录 在这里插入图片描述

实体类,这个也是java的一个基础概念,打个比方,这个实体类是一个学生,那这个类里面要包含学生的属性,里面提供getter和setter方法。这里我们编写实体类,类中的属性就要和上述创建的数据表属性一一对应,编写的代码如下

package com.shea.pojo;

import lombok.*;

@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Student {
    private int id;
    private String name;
    private int score;
    private int age;
    private int gender;
}

如果你没有安装Lombok那,去掉注解,加上getter、setter、构造、tostring这些方法,belike.(这里其实有点废话了)

package com.shea.pojo;
public class Student {
    private int id;
    private String name;
    private int score;
    private int age;
    private int gender;
    
    public Student(){}

    public Student(int id, String name, int score, int age, int gender) {
        this.id = id;
        this.name = name;
        this.score = score;
        this.age = age;
        this.gender = gender;
    }

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getGender() {
        return gender;
    }

    public void setGender(int gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", score=" + score +
                ", age=" + age +
                ", gender=" + gender +
                '}';
    }
}

3.7 编写Mapper接口

所在的操作目录 在这里插入图片描述

初次尝试,我们就将学生的全部信息打印出来就可以了,编写如下

package com.shea.mapper;

import com.shea.pojo.Student;

import java.util.List;

public interface StudentMapper {
   List<Student> getStudent();
}

3.8 SQL语句映射

这里暂时只写使用mapper.xml 我们在官网中可以看到一个mapper.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="org.mybatis.example.BlogMapper">
  <select id="selectBlog" resultType="Blog">
    select * from Blog where id = #{id}
  </select>
</mapper>

先解释一下标签内容 mapper就是映射咯,变量namespace就是你要相应绑定的接口,或者类,这里我们绑定我们的Mapper接口,这个是很重要的! select这个标签就是选择标签,这个标签可以选择的有insert delete等,可以自己去编译器里查看id对应我们前面写的方法名,resultType就是返回类型,sql语句执行的返回值。这里我们返回Student,但是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.shea.mapper.StudentMapper">
<select id="getStudent" resultType="com.shea.pojo.Student">
    select * from student
  </select>
</mapper>

写完以后记得在核心配置文件mybatis-config.xml中添加 src是和路径相关的,不同的地方路径不一样,放相对路径 我的目录结构: 在这里插入图片描述

<mappers>
        <mapper resource="student-mapper.xml"/>
</mappers>

进行注册,不然会报错:org.apache.ibatis.binding.BindingException: Type interface com.shea.mapper.StudentMapper is not known to the MapperRegistry.

<?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/shea_school?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=GMT"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="student-mapper.xml"/>
    </mappers>
</configuration>    

3.9 测试

在这里插入图片描述 在这里编写测试文件

package com.shea.mapper;

import com.shea.pojo.Student;
import com.shea.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class StudentMapperTest {
    @Test
    public void test(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        
        StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
        List<Student> students =  studentMapper.getStudent();

        for (Student student : students) {
            System.out.println(student);
        }
        sqlSession.close();
    }
}

然后点击运行就通过了

3.10 可能出现的其他错误

初始化异常错误 在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>true</filtering>
        </resource>
    </resources>
</build>

还有可能出现其他错误,大家这个时候就要先解决自己理解的异常,再使用搜索引擎搜索。

完成以后,初次体验也结束了,可能你会觉得很麻烦,但也就开头难一点,后面写代码就会非常轻松咯!