学习java的基本都会“ssh”,我也不例外,其中就包括了hibernate,当时感受挺神奇的,去年开始接触mybatis,一对比发现,这mybatis有很多优势。java
下面分享一下我在学习mybatis的时候整理的内容。sql
基本配置的xml
映射关系的xml
映射的接口
获取`session`的工具类
实体类编程
这里须要注意的是:session
当实体类中的属性名和表中的字段名不一致时,使用MyBatis进行查询操做时没法查询出相应的结果的问题以及针对问题采用的两种办法:mybatis
1. 经过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致,这样就能够表的字段名和实体类的属性名一一对应上了,
这种方式是经过在sql语句中定义别名来解决字段名和属性名的映射关系的。app
2. 经过`<resultMap>`来映射字段名和实体类属性名的一一对应关系。这种方式是使用MyBatis提供的解决方式来解决字段名和属性名的映射关系的。ssh
首先须要新建SQL类的实例,而后调用构造sql的方法ide
该类的每个方法均返回当前对象的引用,故使得链式编程成为可能,按照sql语句的顺序依次调用对应的方法便可函数
在构造中,函数会接收到一个`Map<String, Object>`的对象列表,里面键就是对应接口方法的参数的注解名称,在向对应的`SQL`的方法传参数的时候要使用对应的占位符,例如对于键`id`,须要使用占位符`#{id}`,甚至能够加上数据的类型`#{id,javaType=string,jdbcType=VARCHAR}`工具
处理一对一的关联映射,能够按照两种处理思路:
- 一次查询出须要的数据,在做映射的时候进行嵌套
- 分两次进行查询,根据第一次查询出来的结果进行第二次查询
两种处理方式都须要使用到`association`标签,分别的用法为(分别对应两种处理方式):
<association property="teacher" javaType="Teacher"> <id property="id" column="t_id" /> <result property="name" column="t_name" /> </association>
<association property="teacher" column="teacher_id" select="getTeacher" /> <!-- 须要借助另外的一个查询映射配置 -->
`association`标签可用的属性以下:
- property:对象属性的名称
- javaType:对象属性的类型
- column:所对应的外键字段名称
- select:使用另外一个查询封装的结果
处理一对多关联和处理一对一关联相似,使用collection标签来解决一对多的关联查询,ofType属性指定集合中元素的对象类型。
在xml中仍是普通的标签,可是多了属性`statementType="CALLABLE"`,
而且配置单独的parameterMap属性和节点进行参数的配置,使用mode="IN"配置参数的类型
<!-- 查询获得男性或女性的数量, 若是传入的是0就女性不然是男性 --> <select id="getUserCount" parameterMap="getUserCountMap" statementType="CALLABLE"> CALL ges_user_count(?,?) </select> <!-- parameterMap.put("sexid", 0); parameterMap.put("usercount", -1); --> <parameterMap type="java.util.Map" id="getUserCountMap"> <parameter property="sexid" mode="IN" jdbcType="INTEGER" /> <parameter property="usercount" mode="OUT" jdbcType="INTEGER" /> </parameterMap>
在调用的时候和普通的调用没什么较大的区别,只是返回的值是经过从传入的map中获取的,而不是方法的返回值
String statement = "mapper.userMapper.getUserCount";// 映射sql的标识字符串 Map<String, Integer> parameterMap = new HashMap<String, Integer>(); parameterMap.put("sexid", 0); parameterMap.put("usercount", -1); sqlSession.selectOne(statement, parameterMap); Integer result = parameterMap.get("usercount"); System.out.println(result);
对应查询方法的返回值是null
可能会以为奇怪,怎么感受文章里面的内容了乱七八糟的?这里面的内容是我当时学习的时候记下来的,如今只是粘在了一块儿而已,下一篇将慢慢叙述知识点了