当前位置: 首页 > news >正文

做问卷的网站有哪些学校网站建设情况介绍

做问卷的网站有哪些,学校网站建设情况介绍,网站建设淘宝模板,wordpress头条模板Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 作者#xff1a;小傅哥 博客#xff1a;https://bugstack.cn 沉淀、分享、成长#xff0c;让自己和他人都能有所收获小傅哥 博客https://bugstack.cn 沉淀、分享、成长让自己和他人都能有所收获 一、前言 如何面对复杂系统的设计 我们可以把 Spring、Mybatis、Dubbo 这样的大型框架或者一些公司内部的较核心项目都可以称为复杂的系统。这样的工程也不在是初学编程手里的玩具项目没有所谓的CRUD更多时候要面对的都是对系统分层的结构设计和聚合逻辑功能的实现再通过层层转换进行实现和调用。 这对于很多刚上道的小码农来说会感觉非常难受不知道要从哪下手但又想着可以一口吃个胖子。其实这是不现实的因为这些复杂系统中的框架中有太多的内容你还没用了解和熟悉越是硬搞越难受信心越受打击。 其实对于解决这类复杂的项目问题核心在于要将主干问题点缩小具体的手段包括分治、抽象和知识。运用设计模式和设计原则等相关知识把问题空间合理切割为若干子问题问题越小也就越容易理解和处理。就像你可以把很多内容做成单个独立的案例一样最终在进行聚合使用。 二、目标 在上一章节我们初步的了解了怎么给一个接口类生成对应的映射器代理并在代理中完成一些用户对接口方法的调用处理。虽然我们已经看到了一个核心逻辑的处理方式但在使用上还是有些刀耕火种的包括需要编码告知 MapperProxyFactory 要对哪个接口进行代理以及自己编写一个假的 SqlSession 处理实际调用接口时的返回结果。 那么结合这两块问题点我们本章节要对映射器的注册提供注册机处理满足用户可以在使用的时候提供一个包的路径即可完成扫描和注册。与此同时需要对 SqlSession 进行规范化处理让它可以把我们的映射器代理和方法调用进行包装建立一个生命周期模型结构便于后续的内容的添加。 三、设计 鉴于我们希望把整个工程包下关于数据库操作的 DAO 接口与 Mapper 映射器关联起来那么就需要包装一个可以扫描包路径的完成映射的注册器类。 当然我们还要把上一章节中简化的 SqlSession 进行完善由 SqlSession 定义数据库处理接口和获取 Mapper 对象的操作并把它交给映射器代理类进行使用。这一部分是对上一章节内容的完善 有了 SqlSession 以后你可以把它理解成一种功能服务有了功能服务以后还需要给这个功能服务提供一个工厂来对外统一提供这类服务。比如我们在 Mybatis 中非常常见的操作开启一个 SqlSession。整个设计可以如图 3-1 以包装接口提供映射器代理类为目标补全映射器注册机 MapperRegistry自动扫描包下接口并把每个接口类映射的代理类全部存入映射器代理的 HashMap 缓存中。而 SqlSession、SqlSessionFactory 是在此注册映射器代理的上次层使用标准定义和对外服务提供的封装便于用户使用。我们把使用方当成用户 经过这样的封装就就可以更加方便我们后续在框架上功能的继续扩展了也希望大家可以在学习的过程中对这样的设计结构有一些思考它可以帮助你解决一些业务功能开发过程中的领域服务包装。 四、实现 1. 工程结构 mybatis-step-02 └── src├── main│ └── java│ └── cn.bugstack.mybatis│ ├── binding│ │ ├── MapperProxy.java│ │ ├── MapperProxyFactory.java│ │ └── MapperRegistry.java│ └── session│ ├── defaults│ │ ├── DefaultSqlSession.java│ │ └── DefaultSqlSessionFactory.java│ ├── SqlSession.java│ └── SqlSessionFactory.java└── test└── java└── cn.bugstack.mybatis.test.dao├── dao│ ├── ISchoolDao.java│ └── IUserDao.java└── ApiTest.java 映射器标准定义实现关系如图 3-2 MapperRegistry 提供包路径的扫描和映射器代理类注册机服务完成接口对象的代理类注册处理。SqlSession、DefaultSqlSession 用于定义执行 SQL 标准、获取映射器以及将来管理事务等方面的操作。基本我们平常使用 Mybatis 的 API 接口也都是从这个接口类定义的方法进行使用的。SqlSessionFactory 是一个简单工厂模式用于提供 SqlSession 服务屏蔽创建细节延迟创建过程。 2. 映射器注册机 源码详见cn.bugstack.mybatis.binding.MapperRegistry public class MapperRegistry {/*** 将已添加的映射器代理加入到 HashMap*/private final Map, MapperProxyFactory knownMappers new HashMap();public T getMapper(Class type, SqlSession sqlSession) {final MapperProxyFactory mapperProxyFactory (MapperProxyFactory) knownMappers.get(type);if (mapperProxyFactory null) {throw new RuntimeException(Type type is not known to the MapperRegistry.);}try {return mapperProxyFactory.newInstance(sqlSession);} catch (Exception e) {throw new RuntimeException(Error getting mapper instance. Cause: e, e);}}public void addMapper(Class type) {/* Mapper 必须是接口才会注册 */if (type.isInterface()) {if (hasMapper(type)) {// 如果重复添加了报错throw new RuntimeException(Type type is already known to the MapperRegistry.);}// 注册映射器代理工厂knownMappers.put(type, new MapperProxyFactory(type));}}public void addMappers(String packageName) {Set mapperSet ClassScanner.scanPackage(packageName);for (Class mapperClass : mapperSet) {addMapper(mapperClass);}}} MapperRegistry 映射器注册类的核心主要在于提供了 ClassScanner.scanPackage 扫描包路径调用 addMapper 方法给接口类创建 MapperProxyFactory 映射器代理类并写入到 knownMappers 的 HashMap 缓存中。另外就是这个类也提供了对应的 getMapper 获取映射器代理类的方法其实这步就包装了我们上一章节手动操作实例化的过程更加方便在 DefaultSqlSession 中获取 Mapper 时进行使用。 3. SqlSession 标准定义和实现 源码详见cn.bugstack.mybatis.session.SqlSession public interface SqlSession {/*** Retrieve a single row mapped from the statement key* 根据指定的SqlID获取一条记录的封装对象** param the returned object type 封装之后的对象类型* param statement sqlID* return Mapped object 封装之后的对象*/T selectOne(String statement);/*** Retrieve a single row mapped from the statement key and parameter.* 根据指定的SqlID获取一条记录的封装对象只不过这个方法容许我们可以给sql传递一些参数* 一般在实际使用中这个参数传递的是pojo或者Map或者ImmutableMap** param the returned object type* param statement Unique identifier matching the statement to use.* param parameter A parameter object to pass to the statement.* return Mapped object*/T selectOne(String statement, Object parameter);/*** Retrieves a mapper.* 得到映射器这个巧妙的使用了泛型使得类型安全** param the mapper type* param type Mapper interface class* return a mapper bound to this SqlSession*/T getMapper(Class type);} 在 SqlSession 中定义用来执行 SQL、获取映射器对象以及后续管理事务操作的标准接口。目前这个接口中对于数据库的操作仅仅只提供了 selectOne后续还会有相应其他方法的定义。 源码详见cn.bugstack.mybatis.session.defaults public class DefaultSqlSession implements SqlSession {/*** 映射器注册机*/private MapperRegistry mapperRegistry;Overridepublic T selectOne(String statement, Object parameter) {return (T) (你被代理了 方法 statement 入参 parameter);}Overridepublic T getMapper(Class type) {return mapperRegistry.getMapper(type, this);}} 通过 DefaultSqlSession 实现类对 SqlSession 接口进行实现。getMapper 方法中获取映射器对象是通过 MapperRegistry 类进行获取的后续这部分会被配置类进行替换。在 selectOne 中是一段简单的内容返回目前还没有与数据库进行关联这部分在我们渐进式的开发过程中逐步实现。 4. SqlSessionFactory 工厂定义和实现 源码详见cn.bugstack.mybatis.session.SqlSessionFactory public interface SqlSessionFactory {/*** 打开一个 session* return SqlSession*/SqlSession openSession();} 这其实就是一个简单工厂的定义在工厂中提供接口实现类的能力也就是 SqlSessionFactory 工厂中提供的开启 SqlSession 的能力。 源码详见cn.bugstack.mybatis.session.defaults.DefaultSqlSessionFactory public class DefaultSqlSessionFactory implements SqlSessionFactory {private final MapperRegistry mapperRegistry;public DefaultSqlSessionFactory(MapperRegistry mapperRegistry) {this.mapperRegistry mapperRegistry;}Overridepublic SqlSession openSession() {return new DefaultSqlSession(mapperRegistry);}} 默认的简单工厂实现处理开启 SqlSession 时对 DefaultSqlSession 的创建以及传递 mapperRegistry这样就可以在使用 SqlSession 时获取每个代理类的映射器对象了。 五、测试 1. 事先准备 在同一个包路径下提供2个以上的 Dao 接口 public interface ISchoolDao {String querySchoolName(String uId);}public interface IUserDao {String queryUserName(String uId);Integer queryUserAge(String uId);} 2. 单元测试 Test public void test\_MapperProxyFactory() {// 1. 注册 MapperMapperRegistry registry new MapperRegistry();registry.addMappers(cn.bugstack.mybatis.test.dao);// 2. 从 SqlSession 工厂获取 SessionSqlSessionFactory sqlSessionFactory new DefaultSqlSessionFactory(registry);SqlSession sqlSession sqlSessionFactory.openSession();// 3. 获取映射器对象IUserDao userDao sqlSession.getMapper(IUserDao.class);// 4. 测试验证String res userDao.queryUserName(10001);logger.info(测试结果{}, res); } 在单元测试中通过注册机扫描包路径注册映射器代理对象并把注册机传递给 SqlSessionFactory 工厂这样完成一个链接过程。之后通过 SqlSession 获取对应 DAO 类型的实现类并进行方法验证。 测试结果 22:43:23.254 [main] INFO cn.bugstack.mybatis.test.ApiTest - 测试结果你被代理了方法queryUserName 入参[Ljava.lang.Object;50cbc42fProcess finished with exit code 0 通过测试大家可以看到目前我们已经在一个有 Mybatis 影子的手写 ORM 框架中完成了代理类的注册和使用过程。 六、总结 首先要从设计结构上了解工厂模式对具体功能结构的封装屏蔽过程细节限定上下文关系把对外的使用减少耦合。从这个过程上读者伙伴也能发现使用 SqlSessionFactory 的工厂实现类包装了 SqlSession 的标准定义实现类并由 SqlSession 完成对映射器对象的注册和使用。本章学习要注意几个重要的知识点包括映射器、代理类、注册机、接口标准、工厂模式、上下文。这些工程开发的技巧都是在手写 Mybatis 的过程中非常重要的部分了解和熟悉才能更好的在自己的业务中进行使用。
http://www.pierceye.com/news/536280/

相关文章:

  • 怎么制作网站视频教程wordpress 导入图片
  • 淘宝网发布网站建设wordpress不能翻页
  • 怎么样可以做网站wordpress gallery widget
  • 湖北网站推广公司技巧自己做app的软件
  • 网站梦打开又提示无法访问dw网页设计代码茶文化
  • 阳江营销型网站建设wordpress防攻击插件
  • 深圳电信网络建站东莞房价2022最新价格
  • 昆山营销型网站建设温州网上商城网站建设
  • 网站html动态效果asp化妆品网站源码
  • 丹东网站seo国家企业工商网查询
  • 好看云在线网站模板江西省建设厅教育网站
  • 小网站百度做一个网站怎么做呢
  • 城市分站seoseo相关岗位
  • 购物网站开发语言wordpress分类指定页面
  • 中企动力做网站的优势做招聘网站经营范围
  • 重庆企业网站排名优化方法百度录入网站
  • 做薪酬调查有哪些网站校园二手交易网站设计的原则
  • 建设电子商务网站的方法有?网站架构图
  • 网站运营阶段wordpress首页没有显示文章图片
  • 2个小时学会网站建设手机兼职快递录单员
  • 以前有个自助建设网站东莞路桥投资建设公司招聘
  • 电子游艺网站开发常德seo技术
  • 河北邢台wap网站建设南昌网页制作
  • 山东建设人才网站高端母婴网站模板
  • 物业服务网站建设佛山做网站公司有哪些
  • 企业网站模板中文网站域名名字
  • 在服务器网站上做跳转网页设计代码动漫
  • 科协网站建设的意见合肥哪里有做网页的地方
  • 为企业做网站策划案永康网站推广
  • 做个企业网网站怎么做linux建网站