0%

MyBatis入门

什么是MyBatis

在弄清楚什么是MyBatis之前,我们首先要搞清楚两个概念:什么是持久化?什么是持久层?

持久化(Persistence)

持久化是将程序数据在持久状态和瞬时状态间转换的机制。通俗的讲,就是瞬时数据(比如内存中的数据,是不能永久保存的)持久化为持久数据(比如持久化至数据库中,能够长久保存)。

通常来说临时数据就是我们储存在内存里面的数据,而内存的数据无法永久的保存,一旦断电数据就会丢失。这些数据又非常的重要,例如我们的用户信息,订单信息等。持久化就是要将这些临时数据永久的保存下来。

而持久化的方法有很多,在通常的开发中,我们可以将其保存到数据库或是通过IO将其保存到文件内。

持久层

在Java开发中,通常会把一个项目分为持久层、业务层和表现层。

表现层基于业务层所提供的接口,实现了一定的页面展示、请求的接收与分发;而业务层又通过持久层所提供的接口,实现了一定的业务逻辑操作;而持久层则是将业务层中的一些重要数据永久的保存下来,并在需要的时候将它们读取出来,并以一定的形式返回到业务层中。

在这里额外拓展一下DAO与DAL的区别:

  • DAO(Data Access Object)侧重ORM对象关系映射,DAO曾往往提供的是ORM操作。
  • DAL(Data Access Layer)多用于分布式系统
  • 分布式系统提供水平伸缩能力,应用层水平扩展后,会使数据库连接资源相对较少成为瓶颈,此时需要对数据库分库、分表,DAL要求支持透明分库分表,DAL层提供的往往是SQL

我个人理解则是DAO侧重于对象与持久数据关系映射,在所使用过的工具里,我觉得Django框架对数据的操作非常符合这一个描述,我几乎不选要考虑SQL语句。而DAL侧重于灵活性,可以自定义所需要的SQL语句,当然这需要对SQL以及数据库有一定的基础。

MyBatis

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

在官方文档的简介中已经有了说明,MyBatis 是一款优秀的持久层框架,支持自定义 SQL、存储过程以及高级映射。且MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。这将大大地提高了我们的工作效率,同时也避免了使用 JDBC 不当导致的大量冗余的代码,不仅影响效率,也使代码整体看起来不够美观。

MyBatis的初步使用

在使用MyBatis之前,我们需要做一些准备工作。

环境搭建

在这里先列出我使用的一些主要的环境

  • JDK1.8
  • MySQL 8.0.12
  • maven 3.6.3
  • IDEA 2020.1.2

数据库的搭建:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE DATABASE `mybatis`;

USE `mybatis`;

CREATE TABLE `user`(
`id` INT(20) NOT NULL PRIMARY KEY,
`name` VARCHAR(30) DEFAULT NULL,
`pwd` VARCHAR(30) DEFAULT NULL
)ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO `user`(`id`,`name`,`pwd`) VALUES
(1,'狂神','123456'),
(2,'张三','123456'),
(3,'李四','123890')

获取MyBatis

使用IDEA创建一个普通的maven项目,把MyBatis的依赖添加进去:

1
2
3
4
5
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>

另外也可以从GitHub上获取到MyBatis,下载jar包并添加到项目lib中:

下面列举出我自己的Demo项目所依赖的文件供大家参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>

第一个MyBatis程序

环境的工作准备好后就可以逐步来构造我们的第一个MyBatis程序了。

MyBatis的核心配置

resource文件夹下新建一个xml配置文件,命名为mybatis-config.xml,并往文件内填充以下内容,并修改你的数据库连接信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=Asia/Shanghai"/>
<property name="username" value="enter your username"/>
<property name="password" value="enter your password"/>
</dataSource>
</environment>
</environments>
</configuration>

编写MyBatis工具类

新建一个MyBatis工具类,以方便我们后续的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MyBatisUtils {
private static SqlSessionFactory sqlSessionFactory = null;

static {
//获取Mybatis的SqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}

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

在这对该工具类做一点解释:

  • resource的内容为我们上一个步骤所创建的核心配置文件的地址,因为我们将其放在了resource根目录下,故只需要填入它的文件名就可以了
  • 通过getResourceAsStream方法获取到输入流,并将其作为参数传入到SqlSessionFactoryBuilder
  • 框架内会通过XMLConfigBuilder解析到配置文件的内容,并生成一个Configuration对象
  • 框架最后则将sqlSessionFactory返回

具体代码的编写

  1. 首先编写一个实体类

    1
    2
    3
    4
    5
    6
    7
    8
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class User {
    private int id;
    private String name;
    private String pwd;
    }

    这里使用lombok偷一下懒,用它来生成一些Getter、Setter、Constructor、toString等方法,当然,在正式的项目里还是不建议大家使用的

  2. Mapper接口

    1
    2
    3
    public interface UserMapper {
    List<User> getUserList();
    }
  3. Mapper配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?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.hpjpw.dao.UserMapper">
    <select id="getUserList" resultType="com.hpjpw.pojo.User">
    select *
    from mybatis.user;
    </select>
    </mapper>
  4. mybatis-config.xml注册Mapper配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    <configuration>
    <environments default="development">
    ……
    </environments>
    <mappers>
    <mapper resource="com/hpjpw/dao/UserMapper.xml"/>
    </mappers>
    </configuration>
  5. 测试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    try (SqlSession sqlSession = MyBatisUtils.getSqlSession()) {
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    List<User> userList = userMapper.getUserList();
    for (User user : userList) {
    System.out.println(user);
    }
    } catch (Exception e) {
    e.printStackTrace();
    }

    输出:

    1
    2
    3
    User{id=1, name='狂神', pwd='123456'}
    User{id=2, name='张三', pwd='123456'}
    User{id=3, name='李四', pwd='123890'}

    在测试中,我们使用getMapper方法获取到UserMapper类的对象,并调用其getUserList方法获取到了User的列表

  6. 总结

    1. 在第三步的Mapper配置文件中的namespace需要与你的Mapper接口类的完整包名相同,否则有可能会出现错误
    2. 若跳过第四步,则框架会提示你所用到的UserMapper没有注册,且抛出异常,停止执行。

CURD

select

选择,查询语句;

  • id : 就是对应的namespace中的方法名;
  • resultType:Sql语句执行的返回值!
  • parameterType : 参数类型!

未完待续

……

感谢

感谢BiliBili的UP主【遇见狂神说】所录制的MyBatis教程,讲解的非常细致,个人感觉比黑马的视频教程好多了,在这里安利给大家:【狂神说Java】Mybatis最新完整教程IDEA版通俗易懂

本篇文章是基于该视频教程,结合我自己的理解,把一些重点的内容展现出来,希望可以帮助到需要的小伙伴。

参考资料