自定义持久层框架
2021-06-29 00:15:39 4 举报
AI智能生成
自定义的持久层框架
作者其他创作
大纲/内容
SqlSessionFactory
DefaultSqlSessionFactory
Configuration
SqlSession
DefaultSqlSession
Configuration
Executor
SimpleExecutor
自定义持久层框架实现功能的流程
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
InputStream resourceAsStream = Resources.class.getClassLoader().getResourceAsStream(path);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
// 第一: 使用dom4j解析配置文件, 将解析出来的内容封装到Configuration中
XMLConfigBuilder xmlConfigBuilder = new XMLConfigBuilder();
Configuration configuration = xmlConfigBuilder.parseConfig(in);
XMLConfigBuilder xmlConfigBuilder = new XMLConfigBuilder();
Configuration configuration = xmlConfigBuilder.parseConfig(in);
// 第二: 创建sqlSessionFactory对象
DefaultSqlSessionFactory defaultSqlSessionFactory = new DefaultSqlSessionFactory(configuration);
DefaultSqlSessionFactory defaultSqlSessionFactory = new DefaultSqlSessionFactory(configuration);
SqlSession sqlSession = sqlSessionFactory.openSession();
return new DefaultSqlSession(configuration);
IUserDao userDao = sqlSession.getMapper(IUserDao.class);
//使用jdk动态代理来为dao接口生成代理对象并返回
Object proxyInstance = Proxy.newProxyInstance(DefaultSqlSession.class.getClassLoader(), new Class[]{mapperClass}, new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//获取方法名, 也就是id
String methodName = method.getName();
//获取方法对应的类的全限定名
String className = method.getDeclaringClass().getName();
String statementId = className + "." + methodName;
//获得返回值类型
Type genericReturnType = method.getGenericReturnType();
//判断是否进行了泛型类型参数化
if (genericReturnType instanceof ParameterizedType){
List<Object> objects = selectList(statementId, args);
return objects;
}
return selectOne(statementId,args);
}
});
Object proxyInstance = Proxy.newProxyInstance(DefaultSqlSession.class.getClassLoader(), new Class[]{mapperClass}, new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//获取方法名, 也就是id
String methodName = method.getName();
//获取方法对应的类的全限定名
String className = method.getDeclaringClass().getName();
String statementId = className + "." + methodName;
//获得返回值类型
Type genericReturnType = method.getGenericReturnType();
//判断是否进行了泛型类型参数化
if (genericReturnType instanceof ParameterizedType){
List<Object> objects = selectList(statementId, args);
return objects;
}
return selectOne(statementId,args);
}
});
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;
}
//1. 注册驱动, 获取连接
Connection connection = configuration.getDataSource().getConnection();
//2. 获取sql语句
String sql = mappedStatement.getSql();
BoundSql boundSql = getBoundSql(sql);
//3.获取预处理对象preparedStatement
PreparedStatement preparedStatement = connection.prepareStatement(boundSql.getSqlText());
//4. 设置参数 获取参数的全限定名, 然后获取对应的class
String parameterType = mappedStatement.getParameterType();
Class<?> parameterTypeClass = getClassType(parameterType);
List<ParameterMapping> parameterMappingList = boundSql.getParameterMappingList();
for (int i = 0; i < parameterMappingList.size(); i++) {
Field declaredField = parameterTypeClass.getDeclaredField(parameterMappingList.get(i).getContent());
//暴力访问
declaredField.setAccessible(true);
Object o = declaredField.get(params[0]);
preparedStatement.setObject(i + 1, o);
}
//5. 执行sql
ResultSet resultSet = preparedStatement.executeQuery();
//6. 封装返回结果集
String resultType = mappedStatement.getResultType();
Class<?> resultTypeClass = getResultType(resultType);
ArrayList<Object> objects = new ArrayList();
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);
}
//将要去完成simpleExecutor里的query方法的调用
SimpleExecutor simpleExecutor = new SimpleExecutor();
MappedStatement mappedStatement = configuration.getMappedStatementMap().get(statementid);
List<Object> list = simpleExecutor.query(configuration, mappedStatement, params);
return (List<E>) list;
}
//1. 注册驱动, 获取连接
Connection connection = configuration.getDataSource().getConnection();
//2. 获取sql语句
String sql = mappedStatement.getSql();
BoundSql boundSql = getBoundSql(sql);
//3.获取预处理对象preparedStatement
PreparedStatement preparedStatement = connection.prepareStatement(boundSql.getSqlText());
//4. 设置参数 获取参数的全限定名, 然后获取对应的class
String parameterType = mappedStatement.getParameterType();
Class<?> parameterTypeClass = getClassType(parameterType);
List<ParameterMapping> parameterMappingList = boundSql.getParameterMappingList();
for (int i = 0; i < parameterMappingList.size(); i++) {
Field declaredField = parameterTypeClass.getDeclaredField(parameterMappingList.get(i).getContent());
//暴力访问
declaredField.setAccessible(true);
Object o = declaredField.get(params[0]);
preparedStatement.setObject(i + 1, o);
}
//5. 执行sql
ResultSet resultSet = preparedStatement.executeQuery();
//6. 封装返回结果集
String resultType = mappedStatement.getResultType();
Class<?> resultTypeClass = getResultType(resultType);
ArrayList<Object> objects = new ArrayList();
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);
}
List<User> users = userDao.findAll();
Configuration
DataSource
数据源
mappedStatementMap
key:statementid,value:封装好的MappedStatement对象
MappedStatement
id
resultType
parameterType
sql

收藏
0 条评论
下一页
为你推荐
查看更多