Mybatis入门学习笔记(二)
1. Mybatis实现传统dao的开发
- 先写一个dao层接口,然后再写一个实现类。
- 传统dao开发上存在的问题:
- 方法调用:字符串易出错,硬编码。
2. mapper接口开发
- 编写接口(mapper接口,mybatis根据接口和映射文件创建接口)
- 编写全局配置
- 编写映射文件
- 映射文件和mapper接口同包同名;
- 接口的全限定名称必须和mapper映射文件的namespace一致
- 接口中的方法名称和映射文件中的标签保持一致,方法中的参数和映射文件中的parameterType或parameterMap保持一致,且方法的返回值类型和映射文件的resultType或resultMap保持一致
-
测试
3. 输出结果 ResultMap
3.1 junit 单元测试
- 加入相应的jar包
- 使用junit实现测试(@org.junit.test:作为单元直接运行)
- @Before:在test之前运行
- @After:在测试之后运行
import Mapper.DataMapper;
import entity.Data;
import org.apache.ibatis.session.SqlSession;
import util.MybatisUtils;
import java.util.List;
public class Test {
@org.junit.Test
public void test(){
SqlSession session= MybatisUtils.getSqlsession();
DataMapper mapper=session.getMapper(DataMapper.class);
List<Data> re = mapper.queryAll();
System.out.println(re);
MybatisUtils.closeSqlsession();
}
}
3.2 ResultMap
- ResultType: **如果实体类的属性名称与数据库表中的字段一一对应,则可以正确映射。若字段不对应,则无法封装。若实体类的属性名称与数据库表中的字段均不相同,则无法创建对象。
比如,现在属性名称和字段就全都不同了,运行~
发现什么都查不到~
解决方法:
- 起别名
- 使用ResultMap实现字段和属性之间的映射**
- ResultMap使用
- id:唯一标识
- type:封装的对象类型
- 描述主键字段和属性之间的映射关系
- 非主键字段映射**
<resultMap type=" " id=" ">
<id column=“ " property=" "/>
<result column=“ " property=" "/>
</resultMap
程序实例:
<resultMap type="entity.Data" id="Data">
<id column="newid" property="id"/>
<result column="newname" property="name"/>
<result column="newage" property="age"/>
</resultMap>
完美解决!!!
4. 动态SQL
- 利用if
<select id="queryCombo" parameterType="entity.Data" resultType="entity.Data">
select * from yangtingting where 1=1
<if test="id!=-1">
and id=#{id}
</if>
<if test="name!=null">
and name=#{name}
</if>
<if test="age!=-1">
and age=#{age}
</if>
</select>
- 利用choose设定查找优先级
<choose>
<when test="id!=-1">
and id=#{id}
</when>
<otherwise>
and age=#{age}
</otherwise>
</choose>
- where标签
- foreach
<select id="query" parameterType="List" resultType="entity.Data">
select * from yangtingting where id in
<foreach collection="list" index="index" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</select>
List list=new ArrayList<>();
list.add(3);
list.add(20);
List<Data> re = mapper.query(list);
System.out.println(re);
- 多表联查,关联查询
5. 延迟加载
5.1 概念
延迟加载,又叫做按需加载(懒加载),只加载主查询,需要用到子查询信息时才去查询。
注意: <collection>
和<association>
均具有延迟加载功能,但是默认关闭。
5.2 打开延迟加载
在全局配置文件中的settings标签中利用lazyLoadingEnabled进行配置。
<settings>
<setting name=’lazyLoadingEnabled‘ value='true'/>
<!--按版本配置 -->
<setting name=’aggressiveLazyLoading‘ value='false'/>
</settings>
6 缓存
6.1 一级缓存 cacheKey
mybatis中的一级缓存默认开启
在内存中的一块区域,以类似于map方式进行数据管理,当用户第一次查询时,会根据sql,参数,rowbands以及statement的id生成cacheKey,先从二级缓存中获取数据,如果为空,将从一级缓存中根据生成的key获取value值,如果也为空,就从数据库进行查询,然后将key和查询的结果放置在一级缓存中。
当用户再次查询时,仍旧生成cacheKey,通过key从一级缓存中获取值,如果有值此时将直接返回不再查询数据库。
一级缓存是session级别的缓存。一旦关闭session,缓存就失效。
如果执行增删改查会清空一级缓存。
6.2 二级缓存 cache
在内存中的一块区域,以类似于map方式进行数据管理,当用户第一次查询时,会根据sql,参数,rowbands以及statement的id生成cacheKey,先从二级缓存中获取数据,如果为空,将从一级缓存中根据生成的key获取value值,如果也为空,就从数据库进行查询,然后将key和查询的结果放置在一级缓存中。
当用户再次查询时,仍旧生成cacheKey,通过key从一级缓存中获取值,如果有值此时将直接返回不再查询数据库。
如果执行增删改查会清空二级缓存。
但是二级缓存是跨session的缓存。默认二级缓存是关闭的。同时,实体类必须序列化。
可以使用cache标签配置。
7. 逆向工程
生成单表的实体类、mapper接口和mapper映射文件。
mybatis-generator-core-1.3.2-bundle
mybatis需要程序员自己编写sql语句,mybatis官方提供逆向工程,可以针对单表自动生成mybatis执行所需要的代码(mapper.java、mapper.xml、pojo…),可以让程序员将更多的精力放在繁杂的业务逻辑上。
企业实际开发中,常用的逆向工程方式:由数据库的表生成java代码。
之所以强调单表两个字,是因为Mybatis逆向工程生成的Mapper所进行的操作都是针对单表的,也许你可能会觉得那这就有点鸡肋了,但是在大型项目中,很少有复杂的多表关联查询,所以作用还是很大的。