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。
图示如下:
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对象)。