mybatis(1)+(2)小结

mybatis是什么?

mybatis是一人持久层框架,mybatis是一个不完全的ORM框架。sql语句需要程序员自己去编写,但是mybatis也有映射(输入参数映射、输出结果映射)。

mybatis入门门槛不高,学习成本低,让程序员把精力放在sql语句上,对sql语句优化非常方便,适用与需求变化较多项目,比如互联网项目。

mybatis框架执行过程:

1、配置mybatis的配置文件,SqlMapConfig.xml(名称不固定),需要将配置文件引入 

                // mybatis配置文件
		String resource = "SqlMapConfig.xml";
		// 得到配置文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);

2、通过配置文件,加载mybatis运行环境,创建SqlSessionFactory会话工厂

         SqlSessionFactory在实际使用时按单例方式。

3、通过SqlSessionFactory创建SqlSession

         SqlSession是一个面向用户接口(提供操作数据库方法),实现对象是线程不安全的,建议sqlSession应用场合在方法体内。

4、调用sqlSession的方法去操作数据。

         如果需要提交事务,需要执行SqlSession的commit()方法。

5、释放资源,关闭SqlSession

 

mybatis开发dao的方法:

1、原始dao 的方法

         需要程序员编写dao接口和实现类

         需要在dao实现类中注入一个SqlSessionFactory工厂。

 

2、mapper代理开发方法(重点

         只需要程序员编写mapper接口(就是dao接口)

         程序员在编写mapper.xml(映射文件)和mapper.java需要遵循一个开发规范:

         1、mapper.xml中namespace就是mapper.java的类全路径。

         2、mapper.xml中statement的id和mapper.java中方法名一致。

         3、mapper.xml中statement的parameterType指定输入参数的类型和mapper.java的方法输入 参数类型一致。

         4、mapper.xml中statement的resultType指定输出结果的类型和mapper.java的方法返回值类型一致。

 

SqlMapConfig.xml配置文件:可以配置properties属性、别名、mapper加载。。。

 

输入映射:

         parameterType:指定输入参数类型可以简单类型、pojo、hashmap。。

         对于综合查询,建议parameterType使用包装的pojo,有利于系统 扩展。

 

输出映射:

         resultType:

                   查询到的列名和resultType指定的pojo的属性名一致,才能映射成功。

         reusltMap:

                   可以通过resultMap完成一些高级映射。

                如果查询到的列名和映射的pojo的属性名不一致时,通过resultMap设置列名和属性名之间的对应关系(映射关系)。可以完成映射。

                   高级映射:

                            将关联查询的列映射到一个pojo属性中。(一对一)

                            将关联查询的列映射到一个List<pojo>中。(一对多)

动态sql:(重点)

         if判断(掌握)

         where

         foreach

         sql片段(掌握)


博主设置当前文章不允许评论。

iterator小结1

03-28

SGI STL结构之一:Iteratorsrn1. SGI STL中Iterators包含的五个文件rnIterators是STL中的关键组件,SGI STL中头文件iterators包含五个文件,它们是:stl_config.h,stl_relop.h,stddef.h,iostream.h和stl_iterator.h。下面将逐个分析五个文件的内容和作用。rn1.1. stl_config.hrn由于不同的编译环境对标准C++的支持不完全相同,出于移植性的考虑,SGI STL定义了这个文件。它通过条件编译针对不同的编译器作了部分常数设定,对编译器的设定如下:rn1) 如果没有定义bool,true,false,定义 __STL_NEED_BOOL。rn2) 如果不支持drand48(采用了48bit计算,产生双精度的伪随机数),定义 __STL_NO_DRAND48。rn3) 如果不支持类模板的静态成员,定义 __STL_STATIC_TEMPLATE_MEMBER_BUG。rn4) 如果不支持关键字typename,定义typename为一个空宏(null macro)。rn5) 如果支持类模板局部特殊化(partial specialization of class templates),定义 __STL_CLASS_PARTIAL_SPECIALIZATION。rn6) 如果支持函数模板局部特殊化(partial specialization of function templates),定义 Defines __STL_FUNCTION_TMPL_PARTIAL_ORDER。rn7) 如果函数模板可以指明参数类型,定义 __STL_EXPLICIT_FUNCTION_TMPL_ARGS(SGI STL中未使用)。rn8) 如果类中可定义函数模板为成员,定义 __STL_MEMBER_TEMPLATES。rn9) 如果不支持关键字explicit,定义explicit为为一个空宏。rn10) 如果不能根据前一个模板参数设定后一个模板参数,定义 __STL_LIMITED_DEFAULT_TEMPLATES。rn11) 如果对无类型模板参数(non-type template parameters)执行函数模板的参数推导出错,定义 __STL_NON_TYPE_TMPL_PARAM_BUG。rn12) 如果不支持iterators的->操作符,定义 __SGI_STL_NO_ARROW_OPERATOR。rn13) 如果支持异常处理(exceptions),定义 __STL_USE_EXCEPTIONS。 rn14) 如果把STL放在一个namespace中,定义 __STL_USE_NAMESPACES。rn15) 如果使用SGI编译,没有选择pthreads或其他threads,定义 __STL_SGI_THREADS。 rn16) 如果使用WIN32的多线程模式(multithreaded mode)编译,定义 __STL_WIN32THREADS。rn17) 适当定义namespace相关宏(__STD, __STL_BEGIN_NAMESPACE, 等)。rn18) 适当定义exception相关宏 (__STL_TRY, __STL_UNWIND, 等)。rn19) 如果没有定义__STL_ASSERTIONS,定义__stl_assert为一个空宏。rn20) 如果定义__STL_EXPLICIT_FUNCTION_IMPL_ARGS,定义__STL_NULL_TMPL_ARGS为<>,否则为空宏。rn21) 如果定义__STL_CLASS_PARTIAL_SPECIALIZATION,定义__STL_TEMPLATE_NULL为template <>,否则为空宏。rn文件选择了常见的编译环境,包括:g++,VC和C++builder。比较而言,g++对标准C++的支持程度最强。在21条中出现了部分有效、但很少使用的特殊的C++语法及技巧,如3、5、6、8、10、11、20、21。rn1.2. stl_relop.hrn这个文件对 !=、>、<=、>= 四个比较运算符,结合模板进行了重载,使之可以用于任何类型的比较。rn1.3. stddef.hrnC++的库函数,也是通过宏的方法定义一些常数。例如: ptrdiff_t(表示两个指针的差运算结果),size_t(最大的指针值),等。rn1.4. iostream.hrnC++的标准输入/输出库函数。rn1.5. stl_iterator.hrn这是SGI STL中iterators组件的核心部分,下面自顶向下逐步分析。rn2. Iterators简化模型rnIterators是算法与容器的接口,是在C++语言指针的基础上作封装而产生的聪明的指针(smart pointer)。下面我们来看看通用算法find()如何通过myiter访问mylist。rnSGI STL中算法find()的代码如下:rnTemplate rnstruct Itemrnrn T data;rn Void * next; //也可定义为Item * nextrnrnmylist是有Item组成的一个链。结合上面对find要求的讨论,定义myiter如下(InputIterators的部分):rntemplate rnstruct Myiterrnrn Item *ptr; //与保持 mylist 的联系rn Myiter(Item* p=0):ptr(p) rnrn Item & operator *() const return *ptr; //对应 *first 运算要求rnrn Item * operator ->() const return ptr;rn Item & operator ++() const ptr=ptr->next(); return *this; //对应 ++firstrnrn bool operator !=(const Myiter & i) const return ptr != i.ptr; //对应 first != lastrn;rnrntemplate rnbool operator != (const Item &item, T n) return item.data != n; //对应 *first != valuernrn这样可以使用 find(Myiter>(listHead), Myiter>(),5)进行搜索。正是因为iterators的设计需要知道容器的许多细节,所以STL的容器都提供专属的iterators。

iterator小结2

03-28

3. Iterators的概念(concept)rn我们知道iterators分成5类(Input iterators、Output iterators、Forward iterators、Bidirectional iterators、Random access iterators),那么是怎样形成的呢?这就需要从概念说起了。rn3.1. 概念(concept)、模型(model)和细化(refinement)rn概念C是指描述某种抽象类型的一组需求(requirements),例如,上面定义myiter之前我们提出的要求(first != last;*first != value;++first)就可以作为一个概念看待。再STL中的概念很多,常见的基本概念有:assignable、default constructible、equality comparable、lessthan comparable、range等rn类型T能够满足概念C所有的需求,则称T为C的一个模型(model)。rn概念C1的需求req1包含概念C2的需求req2,则C1对C2作了细化。例如:五中iterators中概念Bidirectional iterators是对Forward iterators的细化。rn关于类的继承,我们知道类A继承了类B是指类A在类B的成员变量和成员函数的基础上定义新的成员变量和成员函数。细化和继承都是在原有的基础上作扩展,因此看起来很相似,但两者有本质的区别:rn1) 就继承而严,如果类A继承了类B,而a是A的对象,b是B的对象,那么我们可以说a也是B的对象,却不能说b也是A的对象。rn2) 相反,如果C1细化了C2,而T1是C1的模型,T2是C2的模型,那么不可以说T1是C2的模型,却能说T2是C1的模型。例如:概念Bidirectional iterators细化了概念Forward iterators,可使用满足后者模型之处,都可使用前者产生的模型,反之不然。rn对于概念的理解可以从三个角度:(1)描述某种抽象类型的一组需求;(2)某类抽象类型的组合;(3)一组正确的代码。第三点比较难理解,但很有用,因为概念的发现不是通过列举需求,而是通过对算法的定义及形式化模板参数的研究取得的。(对如何通过Tecton语言的描述产生新概念,还需要进一步学习)。rn3.2. Input IteratorsrnInput iterators的概念是研究find算法的过程中总结出来的。相对于自己定义的myiter,Input Iterators的需求更完备和具体:rn1) 能进行构造或缺省构造rn2) 能被复制或赋值rn3) 能进行相等性比较rn4) 能进行逐步前向移动(++)rn5) 能进行读取值(x=*p,但不能改写)rn其中,1、2点是所有iterators都要具备的,3、4、5是Input Iterators所需要的。rn3.3. Output IteratorsrnOutput iterators的概念可以相对copy算法理解。copy算法:rnTemplate rnOutputIterator copy (InputIterator first, InputIterator last, OutputIterator result)rnrn for( ; first != last; ++result, ++first) *result = * first;rn return result;rnrnresult就是OutputIterators的一个模型,它的要求包括:++result、*result = * first。这样,Output Iterator的需求包括:rn1) 能进行构造或缺省构造rn2) 能被复制或赋值rn3) 能进行逐步前向移动(++)rn4) 能进行写入值(*p=x,但不能读出)rn3.4. Forward Iteratorsrn使用Input Iterators 和Output Iterators可以满足算法和容器的要求,但还是有一些算法需要同时具备两者的功能,例如replace算法就是一例。Forward iterators就是为满足这些需求而定义的。同样先看看replace算法(用新值代替旧值)的需求:rntemplate rnvoid replace ( ForwardIterator first, ForwardIterator last, const T&old_value, const T& new_value)rnrn for( ; first != last; ++fist) rnif (*first == old_value) *first = new_value;rnrnfirst、last都是Forward Iterators的模型,它们的要求包括:first != last、++fist、*first == old_value、*first = new_value。这样,Forward Iterators的需求包括:rn1) 能进行构造或缺省构造rn2) 能被复制或赋值rn3) 能进行相等性比较rn4) 能进行逐步前向移动(++)rn5) 能进行读取、写入值(x=*p,且可*p=x)rn3.5. Bidirectional IteratorsrnBidirectional Iterators的概念是在Forward iterators的基础上加入逐步后向移动(--)这个要求,从而满足两个方向的运动。rn3.6. Random Access IteratorsrnRandom Access Iterators的条件(需求)更多,它覆盖前四种iterators的所有条件,并且要满足下面条件(对数组的操作要求):rn1) Operator + (int) //随机访问iterators可以随机移动,而不是逐步的。rn2) Operator += (int)rn3) Operator - (int)rn4) Operator -= (int)rn5) Operator - (random access iterator)rn6) Operator [] (int) //随机取某的位置容器的值rn7) Operator < (random access iterator) //随机访问iterators之间的比较rn8) Operator > (random access iterator)rn9) Operator <= (random access iterator)rn10) Operator >= (random access iterator)rn

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试