自定义持久层框架

自定义持久层框架
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.设置参数
boundSql.getParameterMapping获取参数
获取content
获取参数全路径,将参数类型转换为对象class.forName
反射class.getDeclaredField
暴力访问 declaredField.setAccessible(true);
设置参数值到prepared Statement

5.执行sql
preparestatement.executeQuery
获取resultType全路径:mappedStatement.getResultType
获取class实体:class.newInstance
创建集合,存放封装好的实体对象
6.封装返回结果集
遍历resultSet,
取出元数据
for循环遍历元数据getColumnCount
获取字段名:getColumnName
获取字段值:getObject(columnName)
使用反射或内省,根据数据库表和实体对应关系,完成封装:new property Descriptor(columnName,resultTypeClass)(内省库中的类,对class中的name属性实现读写方法)
getWriteMethod
writeMethod.invoke(class实体,字段值)
将封装好的实体添加到实体集合中
返回集合list

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值