Spring MyBatis 学习笔记

1、O/R Mapping  对象关系映射

     Hibernate:不用写SQL语句,就可以把数据库记录查询出来变成对象,或者把对象插入数据库变成记录。性能问题:需要将操作转化成SQL语句,有时该SQL语句还比较长,需要再优化。

     JDBC:要写SQL语句,性能好,代码啰嗦。

     MyBatis:要写SQL语句,性能比JDBC差一点,比Hibernate好,代码比JDBC简洁,但不如Hibernate简洁。

2、MyBatis是一个开源的持久层框架,Apache ibatis  --->  Google mybatis  --->  GitHub  开源项目托管中心。

3、编程步骤:

     step1. 导包:mybatis 3.2.5,junit 4.12,ojdbc 10.2.0.4.0;

     step2. 添加配置文件;

     step3. 写实体类,实体类的属性名必须与表的字段名一致(名称相同,类型一致,大小写无所谓);

     step4. 写映射文件,告诉mybatis怎样将记录变为对象,或怎样将对象变为记录;记得将映射文件的位置添加到配置文件。

     step5. 利用mybatis提供的api来访问数据库。

4、工作原理:

     (1)SqlSessionFactory读取SqlMapConfig.xml配置文件,连接数据库,创建Connection,找到Mapper.xml文件的位置;

     (2)SqlSessionFactory依据Mapper.xml文件,创建Statement对象,构建成Map对象,Map对象的id为SQL语句的id;

     (3)SqlSessionFactory创建SqlSession对象,SqlSession根据sqlid获取Map中对应的statement,执行statement相应的方法;

     (4)SqlSession把查询出来的记录变成相应的对象,或List、Map。

     图示如下:

Spring MyBatis 学习笔记

5、返回Map类型的值

      SqlSession默认会将查询出来的记录中的数据放到一个Map对象里(字段名作为key,字段值作为value)。接下来,会将Map中的数据添加到对应的对象里面。

6、实体类的属性名与表的字段名不一致(代码重构时)

      方式一:使用别名:SELECT id empNo, ename name, age FROM emp,id是表中名,empNo是对象属性名

      方式二:使用<resultMap>元素。

7、Mapper映射器

      Mapper映射器的作用:mybatis依据Mapper接口(DAO接口)自动生成对应的DAO。

      使用步骤:

      step1. 写一个Mapper接口(DAO接口),该接口中的方法必须与映射文件中的SQL定义一致;

              a.方法名与SQL的id一样;

              b.参数类型与SQL定义中的参数类型一致;

              c.方法的返回类型与SQL定义中的返回类型一致。

      step2. 修改映射文件,namespace必须等于Mapper接口的完整的名称,包名+接口名;

      step3. 调用SqlSession的getMapper方法,该方法会返回一个实现了对应Mapper接口要求的对象。

8、Spring集成MyBatis

      集成步骤:

      step1. 导包:spring-webmvc 3.2.8,spring-jdbc 3.2.8,spring-mybatis 1.2.2,mybatis 3.2.5,dbcp 1.4,ojdbc 10.2.0.4.0,junit 4.12;

      step2. 添加Spring的配置文件;mybatis的配置信息添加到spring的配置文件里面。可以在spring的配置文件里面配置一个SqlSessionFactoryBean;

      step3. 写实体类;

      step4. 写映射文件;

      step5. 写Mapper映射器接口;

      step6. 配置MapperScannerConfigurer,负责将mybatis生成的Mapper对象放到spring容器里面(id默认等于首字母小写之后的Mapper接口名);Mapper对象:SqlSession.getMapper()的返回值,即Mapper接口的实现。

9、只扫描带有特定注解的Mapper接口

      在实际开发时,可能会有部分接口与mybatis无关,不需要MapperScannerConfigurer去扫描。

      step1. 自定义一个注解;

      step2. 将这个注解加到需要扫描的Mapper接口里面;

      step3. 为MapperScannerConfigurer设置annotationClass属性,告诉MapperScannerConfigurer哪些注解需要扫描。

10、Spring集成MyBatis的另外一种方式:

      step1. 导包:spring-webmvc 3.2.8,spring-jdbc 3.2.8,spring-mybatis 1.2.2,mybatis 3.2.5,dbcp 1.4,ojdbc 10.2.0.4.0,junit 4.12;

      step2. 添加Spring的配置文件;mybatis的配置信息添加到spring的配置文件里面。可以在spring的配置文件里面配置一个SqlSessionFactoryBean;

      step3. 写实体类;

      step4. 写映射文件;

      step5. 配置SqlSessionTemplate,对Mybatis的常用方法进行了封装;

      step6. 写一个DAO,注入SqlSessionTemplate,调用SqlSessionTemplate的方法即可。

11、MyBatis动态SQL

       可以在MyBatis动态拼凑SQL语句,MyBatis提供了一套标签,可以实现在XML中动态构建一个SQL语句,与JSTL相似。

       <if  test="">...</if>

       <choose>

              <when  test="">...</when>

              <when  test="">...</when>

              <otherwise>...</otherwise>

       </choose>                                          相当于switch...case语句

       <foreach>

       </foreach>

       <where></where>:  a. 顶替一个where关键字;b.过滤掉内容前面多余的and或or关键字。

       <set></set>:a. 顶替一个set关键字;b. 过滤掉内容后面多余的逗号字符。

       <foreach></foreach>         循环语句

       动态查询,动态拼凑一个select语句;动态更新,动态拼凑一个update语句。

       利用<foreach>循环构建in条件。

12、MyBatis关联映射

       对象关系映射ORM:实体对象O,关系型数据库R,映射Mapping。

       常见ORM工具:MyBatis(iBatis),Hibernate,JPA,TopLink,JDO,OJB。

       1. 实现一个表和一个对象类型映射(一行记录映射成一个实体对象);

       2. 实现对象关联映射(将多关联表数据封装成具有关系的对象实体);

       (1)单个对象关联映射<association>

                Book --> User(1个)

                <1>先用一个SQL查主对象,再另外发送一个SQL加载关联属性数据;

                <2>利用表join查询,将关联属性数据和主对象数据一起取出。

       (2)集合对象关联映射<collection>

                User --> Book(多个)

                <1>先用一个SQL查主对象,再另外发送一个SQL加载关联属性数据(适用查询单个User对象);

                <2>利用join查询一次性取出(适用查询多个User对象)。