Mybatis 初步

132 阅读2分钟

什么是 MyBatis?

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

预备知识

  • pojo就是不依赖任何框架的纯java类,例如如果一个类实现了某个框架的某个接口,那么这个类就是框架相关的类了,就不是pojo。
  • dao是data access object,即数据访问对象。数据可能保存到各种数据库,或者各种文件,或者内存。dao层隐藏了这种实现细节,更换数据库或者文件或者内存,对调用dao的更高层来说不受影响。
  • mapper和dao不同,mapper的目的是为了把关系数据库映射成java类(对象)。因此,如果只有mapper没有dao层,那么一旦项目需要把数据保存到文件或者内存,那么调用mapper的高层就会受到影响。

一般的项目可能只会使用数据库作为数据存储,所以mapper和dao可以说上就是一个东西了。

基本步骤

  • 安装 要使用 MyBatis, 只需将 mybatis-x.x.x.jar 文件置于类路径(classpath)中即可。

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

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>x.x.x</version>
</dependency>
  • 创建数据库
CREATE TABLE `people` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(10) NOT NULL,
  `age` int NOT NULL,
  `address` varchar(30) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
  • 创建数据库对应的实体类
public class People {
    private int id;
    private String name;
    private int age;
    private String address;

    public People() {
    }

    public People(int id, String name, int age, String address) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.address = address;
    }

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

    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 getAge() {
        return age;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

  • 在resource目录下创建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/school?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=true&amp;serverTimezone=Asia/Shanghai"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers><!--指定映射器,就是含有sql语句的xml文件-->
        <mapper resource="com/mybatis/DAO/PeopleMapper.xml"/>
    </mappers>
</configuration>

记住在config中要注册mappers

  • 编写PeopleMapper.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.mybatis.DAO.PeopleMapper">
    <select id="getPeopleList" resultType="com.mybatis.pojo.People">
        select * from mybatis.people;
    </select>
</mapper>
  • 编写PeopleMapper.java
public interface PeopleMapper {
    List<People> getPeopleList();
}
  • 编写工具类获取SqlSession(类型JDBC中的Connection)
public class MybatisUtils {
    static String resource = "mybatis-config.xml";
    static InputStream inputStream;
    static SqlSessionFactory sqlSessionFactory;

   static {
        try {
            inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
   }
   public static SqlSession getSqlSession(){
       return sqlSessionFactory.openSession();
    }
}
  • 配置pom.xml
<dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.22</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.6</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
        </dependency>

    </dependencies>

    <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>

要记住在pom.xml中include资源,不然main中的xml文件无法加载

  • 编写测试类
public class PeopleDAOtest {
    @Test
    public void test() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        PeopleMapper peopleMapper = sqlSession.getMapper(PeopleMapper.class);
        List<People> people = peopleMapper.getPeopleList();
        for (People p :people){
            System.out.println(p);
        }
        sqlSession.close();
    }
}
  • 结果

  • 项目结构图