天哪!手动编写mybatis雏形竟然这么简单 (3)

我们再来解析一下SqlMapConfig.xml 配置信息思路是一样的,
1、获取文件流,转成document。
2、获取根节点,也就是configuration。
3、获取根节点中所有的property 节点,并获取值,也就是获取数据库连接信息
4、创建一个dataSource 连接池
5、将连接池信息保存到Configuration实体中
6、获取根节点的所有mapper 节点
7、调用XmlMapperBuilder 类解析对应mapper 并封装到Configuration实体中
8、完
代码如下:

public class XmlConfigBuilder { private Configuration configuration; public XmlConfigBuilder(Configuration configuration){ this.configuration=configuration; } public Configuration loadXmlConfig(InputStream in) throws DocumentException, PropertyVetoException, ClassNotFoundException { Document document=new SAXReader().read(in); Element rootElement=document.getRootElement(); //获取连接信息 List<Node> propertyList=rootElement.selectNodes("//property"); Properties properties=new Properties(); for (int i = 0; i < propertyList.size(); i++) { Element element = (Element) propertyList.get(i); properties.setProperty(element.attributeValue("name"),element.attributeValue("value")); } //是用连接池 ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setDriverClass(properties.getProperty("driverClass")); dataSource.setJdbcUrl(properties.getProperty("jdbcUrl")); dataSource.setUser(properties.getProperty("userName")); dataSource.setPassword(properties.getProperty("password")); configuration.setDataSource(dataSource); //获取mapper 信息 List<Node> mapperList=rootElement.selectNodes("//mapper"); for (int i = 0; i < mapperList.size(); i++) { Element element= (Element) mapperList.get(i); String mapperPath=element.attributeValue("resource"); XmlMapperBuilder xmlMapperBuilder = new XmlMapperBuilder(configuration); configuration=xmlMapperBuilder.loadXmlMapper(Resources.getResources(mapperPath)); } return configuration; } } 创建SqlSessionFactory

完成解析后我们创建SqlSessionFactory 用来创建Sqlseesion 的实体,这里为了尽量还原mybatis 设计思路,也也采用的工厂设计模式。
SqlSessionFactory 是一个接口,里面就一个用来创建SqlSessionf的方法。
如下:

public interface SqlSessionFactory { public SqlSession openSqlSession(); }

单单这个接口是不够的,我们还得写一个接口的实现类,所以我们创建一个DefaultSqlSessionFactory。
如下:

public class DefaultSqlSessionFactory implements SqlSessionFactory { private Configuration configuration; public DefaultSqlSessionFactory(Configuration configuration) { this.configuration = configuration; } public SqlSession openSqlSession() { return new DefaultSqlSeeion(configuration); } }

可以看到就是创建一个DefaultSqlSeeion并将包含配置信息的configuration 传递下去。DefaultSqlSeeion 就是SqlSession 的一个实现类。

创建SqlSession

在SqlSession 中我们就要来处理各种操作了,比如selectList,selectOne,insert.update,delete 等等。
我们这里SqlSession 就先写一个selectList 方法。
如下:

public interface SqlSession { /** * 条件查找 * @param statementid 唯一标识,namespace.selectid * @param parm 传参,可以不传也可以一个,也可以多个 * @param <E> * @return */ public <E> List<E> selectList(String statementid,Object...parm) throws Exception;

然后我们创建DefaultSqlSeeion 来实现SqlSeesion 。

public class DefaultSqlSeeion implements SqlSession { private Configuration configuration; private Executer executer=new SimpleExecuter(); public DefaultSqlSeeion(Configuration configuration) { this.configuration = configuration; } @Override public <E> List<E> selectList(String statementid, Object... parm) throws Exception { Mapper mapper=configuration.getMapperMap().get(statementid); List<E> query = executer.query(configuration, mapper, parm); return query; } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxyxx.html