学习视频资料来源:https://www.bilibili.com/video/BV1R14y1W7yS
1. 架构设计
Mybatis整体架构分为4层:
- 接口层:提供增删改查的接口,通过调用这些接口可以完成与数据库的交互。调用的方式有两种:基于statementId和基于mapper接口。
- 数据处理:是Mybatis框架的核心层,负责解析SQL,根据调用请求完成一次数据库交互。
- 框架支撑层:负责通用基础服务支撑。SQL语句配置方式:基于xml配置和基于注解配置。对于一些简单的SQL,使用注解的方式比较方便。但对于一些复杂的SQL,比如SQL的动态拼接等,使用注解的方式是非常繁琐的,所以推荐使用xml配置更加方便和维护。
- 引导层:mybatis启动需要的配置信息。包括:基于xml配置方式和基于Java API方式。
2. 核心组件及调用关系
从上往下各组件介绍:
- SqlSession:Mybatis对外暴力的核心API,一些增删改查接口,如selectOne、selectList、insert、delete、update。
- Excutor: 负责数据库操作及两级缓存的维护。SqlSession并不直接调用JDBC,而是委派给Excutor去执行的。
- StatementHandler:语句执行器。负责封装JDBC操作:参数设置,结果集合封装。
- ParameterHandler:参数处理器。实际上把参数处理的过程,委托给TypeHandler
- TypeHandler:类型转换类似,将参数从Java类型转换为jdbc类型,将结果集从jdbc类型转换为java类型。
- ResultSet:结果集
- ResultHandler:结果集处理器。实际上把参数处理的过程,委托给TypeHandler。
3. 源码环境搭建
这个就比较简单了。到mybatis官网https://mybatis.p2hp.com/,找到仓库地址https://github.com/mybatis/mybatis-3/releases/tag/mybatis-3.5.7,下载源码。我这里用的版本和视频中的一样3.5.7。
打开项目新建核心配置文件、映射配置文件、实体类、测试类。目录如下:
3.1 测试类
public class MybatisTest {
@Test
public void test1() throws IOException {
System.setProperty("javax.xml.accessExternalDTD", "all");
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream,"development");
SqlSession sqlSession = build.openSession();
User user = new User();
user.setId(1);
user.setUsername("xiaoming");
Object o = sqlSession.selectOne("com.mqlyes.dao.UserDao.findByCondition", user);
System.out.println(o);
}
}
3.2 实体类
public class User {
private Integer id;
private String username;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
'}';
}
}
3.3 核心配置文件
注意替换数据库地址和密码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://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://192.168.x.x:3306/test?useSSL=false&serverTimezone=UTC"/>
<property name="username" value="xxxx"/>
<property name="password" value="xxxx"/>
</dataSource>
</environment>
</environments>
<!-- Mapper 配置 -->
<mappers>
<mapper resources="mapper/UserMapper.xml"/>
</mappers>
</configuration>
3.4 映射配置文件
<?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.mqlyes.dao.UserDao">
<!-- 唯一标识: namespace.id-->
<!-- 查询所有用户 -->
<select id="findAll" resultType="com.mqlyes.pojo.User">
select * from user
</select>
<!-- 按条件查询用户 -->
<!-- -->
<select id="findByCondition" resultType="com.mqlyes.pojo.User" parameterType="com.mqlyes.pojo.User">
select * from user where id = #{id} and username = #{username}
</select>
</mapper>
3.5 遇到的问题
错误1:如果下面的报错,就在测试类中添加代码
System.setProperty("javax.xml.accessExternalDTD", "all");
这个错误我在网上试了一个方案,不生效。用代码指定的方式可以。
错误2. 如果报配置文件找不到,就检查build后自己的target目录下,是否包含配置文件。可以试试把pom文件中resource和testResource相关的注释掉,用默认的方式。我这里注释掉就可以了。这个错误是由于没把配置文件编译进target导致的。
等到后边我把自己的源码传上去~