Mybatis入门学习笔记(二)

1. Mybatis实现传统dao的开发

  1. 先写一个dao层接口,然后再写一个实现类。
  2. 传统dao开发上存在的问题:
  • 方法调用:字符串易出错,硬编码。

2. mapper接口开发

  1. 编写接口(mapper接口,mybatis根据接口和映射文件创建接口)
  2. 编写全局配置
  3. 编写映射文件
  • 映射文件和mapper接口同包同名;
  • 接口的全限定名称必须和mapper映射文件的namespace一致
  • 接口中的方法名称和映射文件中的标签保持一致,方法中的参数和映射文件中的parameterType或parameterMap保持一致,且方法的返回值类型和映射文件的resultType或resultMap保持一致
  1. 测试

    项目示例及报错处理

3. 输出结果 ResultMap

3.1 junit 单元测试

  1. 加入相应的jar包
  2. 使用junit实现测试(@org.junit.test:作为单元直接运行)
  3. @Before:在test之前运行
  4. @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

  1. ResultType: **如果实体类的属性名称与数据库表中的字段一一对应,则可以正确映射。若字段不对应,则无法封装。若实体类的属性名称与数据库表中的字段均不相同,则无法创建对象。
    比如,现在属性名称和字段就全都不同了,运行~

在这里插入图片描述

在这里插入图片描述
发现什么都查不到~

解决方法
- 起别名
- 使用ResultMap实现字段和属性之间的映射**

  1. 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

  1. 利用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>
  1. 利用choose设定查找优先级
        <choose>
            <when test="id!=-1">
                and id=#{id}
            </when>
            <otherwise>
                and age=#{age}
            </otherwise>
        </choose>
  1. where标签
    在这里插入图片描述
  2. 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);
  1. 多表联查,关联查询

在这里插入图片描述

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所进行的操作都是针对单表的,也许你可能会觉得那这就有点鸡肋了,但是在大型项目中,很少有复杂的多表关联查询,所以作用还是很大的。

示例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

就是二二二二婷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值