学习java的基本都会“ssh”,我也不例外,其中就包括了hibernate,当时感觉挺神奇的,去年开始接触mybatis,一对比发现,这mybatis有不少优点。
下面分享一下我在学习mybatis的时候整理的内容。
1、组织
基本配置的xml
映射关系的xml 映射的接口 获取`session`的工具类 实体类这里需要注意的是:
- 两个xml文件都是使用dtd进行约束描述的,(dtd文件不一样);
- 基本配置的xml文件配置项是有顺序的,properties,settings,typeAliases,typeHandlers,objectFactory,objectWrapperFactory,plugins,environments,databaseIdProvider,mappers;
- 映射配置可以使用xml也可以使用接口类,而且可以共存;
- 使用接口类进行映射配置,不需要写实现类,只需要在接口方法上进行注解配置即可;
- 接口上注解配置映射时,可以直接写sql,也可以使用单独的工具类提供sql,不同的注解配置;
- 对于使用单独工具类为注解接口提供sql的情况,需要在注解时为参数提供名字,同时工具类中使用`SQL`类,进行链式编程
2、实体类中的属性名和表中的字段名不一致时
当实体类中的属性名和表中的字段名不一致时,使用MyBatis进行查询操作时无法查询出相应的结果的问题以及针对问题采用的两种办法:
1. 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致,这样就可以表的字段名和实体类的属性名一一对应上了,
这种方式是通过在sql语句中定义别名来解决字段名和属性名的映射关系的。2. 通过`<resultMap>`来映射字段名和实体类属性名的一一对应关系。这种方式是使用MyBatis提供的解决方式来解决字段名和属性名的映射关系的。
3、SQL类的链式编程
首先需要新建SQL类的实例,然后调用构造sql的方法
该类的每一个方法均返回当前对象的引用,故使得链式编程成为可能,按照sql语句的顺序依次调用对应的方法即可
在构造中,函数会接收到一个`Map<String, Object>`的对象列表,里面键就是对应接口方法的参数的注解名称,在向对应的`SQL`的方法传参数的时候要使用对应的占位符,例如对于键`id`,需要使用占位符`#{id}`,甚至可以加上数据的类型`#{id,javaType=string,jdbcType=VARCHAR}`
4、关联映射
一对一
处理一对一的关联映射,可以按照两种处理思路:
- 一次查询出需要的数据,在作映射的时候进行嵌套
- 分两次进行查询,根据第一次查询出来的结果进行第二次查询两种处理方式都需要使用到`association`标签,分别的用法为(分别对应两种处理方式):
`association`标签可用的属性如下:
- property:对象属性的名称
- javaType:对象属性的类型 - column:所对应的外键字段名称 - select:使用另一个查询封装的结果一对多
处理一对多关联和处理一对一关联类似,使用collection标签来解决一对多的关联查询,ofType属性指定集合中元素的对象类型。
5、mybatis中调用存储过程
在xml中还是普通的标签,但是多了属性`statementType="CALLABLE"`,
并且配置单独的parameterMap属性和节点进行参数的配置,使用mode="IN"配置参数的类型在调用的时候和普通的调用没什么较大的区别,只是返回的值是通过从传入的map中获取的,而不是方法的返回值
String statement = "mapper.userMapper.getUserCount";// 映射sql的标识字符串 MapparameterMap = new HashMap (); parameterMap.put("sexid", 0); parameterMap.put("usercount", -1); sqlSession.selectOne(statement, parameterMap); Integer result = parameterMap.get("usercount"); System.out.println(result);
对应查询方法的返回值是null
6、补充说一下
可能会觉得奇怪,怎么感觉文章里面的内容了乱七八糟的?这里面的内容是我当时学习的时候记下来的,现在只是粘在了一起而已,下一篇将慢慢叙述知识点了