自定义持久层框架
1.加载配置文件
2.创建两个javaBean存放配置文件解析出来的内容
3.解析配置文件dom4j
4.创建sqlsession factory接口及实现类
生产sqlSession
5.创建SqlSession接口及实现类
定义数据库crud操作
6.创建executor接口及实现类(封装jdbc)
query(configuration,mapped Statement,params)
代码实现
一、新建test工程
1.新建maven工程(test)
2.引入持久层框架依赖(持久层框架项目,见后文)
3.创建sqlMapConfig.xml
配置 dataSource
配置存放mapper.xml的全路径
4.创建mapper.xml
创建标签
二、新建自定义框架模块
1.新建module工程
(一)加载配置文件
2.创建类resources,编写静态方法,根据配置文件路径将配置文件加载为字节输入流
3.在test工程中新建一个test类,调用resource
4.打包自定义模块工程
5.test中引入自定义持久层框架的依赖
6.test中调用测试,获取配置字节流
(二)创建容器对象存放配置文件
1.创建mappedStatement
内容:ID标识、返回值类型、参数值类型、sql语句
statementId:namespace.id
2.创建Configuration
内容:datasource、map集合(存放mapped Statement):key:statementId
(三)解析配置文件
1.创建sqlSessionFactoryBuilder,在该类中创建方法build,返回值:sqlSessionFactory,参数值:inputStream
2.创建SqlSession接口
3.编写build方法
使用dom4j解析,封装Configuration:
(1)创建xmlConfigBuilder类,创建Configuration对象,创建构造函数—>创建方法parseConfig:
方法实现:导入相关依赖;SAXReader.read获取Document;获取根对象document.getRootElement;
获取数据源element list集合root.selectNodes(“//property”);遍历list,获取值element.attributeValue(”name”)同理获取value值;创建properties对象,存储配置文件信息;创建连接池对象new CombopooledDataSource set driver、jdbcurl、user、password,将连接池对象set到configuration;
(2)获取mapper信息list集合root.selectNodes(”//mapper”);遍历list,获取值“resource”得到mapper路径;根据mapper路径获取配置流;创建xmlMapperBuilder类,声明configuration对象,编写方法parse:
方法实现:
获取namespace的值,获取select节点list,遍历list,获取属性值id、resultType、paramterType,将值存入mappedStatement,将mappedStatement put到configuration的map中,key值存namespace.id
返回configuration到build方法。
test—in—>build方法—in—>parseConfig—in—>parse
创建sqlSessionFactory对象:工厂类:生产sqlSession 会话对象
创建实现类DefaultSqlSessionFactory,有参构造,传递configuration;
(四)生产sqlSession
编写openSession接口和实现类;
创建DefaultSqlSession类(sqlSession的实现类)
test中sqlSessionFactory.openSession
(五)sqlSession接口方法定义实现
SqlSession接口中新增方法selectList,实体类型不确定写
test方法中调用sqlSession.selectOne,创建实体类user
创建构造函数向下传递configuration
实现类实现select方法,完成对simpleExecutor的query方法调用
(六)创建executor接口及实现类
创建query方法,并实现(jabc实现)
1.注册驱动,获取链接
configuration获取datasource的连接
2.获取sql,转换sql语句,并解析参数
mappedstatement获取sql
创建boundSql类,存解析后的sql,parameter List,有参构造
创建getBoundSql方法,将#{}替换成?,解析出{}里的值进行存储:
引入mybatis中使用的工具类genericTokenParser(标记处理类)tokenhandler.handleToken//将参数内容解析到paramterMapping中; 创建paramterMapping类
在getboundSql方法中调用genericTokenParser.parse获取解析出来的sql
调用parameterMappingTokenHandler.getParameter Mappings获取解析出来的参数名称
将值set到boundSql中
return boundSql
3.获取预处理对象
connection.prepare Statement
4.设置参数
5.执行sql
6.封装返回结果集