写在前面

最近觉得之前学习SSM(Spring/Spring MVC/Mybatis)框架的过程过于急功近利,目的性太强,知其然不知其所以然,所以导致不少内容都忘记了,所以打算重新学习一遍,并将学习过程以笔记的形式发到博客上来。

本系列笔记代码可以从下面拿到:

此处内容需要评论回复后(审核通过)方可阅读。

Mybatis简介

mybatis-logo.png
官方介绍:

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

官方文档:https://mybatis.org/mybatis-3/zh/index.html

总结:

  1. Mybatis是一个Java持久化框架
  2. Mybatis通过XML描述符或注解把对象与存储过程或SQL语句关联起来

什么是持久层

所谓"持久"就是将数据保存到可掉电式存储设备中以便今后使用,简单的说,就是将内存中的数据保存到关系型数据库、文件系统、消息队列等提供持久化支持的设备中。持久层就是系统中专注于实现数据持久化的相对独立的层面。

简单来讲,持久层就是负责数据持久化的代码层级,持久化就是将内存中的数据(对象)保存到数据库中的过程。

为什么要使用Mybatis

  1. Mybatis用的人多(逃),MyBatis其实只是在国内和日韩等地区用的人比较多
  2. Mybatis是一个是一个半自动化的ORM框架,相对于全自动ORM框架(如Hibernate)更加灵活,编码人员可以直接编写SQL语句。
  3. Mybatis简单易学且比较灵活
  4. Mybatis可以解除程序代码与SQL语句的耦合,实现SQL和程序代码的分离,提高了可维护性

谷歌趋势Mybatis/Hibernate/Spring Data JPA按区域比较细分数据

第一个Mybatis程序

1. 创建实验数据库

CREATE DATABASE `mybatis`;
USE `mybatis`;

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) DEFAULT NULL,
  `password` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO user (username, password)
VALUES 
    ("user001", "pass001"),
    ("user002", "pass002"),
    ("user003", "pass003");

2. 创建项目导入Maven依赖

  <dependencies>
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.19</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.4</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

3. 编写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="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8&amp;serverTimezone=Asia/Shanghai"/>
                <property name="username" value="root"/>
                <property name="password" value="******"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>

    </mappers>
</configuration>

4. 创建实体类

public class User {
    private int id;
    private String username;
    private String password;

    public User() {
    }

    public User(int id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }

    public int getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

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

}

5. 编写Mapper接口类

public interface UserMapper {
    /**
     * 获取所有用户
     * @return 用户集合
     */
    List<User> getAllUser();
}

6. 编写Mapper.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sstype.mybatis.mapper.UserMapper">
    <select id="getAllUser" resultType="com.sstype.mybatis.pojo.User">
        select id,username,password from user
    </select>
</mapper>

7. 在核心配置文件注册Mapper

<mappers>
    <mapper resource="com/sstype/mybatis/mapper/UserMapper.xml" />
</mappers>

8. 编写测试类

public class UserMapperTest {
    @Test
    public void getAllUser() throws IOException {
        //构建 SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        
        //获取 SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取 Mapper
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //查询
        List<User> users = mapper.getAllUser();
        for (User user : users) {
            System.out.println(user);
        }
        //关闭连接
        sqlSession.close();
    }
}

9. 编写Mybatis工具类优化代码

工具类:

public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory;

    /**
     * 获取SqlSession
     */
    public static SqlSession getSession(){
        if (sqlSessionFactory == null){
            //构建 SqlSessionFactory
            String resource = "mybatis-config.xml";
            InputStream inputStream = null;
            try {
                inputStream = Resources.getResourceAsStream(resource);
            } catch (IOException e) {
                e.printStackTrace();
            }
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        }
        return sqlSessionFactory.openSession();

    }
}

优化后的测试类:

public class UserMapperTest {
    @Test
    public void getAllUser() {
        //获取 SqlSession
        SqlSession sqlSession = MybatisUtils.getSession();
        //获取 Mapper
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //查询
        List<User> users = mapper.getAllUser();
        for (User user : users) {
            System.out.println(user);
        }
        //关闭连接
        sqlSession.close();
    }
}
Last modification:February 18th, 2020 at 10:46 pm
如果觉得我的文章对你有用,请随意赞赏