XMLStatementParser用来解析mapper映射文件中的curd标签。

    1. package com.example.aninbatis.config;
    2. import com.example.aninbatis.sqlsource.SqlSource;
    3. import org.dom4j.Element;
    4. /**
    5. * 用来解析mapper映射文件中的curd标签
    6. */
    7. public class XMLStatementParser {
    8. /**
    9. * 全局配置封装
    10. */
    11. private Configuration configuration;
    12. public XMLStatementParser(Configuration configuration) {
    13. this.configuration = configuration;
    14. }
    15. public void parseStatement(Element selectElement, String namespace) {
    16. // 一个MappedStatement对象,就对应一个select标签
    17. String id = selectElement.attributeValue("id");
    18. String parameterType = selectElement.attributeValue("parameterType");
    19. Class<?> parameterTypeClass = resolveClass(parameterType);
    20. String resultType = selectElement.attributeValue("resultType");
    21. Class<?> resultTypeClass = resolveClass(resultType);
    22. String statementType = selectElement.attributeValue("statementType");
    23. statementType = statementType == null || statementType.equals("") ? "prepared" : statementType;
    24. // SqlSource就是封装了SQL语句
    25. // 此时封装的SQL语句是没有进行处理的,什么时候处理呢?
    26. // 处理时机,就是在SqlSession执行的时候
    27. // SELECT * FROM user WHERE id = #{id}
    28. // String sqlText = selectElement.getTextTrim();
    29. // SqlSource sqlSource = new SqlSource(sqlText);
    30. SqlSource sqlSource = createSqlSource(selectElement);
    31. String statementId = namespace + "." + id;
    32. // 此处使用构造方法或者set方法去赋值的话,感觉都不爽
    33. // 构造参数可能有,可能没有
    34. // 使用构建者模式改造
    35. MappedStatement mappedStatement = new MappedStatement(statementId, parameterTypeClass, resultTypeClass,
    36. statementType, sqlSource);
    37. configuration.setMappedStatement(statementId, mappedStatement);
    38. }
    39. /**
    40. * 创建SqlSource其实就是对select等CRUD标签中的sql脚本进行处理
    41. * @param selectElement
    42. * @return
    43. */
    44. private SqlSource createSqlSource(Element selectElement) {
    45. XMLScriptParser scriptParser = new XMLScriptParser();
    46. SqlSource sqlSource = scriptParser.parseScriptNode(selectElement);
    47. return sqlSource;
    48. }
    49. private Class<?> resolveClass(String parameterType) {
    50. try {
    51. return Class.forName(parameterType);
    52. } catch (ClassNotFoundException e) {
    53. e.printStackTrace();
    54. }
    55. return null;
    56. }
    57. }