Mybatis学习笔记
Mybaits是什么
官网说明
MyBatis is a first class persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis eliminates almost all of the JDBC code and manual setting of parameters and retrieval of results. MyBatis can use simple XML or Annotations for configuration and map primitives, Map interfaces and Java POJOs (Plain Old Java Objects) to database records.
首先它是一个持久性框架,支持自定义SQL、存储过程和高级映射;
特点就是消除了几乎所有的JDBC代码、手动设置参数和检索结果;
可以使用xml或者注解的方式进行配置;
JDBC操作数据库流程
既然mybatis消除了jdbc代码,就证明它底层其实也是根据jdbc来操作数据库的,只不过这些代码不用开发者来维护了
- 加载数据库驱动
- 建立数据库连接
- 创建数据库操作对象
- 定义操作数据库的sql
- 执行数据库操作
- 获取结果集
- 关闭对象回收数据库资源
既然mybatis使用了jdbc来操作数据库,那我们就分析一下mybatis是如何一步一步将他们封装的
1.加载数据库驱动
首先是数据源javax.sql.DataSource,Mybatis里也有实现
UnpooledDataSource 和 PooledDataSource
UnpooledDataSource不使用数据库连接池
PooledDataSource使用数据库连接池
在获取他们的时候Mybatis还使用DataSourceFactory工厂方法模式来获取
DataSourceFactory
顶级工厂定义了两个方法
package org.apache.ibatis.datasource;
import java.util.Properties;
import javax.sql.DataSource;
public interface DataSourceFactory {
// 设置数据源的配置
// Properties 就是我们平常设置的 username password url等数据
void setProperties(Properties var1);
// 获取数据源
DataSource getDataSource();
}
UnpooledDataSourceFactory
package org.apache.ibatis.datasource.unpooled;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.ibatis.datasource.DataSourceException;
import org.apache.ibatis.datasource.DataSourceFactory;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
/**
* @author Clinton Begin
*/
public class UnpooledDataSourceFactory implements DataSourceFactory {
private static final String DRIVER_PROPERTY_PREFIX = "driver.";
private static final int DRIVER_PROPERTY_PREFIX_LENGTH = DRIVER_PROPERTY_PREFIX.length();
protected DataSource dataSource;
// 在实例化这个工厂的时候就指定了从这个工厂获取的DataSource是UnpooledDataSource
public UnpooledDataSourceFactory() {
this.dataSource = new UnpooledDataSource();
}
// 设置连接数据
@Override
public void setProperties(Properties properties) {
Properties driverProperties = new Properties();
MetaObject metaDataSource = SystemMetaObject.forObject(dataSource);
for (Object key : properties.keySet()) {
String propertyName = (String) key;
if (propertyName.startsWith(DRIVER_PROPERTY_PREFIX)) {
String value = properties.getProperty(propertyName);
driverProperties.setProperty(propertyName.substring(DRIVER_PROPERTY_PREFIX_LENGTH), value);
} else if (metaDataSource.hasSetter(propertyName)) {
String value = (String) properties.get(propertyName);
Object convertedValue = convertValue(metaDataSource, propertyName, value);
metaDataSource.setValue(propertyName, convertedValue);
} else {
throw new DataSourceException("Unknown DataSource property: " + propertyName);
}
}
if (driverProperties.size() > 0) {
metaDataSource.setValue("driverProperties", driverProperties);
}
}
// 重要,这里获取的DataSource是成员变量DataSource这是个接口,在使用这个类获取的时候就是UnpooledDataSource
@Override
public DataSource getDataSource() {
return dataSource;
}
private Object convertValue(MetaObject metaDataSource, String propertyName, String value) {
Object convertedValue = value;
Class<?> targetType = metaDataSource.getSetterType(propertyName);
if (targetType == Integer.