Project structure
-
Describe the project structure of the custom persistence layer framework?
-
. ├── IPersistence │ ├── IPersistence.iml │ ├── pom.xml │ └── src └── IPersistence_test ├── IPersistence_test.iml ├── pom.xml ├── src └── target
-
Specific code
sqlMapperConfig.xml configuration file
<configuration> <!-- Store database configuration information --> <dataSource> <property name="driverClass" value="com.mysql.jdbc.Driver"></property> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/zdy_mybatis"></property> <property name="username" value="root"></property> <property name="password" value="123456"></property> </dataSource> <!-- Store the full path of mapper.xml --> <mapper resource="UserMapper.xml" /> </configuration>
UserMapper.xml configuration file
<mapper namespace="user"> <!-- The unique identifier of sql: namespace.id combination: statementId --> <select id="selectList" resultType="com.terwergreen.pojo.User"> select * from user </select> <select id="selectOne" resultType="com.terwergreen.pojo.User" parameterType="com.terwergreen.pojo.User"> select * from user where id = #{id} and username = #{username} </select> </mapper>
Read resource processing, Resources class
/** * Resource processing class * * @name: Resource * @author: terwer * @date: 2022-03-14 12:57 **/ public class Resources { /** * According to the path of the configuration file, load the configuration file into a byte input stream and store it in memory * * @param path * @return */ public static InputStream getResourceAsStream(String path) { InputStream inputStream = Resources.class.getClassLoader().getResourceAsStream(path); return inputStream; } }
SqlSessionFactoryBuider factory construction object
/** *Factory construction object * * @name: SqlSessionFactoryBuilder * @author: terwer * @date: 2022-03-14 15:18 **/ public class SqlSessionFactoryBuilder { public SqlSessionFactory build(InputStream in) throws DocumentException, PropertyVetoException { // 1. Parse the configuration file and encapsulate the parsed content into Configuration. XmlConfigBuilder xmlConfigBuilder = new XmlConfigBuilder(); Configuration configuration = xmlConfigBuilder.parse(in); // 2. Create SqlSessionFactory object DefaultSqlSessionFactory sqlSessionFactory = new DefaultSqlSessionFactory(configuration); return sqlSessionFactory; } }
Configuration file analysis
/** * @name: XmlConfigBuilder * @author: terwer * @date: 2022-03-14 15:40 **/ public class XmlConfigBuilder { private Configuration configuration; public XmlConfigBuilder() { configuration = new Configuration(); } /** * Use dom4j to parse the configuration file and encapsulate the Configuration * * @param in * @return */ public Configuration parse(InputStream in) throws DocumentException, PropertyVetoException { Document document = new SAXReader().read(in); // <confirmation> Element rootElement = document.getRootElement(); List<Element> list = rootElement.selectNodes("//property"); Properties properties = new Properties(); for (Element element : list) { String name = element.attributeValue("name"); String value = element.attributeValue("value"); properties.setProperty(name, value); } ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource(); comboPooledDataSource.setDriverClass(properties.getProperty("driverClass")); comboPooledDataSource.setJdbcUrl(properties.getProperty("jdbcUrl")); comboPooledDataSource.setUser(properties.getProperty("username")); comboPooledDataSource.setPassword(properties.getProperty("password")); configuration.setDataSource(comboPooledDataSource); // Parse mapper.xml, get the path, load it into a byte input stream, and parse it List<Element> mapperList= rootElement.selectNodes("//mapper"); // <mapper> for (Element element : mapperList) { String mapperPath = element.attributeValue("resource"); InputStream resourceAsStream = Resources.getResourceAsStream(mapperPath); XmlMapperBuilder xmlMapperBuilder = new XmlMapperBuilder(configuration); xmlMapperBuilder.parse(resourceAsStream); } return configuration; } }
mapper mapping file analysis
/** * mapper parser * * @name: XmlMapperBuilder * @author: terwer * @date: 2022-03-14 16:16 **/ public class XmlMapperBuilder { private Configuration configuration; public XmlMapperBuilder(Configuration configuration) { this.configuration = configuration; } public void parse(InputStream in) throws DocumentException { Document document = new SAXReader().read(in); // <mapper> Element rootElement = document.getRootElement(); String namespace = rootElement.attributeValue("namespace"); List<Element> list = rootElement.selectNodes("//select"); for (Element element : list) { String id = element.attributeValue("id"); String resultType = element.attributeValue("resultType"); String parameterType = element.attributeValue("parameterType"); String sqlText = element.getTextTrim(); MappedStatement mappedStatement = new MappedStatement(); mappedStatement.setStatementId(id); mappedStatement.setResultType(resultType); mappedStatement.setParameterType(parameterType); mappedStatement.setSql(sqlText); Map<String, MappedStatement> mappedStatementMap = configuration.getMappedStatementMap(); String statementId = namespace + "." + id; mappedStatementMap.put(statementId, mappedStatement); } } }
Concrete implementation of SqlSession
/** * @name: SqlSession * @author: terwer * @date: 2022-03-14 16:35 **/ public interface SqlSession { /** * Search all */ public <E> List<E> selectList(String statementId, Object... params) throws Exception; /** * Query a single */ public <T> T selectOne(String statementId, Object... params) throws Exception; public <T> T getMapper(Class<?> mapperClass); }
Article update history
2022/05/08 feat: Optimize code
?