0%

Mybaits-入门(一)

前言

学完 JDBC 后,其实很多时候我们项目开发中不会直接使用 JDBC,而是会用到一些更好的第三方封装库,Mybatis 就是第三方库中使用人数最多,口碑最好的一个存在。为了快速上手,当然是盘它吖。

搭建 MySQL 数据库相关的表环境

  • 搭建数据库,并创建数据
1
-- 创建数据库
2
CREATE DATABASE IF NOT EXISTS `mybatis` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
3
4
-- 使用数据库
5
USE `mybatis`;
6
7
-- 创建users表
8
CREATE TABLE `users` (
9
  `id` int(20) unsigned NOT NULL AUTO_INCREMENT,
10
  `name` varchar(64) NOT NULL,
11
  `password` varchar(64) NOT NULL,
12
  PRIMARY KEY (`id`)
13
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
14
15
-- 插入数据库
16
INSERT INTO `users` (`name`, `password`) VALUES ('鱼不浪', '666666');
17
INSERT INTO `users` (`name`, `password`) VALUES ('鲁班', '666666');
18
INSERT INTO `users` (`name`, `password`) VALUES ('西施', '666666');
19
INSERT INTO `users` (`name`, `password`) VALUES ('麦特凯', '666666');
  • 新建普通的 maven 项目为mybatis-study,删除 src 目录,使他成为一个父项目
  • 在父项目的 pom.xml 中放入以下依赖
1
<?xml version="1.0" encoding="UTF-8"?>
2
<project xmlns="http://maven.apache.org/POM/4.0.0"
3
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5
    <modelVersion>4.0.0</modelVersion>
6
7
    <groupId>org.example</groupId>
8
    <artifactId>mybatis-study</artifactId>
9
    <version>1.0-SNAPSHOT</version>
10
11
    <!-- 导入依赖 -->
12
    <dependencies>
13
        <!-- mysql 驱动 -->
14
        <dependency>
15
            <groupId>mysql</groupId>
16
            <artifactId>mysql-connector-java</artifactId>
17
            <version>5.1.48</version>
18
        </dependency>
19
20
        <!-- mybatis -->
21
        <dependency>
22
            <groupId>org.mybatis</groupId>
23
            <artifactId>mybatis</artifactId>
24
            <version>3.5.4</version>
25
        </dependency>
26
27
        <!-- junit -->
28
        <dependency>
29
            <groupId>junit</groupId>
30
            <artifactId>junit</artifactId>
31
            <version>4.13</version>
32
        </dependency>
33
    </dependencies>
34
</project>
  • 创建名为 mybatis-01 的子项目,并进入src/main/resources 目录,创建一个mybatis-config.xml的文件,并输入以下配置
1
<?xml version="1.0" encoding="UTF-8" ?>
2
<!DOCTYPE configuration
3
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
4
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
5
<!-- 核心配置文件 -->
6
<configuration>
7
    <!-- 多个开发环境配置 -->
8
    <environments default="development">
9
        <environment id="development">
10
            <!-- 事务管理 -->
11
            <transactionManager type="JDBC"/>
12
13
            <dataSource type="POOLED">
14
                <property name="driver" value="com.mysql.jdbc.Driver"/>
15
                <property name="url"
16
                          value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8&amp;serverTimezone=Hongkong"/>
17
                <property name="username" value="root"/>
18
                <property name="password" value=""/>
19
            </dataSource>
20
        </environment>
21
    </environments>
22
</configuration>
  • 编写 Mybatis 工具类

    创建com.yubulang.utils包,在里面创建MybatisUtils.java工具类,然后输入以下代码

1
package com.yubulang.utils;
2
3
import org.apache.ibatis.io.Resources;
4
import org.apache.ibatis.session.SqlSession;
5
import org.apache.ibatis.session.SqlSessionFactory;
6
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
7
8
import java.io.IOException;
9
import java.io.InputStream;
10
11
// sqlSessionFactory 用来构造 sqlSession
12
public class MybatisUtils {
13
14
    private static SqlSessionFactory sqlSessionFactory;
15
16
    static {
17
        // 这里是固定搭配写一次就OJBK了
18
        try {
19
            // 使用mybatis第一步:获取我们的 sqlSessionFactory 对象
20
            String resource = "mybatis-config.xml";
21
            InputStream in = Resources.getResourceAsStream(resource);
22
23
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
24
        } catch (IOException e) {
25
            e.printStackTrace();
26
        }
27
    }
28
29
    /**
30
     * 既然有了sqlSessionFactory,我们可以通过它获取一个 SqlSession
31
     *
32
     * @return SqlSession
33
     */
34
    public static SqlSession getSqlSession() {
35
        return sqlSessionFactory.openSession();
36
    }
37
}

编写代码操作数据库

  • 实体类:我们创建 com.yubulang.pojo.User.java 这个实体类
1
package com.yubulang.pojo;
2
3
/**
4
 * 实体类
5
 */
6
public class User {
7
    private int id;
8
    private String name;
9
    private String password;
10
11
    public User() {
12
    }
13
14
    public User(int id, String name, String password) {
15
        this.id = id;
16
        this.name = name;
17
        this.password = password;
18
    }
19
20
    public int getId() {
21
        return id;
22
    }
23
24
    public void setId(int id) {
25
        this.id = id;
26
    }
27
28
    public String getName() {
29
        return name;
30
    }
31
32
    public void setName(String name) {
33
        this.name = name;
34
    }
35
36
    public String getPassword() {
37
        return password;
38
    }
39
40
    public void setPassword(String password) {
41
        this.password = password;
42
    }
43
44
    @Override
45
    public String toString() {
46
        return "User{" +
47
                "id=" + id +
48
                ", name='" + name + '\'' +
49
                ", password='" + password + '\'' +
50
                '}';
51
    }
52
}
  • Dao/Mapper 接口(其实可以理解成为 Dao 层)
1
package com.yubulang.dao;
2
3
import com.yubulang.pojo.User;
4
5
import java.util.List;
6
7
public interface UserMapper {
8
    List<User> getUserList();
9
}
  • 接口实现类,我们在 Mybatis 这里,由原来的UserDaoImpl.java直接用xml文件代替,com.yubulang.dao包下创建UserMapper.xml
1
<?xml version="1.0" encoding="UTF-8" ?>
2
<!DOCTYPE mapper
3
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
4
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
5
6
<!-- 绑定一个指定的Dao/Mapper接口 -->
7
<mapper namespace="com.yubulang.dao.UserMapper">
8
    <!-- 查询语句, id对应UserMapper接口中的方法名 -->
9
    <!-- resultType 返回类型:要填写全类型名 -->
10
    <select id="getUserList" resultType="com.yubulang.pojo.User">
11
        select * from users
12
    </select>
13
</mapper>

测试上面的代码

我们使用junit测试,在 maven 项目中 main 同级的有一个 test 文件夹,我们尽量让我们的测试文件,与我们的 main 包中的结构相同。

我们键入以下测试代码:

1
package com.yubulang.dao;
2
3
import com.yubulang.pojo.User;
4
import com.yubulang.utils.MybatisUtils;
5
import org.apache.ibatis.session.SqlSession;
6
import org.junit.Test;
7
8
import java.util.List;
9
10
public class UserMapperTest {
11
    @Test
12
    public void test() {
13
        // 第一步:获得SqlSession对象
14
        SqlSession sqlSession = MybatisUtils.getSqlSession();
15
16
        // 执行SQL
17
        // 方式一:getMapper
18
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
19
        List<User> userList = mapper.getUserList();
20
        for (User user : userList) {
21
            System.out.println(user);
22
        }
23
24
        System.out.println("============================================");
25
26
        // 方式二:旧的一种方式不太推荐
27
        List<User> userList2 = sqlSession.selectList("com.yubulang.dao.UserMapper.getUserList");
28
        for (User user : userList2) {
29
            System.out.println(user);
30
        }
31
32
        // 关闭SqlSession
33
        sqlSession.close();
34
    }
35
}

注意这里的报错信息:

1
org.apache.ibatis.binding.BindingException: Type interface com.yubulang.dao.UserMapper is not known to the MapperRegistry.

在这里我们会接触到一个新的概念就是MapperRegistry。这是因为我们在当初配置mybatis-config.xml的时候没有配置对应的<mappers>,我们将对应的 mapper 配置加入到mybatis-config.xml中,然后启动测试test()

1
<?xml version="1.0" encoding="UTF-8" ?>
2
<!DOCTYPE configuration
3
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
4
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
5
<!-- 核心配置文件 -->
6
<configuration>
7
    <!-- 多个开发环境配置 -->
8
    <environments default="development">
9
        <environment id="development">
10
            <!-- 事务管理 -->
11
            <transactionManager type="JDBC"/>
12
13
            <dataSource type="POOLED">
14
                <property name="driver" value="com.mysql.jdbc.Driver"/>
15
                <property name="url"
16
                          value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8&amp;serverTimezone=Hongkong"/>
17
                <property name="username" value="root"/>
18
                <property name="password" value=""/>
19
            </dataSource>
20
        </environment>
21
    </environments>
22
23
    <!-- 每一个Mapper.xml都需要在mybatis核心配置文件中注册-->
24
    <mappers>
25
        <mapper resource="com/yubulang/dao/UserMapper.xml"/>
26
    </mappers>
27
</configuration>

启动运行,我们则发现我擦,报错了。说没有办法找到我们的Could not find resource com/yubulang/dao/UserMapper.xml这个文件,这是因为 maven 的过滤机制导致的,我们可以修改pom.xml配置,让他支持我们的 xml 文件可以被编译到我们的 class 中去。

1
<?xml version="1.0" encoding="UTF-8"?>
2
<project xmlns="http://maven.apache.org/POM/4.0.0"
3
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5
    <parent>
6
        <artifactId>mybatis-study</artifactId>
7
        <groupId>org.example</groupId>
8
        <version>1.0-SNAPSHOT</version>
9
    </parent>
10
    <modelVersion>4.0.0</modelVersion>
11
12
    <artifactId>mybatis-01</artifactId>
13
14
    <!-- 在build中配置resource,来防止我们资源导出失败的问题 -->
15
    <build>
16
        <resources>
17
            <resource>
18
                <directory>src/main/resources</directory>
19
                <includes>
20
                    <include>**/*.properties</include>
21
                    <include>**/*.xml</include>
22
                </includes>
23
                <filtering>true</filtering>
24
            </resource>
25
26
            <resource>
27
                <directory>src/main/java</directory>
28
                <includes>
29
                    <include>**/*.properties</include>
30
                    <include>**/*.xml</include>
31
                </includes>
32
                <filtering>true</filtering>
33
            </resource>
34
        </resources>
35
    </build>
36
</project>

再次点击运行测试,就能正常跑起来了。

总结

有了 Mybatis 后,我们的数据查询操作基本就在xml实现,我们单独维护起来也更加方便。可以说提高了我们不少的生产力。当然这里只是入门的操作,我们更多的操作还要去实践应用。一定要多动手,不要怕出错!