天天看点

Mybatis工作流程,附带mybatis的mapper文件和config配置文件模板。mapper文件和dao接口的关系——xml中的namespace和sql标签id命名要求。

1. Mybatis工作流程

1.1 使用MySQL创建数据库girls并生成一个表boys,如下图。

Mybatis工作流程,附带mybatis的mapper文件和config配置文件模板。mapper文件和dao接口的关系——xml中的namespace和sql标签id命名要求。

1.2 创建该表对应的简单实体类Boys,如下图。

Mybatis工作流程,附带mybatis的mapper文件和config配置文件模板。mapper文件和dao接口的关系——xml中的namespace和sql标签id命名要求。

1.3 创建Dao接口以及和接口同名的mapper文件xxxDao.xml,我这边是StudentDao接口和StudentDao.xml文件,具体结构和内容如下图。

Mybatis工作流程,附带mybatis的mapper文件和config配置文件模板。mapper文件和dao接口的关系——xml中的namespace和sql标签id命名要求。
Mybatis工作流程,附带mybatis的mapper文件和config配置文件模板。mapper文件和dao接口的关系——xml中的namespace和sql标签id命名要求。
<?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="a">
    <select id="b" resultType="org.example.domain.Boys">
        select id, boyName from boys
    </select>
</mapper>
           

1.4 在resources资源目录下编写mybatis的主配置文件——mybatis.xml

Mybatis工作流程,附带mybatis的mapper文件和config配置文件模板。mapper文件和dao接口的关系——xml中的namespace和sql标签id命名要求。
Mybatis工作流程,附带mybatis的mapper文件和config配置文件模板。mapper文件和dao接口的关系——xml中的namespace和sql标签id命名要求。
<?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="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/girls"/>
                <property name="username" value="root"/>
                <property name="password" value="123"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <package name="org.example.dao"/>
    </mappers>
</configuration>
           

1.5 pom.xml文件配置mybatis和mysql驱动依赖

Mybatis工作流程,附带mybatis的mapper文件和config配置文件模板。mapper文件和dao接口的关系——xml中的namespace和sql标签id命名要求。
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>SpringMybatis</artifactId>
  <version>1.0-SNAPSHOT</version>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>15.0</maven.compiler.source>
    <maven.compiler.target>15.0</maven.compiler.target>
  </properties>

  <dependencies>
    <!-- 单元测试 -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <!--mybatis依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.1</version>
    </dependency>
    <!--mysql驱动-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.9</version>
    </dependency>
  </dependencies>

  <build>
    <resources>
      <!--避免xml等配置文件不能参与编译,程序运行没有配置信息-->
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
      </resource>
    </resources>
  </build>
</project>
           

1.6 编写测试类,连接数据库并查询

Mybatis工作流程,附带mybatis的mapper文件和config配置文件模板。mapper文件和dao接口的关系——xml中的namespace和sql标签id命名要求。

总结:mybatis工作流程总结(没有严格的顺序):①数据库创建库、表;②java中创建数据库表所对应的实体类;③编写Dao接口以及mapper文件xxxDao.xml;④编写mybatis主配置文件配置数据库连接以及mapper文件所在包;⑤pom.xml文件配置mybatis和数据库驱动依赖;⑥编写测试类,通过sqlSession和数据库连接并执行sql语句。

2. mapper文件和dao接口的关系——mapper文件xx.xml中的namespace和sql标签id命名要求

经过上面的mybatis访问数据库流程,不知道你是否有所疑惑,反正我是有的。既然sqlSession需要的是mapper文件的namespace和sql语句标签id,那么Dao接口的作用是啥呢??当我尝试把dao接口名和方法名改掉,依然正常运行,如下图。

Mybatis工作流程,附带mybatis的mapper文件和config配置文件模板。mapper文件和dao接口的关系——xml中的namespace和sql标签id命名要求。
Mybatis工作流程,附带mybatis的mapper文件和config配置文件模板。mapper文件和dao接口的关系——xml中的namespace和sql标签id命名要求。
Mybatis工作流程,附带mybatis的mapper文件和config配置文件模板。mapper文件和dao接口的关系——xml中的namespace和sql标签id命名要求。

当我把接口删除,程序依然正常运行,如下图。

Mybatis工作流程,附带mybatis的mapper文件和config配置文件模板。mapper文件和dao接口的关系——xml中的namespace和sql标签id命名要求。

以上的操作都是在mybatis文件中的mappers标签使用<mapper>进行,如下图。

Mybatis工作流程,附带mybatis的mapper文件和config配置文件模板。mapper文件和dao接口的关系——xml中的namespace和sql标签id命名要求。

现在我在mappers中使用<package>标签,尝试上述操作报错,如下图。

Mybatis工作流程,附带mybatis的mapper文件和config配置文件模板。mapper文件和dao接口的关系——xml中的namespace和sql标签id命名要求。
Mybatis工作流程,附带mybatis的mapper文件和config配置文件模板。mapper文件和dao接口的关系——xml中的namespace和sql标签id命名要求。

总结:在自己手动使用sqlSession操作数据库的情况下,mapper文件和dao接口的关系。如果mybatis配置文件中的<mappers>标签使用<mapper>一个一个指定xml文件,可以不需要dao接口,而且xml中的namespace和sql标签id可以随意;如果<mappers>标签使用<package>指定dao包下的xml文件,那么xml中的namespace值必须和dao接口名一致,但sql标签id不一定要和接口的方法名一致。因此,推荐xml文件中的namespace和sql标签id和dao接口名和方法名一致。

Mybatis工作流程,附带mybatis的mapper文件和config配置文件模板。mapper文件和dao接口的关系——xml中的namespace和sql标签id命名要求。

3. 常见问题

常见问题1:Mapped Statements collection does not contain value for xxx.xxx.

解决:根据提示,我们可知这个问题和mapper文件相关;可能是sqlSession使用的sqlId和mapper文件的namespace、标签id不一致;更可能是mapper文件没有参与编译,如下图。

Mybatis工作流程,附带mybatis的mapper文件和config配置文件模板。mapper文件和dao接口的关系——xml中的namespace和sql标签id命名要求。

解决:在pom.xml文件中指定要参与编译的资源文件,如下图。

Mybatis工作流程,附带mybatis的mapper文件和config配置文件模板。mapper文件和dao接口的关系——xml中的namespace和sql标签id命名要求。

常见问题2:Error opening session.  Cause: java.lang.NullPointerException: Cannot invoke "org.apache.ibatis.mapping.Environment.getDataSource()" because "environment" is null.

解决:异常提示我们environment是null,我们可以定位是mybatis和数据库连接配置有问题,如果是直接使用mybatis没有使用spring,那么应该去mybatis.xml配置文件查看原因,其实我这边是environments标签的default没有指向environment的id值导致的,将default改为mysql即可;

Mybatis工作流程,附带mybatis的mapper文件和config配置文件模板。mapper文件和dao接口的关系——xml中的namespace和sql标签id命名要求。

常见问题3:Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.datasource.DataSourceException: Unknown DataSource property: user.

解决:异常提示我们未知的数据源属性user,我们可以定位是数据库连接配置出错。而且mybatis主配置文件中的dataSource是POOLED类型,那么使用的是PooledDataSource类,然后该类中使用了UnpooledDataSource类,该类中的用户名是属性username。

Mybatis工作流程,附带mybatis的mapper文件和config配置文件模板。mapper文件和dao接口的关系——xml中的namespace和sql标签id命名要求。
Mybatis工作流程,附带mybatis的mapper文件和config配置文件模板。mapper文件和dao接口的关系——xml中的namespace和sql标签id命名要求。
Mybatis工作流程,附带mybatis的mapper文件和config配置文件模板。mapper文件和dao接口的关系——xml中的namespace和sql标签id命名要求。