本项目分为两部分,IPersistence为主体部分(包括连接数据库、动态sql的拼接、执行sql等功能),IPersistence_Test为测试部分。
- IPersistence_Test
- 导入IPersistence
<dependencies>
<dependency>
<groupId>org.example</groupId>
<artifactId>IPersistence</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
- 使用
- IPersistence
项目启动时先加载sqlMapConfig.xml配置文件
文件中包含了数据库连接信息,以及动态sql的mapper文件
使用dom4j将sqlMapConfig.xml中的数据库连接信息、以及动态sql(注意:每个sql都有一个唯一标识,起名规则为 namespace + id)解析出来,返回Configuration对象
通过DefaultSqlSessionFactory工厂对象创建Session会话,SqlSession中定义了相关操作,具体实现类DefaultSqlSession
DefaultSqlSession类详解
构造器
通过外部传递一个Configuration对象,该对象中包含了数据库连接信息,以及动态sql解析信息
public DefaultSqlSession(Configuration configuration) {
this.configuration = configuration;
}
查询列表(selectList)
先创建一个执行器SimpleExecutor对象,然后调用执行器的query方法进行查询
在query方法中按照java的常规数据库查询,得到的结果通过反射或者内省,根据数据库表和实体的对应关系,完成封装,并返回结果
public <E> List<E> selectList(String statementid, Object... params) throws Exception {
//将要去完成对simpleExecutor里的query方法的调用
SimpleExecutor simpleExecutor = new SimpleExecutor();
MappedStatement mappedStatement = configuration.getMappedStatementMap().get(statementid);
List<Object> list = simpleExecutor.query(configuration, mappedStatement, params);
return (List<E>) list;
}
public <E> List<E> query(Configuration configuration, MappedStatement mappedStatement, Object... params) throws Exception {
PreparedStatement preparedStatement = getStatement(configuration,mappedStatement,params);
// 5. 执行sql
ResultSet resultSet = preparedStatement.executeQuery();
String resultType = mappedStatement.getResultType();
Class<?> resultTypeClass = getClassType(resultType);
ArrayList<Object> objects = new ArrayList<Object>();
// 6. 封装返回结果集
while (resultSet.next()){
Object o =resultTypeClass.newInstance();
//元数据
ResultSetMetaData metaData = resultSet.getMetaData();
for (int i = 1; i <= metaData.getColumnCount(); i++) {
// 字段名
String columnName = metaData.getColumnName(i);
// 字段的值
Object value = resultSet.getObject(columnName);
//使用反射或者内省,根据数据库表和实体的对应关系,完成封装
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(columnName, resultTypeClass);
Method writeMethod = propertyDescriptor.getWriteMethod();
writeMethod.invoke(o,value);
}
objects.add(o);
}
return (List<E>) objects;
}