MyBatis学习整理0

学习java的基本都会“ssh”,我也不例外,其中就包括了hibernate,当时感受挺神奇的,去年开始接触mybatis,一对比发现,这mybatis有很多优势。java

下面分享一下我在学习mybatis的时候整理的内容。sql

一、组织

基本配置的xml
映射关系的xml
映射的接口
获取`session`的工具类
实体类编程

这里须要注意的是:session

  1. 两个xml文件都是使用dtd进行约束描述的,(dtd文件不同);
  2. 基本配置的xml文件配置项是有顺序的,properties,settings,typeAliases,typeHandlers,objectFactory,objectWrapperFactory,plugins,environments,databaseIdProvider,mappers;
  3. 映射配置可使用xml也可使用接口类,并且能够共存;
  4. 使用接口类进行映射配置,不须要写实现类,只须要在接口方法上进行注解配置便可;
  5. 接口上注解配置映射时,能够直接写sql,也可使用单独的工具类提供sql,不一样的注解配置;
  6. 对于使用单独工具类为注解接口提供sql的状况,须要在注解时为参数提供名字,同时工具类中使用`SQL`类,进行链式编程

二、实体类中的属性名和表中的字段名不一致时

当实体类中的属性名和表中的字段名不一致时,使用MyBatis进行查询操做时没法查询出相应的结果的问题以及针对问题采用的两种办法:mybatis

1. 经过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致,这样就能够表的字段名和实体类的属性名一一对应上了,
    这种方式是经过在sql语句中定义别名来解决字段名和属性名的映射关系的。app

2. 经过`<resultMap>`来映射字段名和实体类属性名的一一对应关系。这种方式是使用MyBatis提供的解决方式来解决字段名和属性名的映射关系的。ssh

三、SQL类的链式编程

首先须要新建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属性指定集合中元素的对象类型。

五、mybatis中调用存储过程

在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

六、补充说一下

可能会以为奇怪,怎么感受文章里面的内容了乱七八糟的?这里面的内容是我当时学习的时候记下来的,如今只是粘在了一块儿而已,下一篇将慢慢叙述知识点了

相关文章
相关标签/搜索