一 环境准备
以一个最简单的例子来看看Mybatis的运行流程以及Mybatis四大对象起了什么作用。
Employee.java
package com.lxj.bean;
public class Employee {
private Integer id;
private String lastName;
private String email;
private String gender;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Employee [id=" + id + ", lastName=" + lastName + ", email=" + email + ", gender=" + gender + "]";
}
}
EmployeeMapper.java
package com.lxj.mapper;
import com.lxj.bean.Employee;
public interface EmployeeMapper {
public Employee getEmpById(Integer id);
}
EmployeeMapper.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="com.lxj.mapper.EmployeeMapper">
<select id="getEmpById" resultType="com.lxj.bean.Employee">
select * from tba_emp where id = #{id}
</select>
</mapper>
mybatis-config.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>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!--使用驼峰命名法: JAVA 的 lastName对应数据库的last_name -->
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybaits" />
<property name="username" value="root" />
<property name="password" value="Quit__12" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- mapper文件在类路径的位置-->
<mapper resource="com/lxj/mapper/EmployeeMapper.xml" />
</mappers>
</configuration>
二 测试
测试代码如下:
public class MybatisTest {
@Test
public void testMybatisSource() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession();
try {
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
Employee employee = mapper.getEmpById(1);
System.out.println(employee);
}finally {
openSession.close();
}
}
private SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
return sqlSessionFactory;
}
}
可以看到运行一切正常,下面就开始从获取SqlSessionFactory开始打一个断点:
直接 Step Into
StatementHandler 借助ParameterHandler设置参数,借助ResultSetHandler处理结果
三 源码分析
StatementHandler:处理sql语句预编译,设置参数等相关工作;
ParameterHandler:设置预编译参数用的
ResultSetHandler: 处理结果集
TypeHandler:在整个过程中,进行数据库类型和javaBean类型的映射
时序图如下: