1. Mybatis工作流程
1.1 使用MySQL创建数据库girls并生成一个表boys,如下图。
1.2 创建该表对应的简单实体类Boys,如下图。
1.3 创建Dao接口以及和接口同名的mapper文件xxxDao.xml,我这边是StudentDao接口和StudentDao.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="a">
<select id="b" resultType="org.example.domain.Boys">
select id, boyName from boys
</select>
</mapper>
1.4 在resources资源目录下编写mybatis的主配置文件——mybatis.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="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驱动依赖
<?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工作流程总结(没有严格的顺序):①数据库创建库、表;②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文件中的mappers标签使用<mapper>进行,如下图。
现在我在mappers中使用<package>标签,尝试上述操作报错,如下图。
总结:在自己手动使用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接口名和方法名一致。
3. 常见问题
常见问题1:Mapped Statements collection does not contain value for xxx.xxx.
解决:根据提示,我们可知这个问题和mapper文件相关;可能是sqlSession使用的sqlId和mapper文件的namespace、标签id不一致;更可能是mapper文件没有参与编译,如下图。
解决:在pom.xml文件中指定要参与编译的资源文件,如下图。
常见问题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即可;
常见问题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。