1.MyBatis框架学习笔记

1.MyBatis框架学习笔记

一. 环境搭建

  • 1.导入myBatis官方jar包,若需要访问源码需导入相应的file路径;

  • 2.xml配置文件的编写

    (1).导入DTD编写规范文件:
    window -->preferences -->xml–>xml cataog -->fileSystem–>本地文件 -->myBatis相关的DTD约束文件;

    (2).新建configuration标签,添加框架使用的数据库信息等

    在这里插入图片描述

  • 3.底层实现类(mapper)编写:

    (1) 新建以mapper结尾的包名,存放底层实现(DAO)的xml配置文件
    (名称为包名+Mapper);

    (2) 在该xml配置文件写以下内容:

    在这里插入图片描述
    在这里插入图片描述

  • 4.测试类的编写:

      	若项目整合了SSM框架,则无需单独写以下测试类
    

    icon

      1.注意selectList中的包名必须是完整的包名+类名
    
  • 5.将SqlSessionFactory创建SqlSession的过程封装为单独的工具类

      1.采用fliter管理SqlSession的创建,事务提交,事务回滚的全过程
    

    在这里插入图片描述
    2.由于同一次业务使用了同一个SqlSession对象,无需在执行每一次事务时重复进行创建SqlSession对象;
    3.因此在工具类中采用了容器ThreadLocal来装入创建好的SqlSession对象,
    用于保证同一次业务中,每一次事务执行时调用的SqlSession对象都是最先执行事务的所创建的SqlSession对象,

        原理:相同线程的对象才能调用ThreadLocal的get()方法后并成功获取其中存储的对象,由于同一次业务中的事务属于一个
        线程,因此能够获得其中的内容
    

在这里插入图片描述

  • 6.从工具类剖析myBatis运行原理

    (1)先由Resource对象读取myBatis的配置文件xml,获取相关的连接数据库信息,实体类别名信息,映射类(mapper 类似jsp+servlet模式的dao层)信息,

    (2)实例化SqlSessionFactoryBuilder构建器,并且XMLConfigBuilder解析配置文件的IO流,并将解析信息存储进入Configuration对象中,从而实例化SqlSessionFactory对象的实现类DefaultSqlSessionFactory,完成SqlSessionFactory对象的创建

    (3)由创建完成的SqlSessionFactory对象创建SqlSession对象,并且需要由TransactionFactory创建Transaction对象(每次创建SqlSession对象所伴随创建),以及创建SqlSession所需要的执行器对象Excutor,最终实例化DefaultSqlSession实现类

    (4)由生成的SqlSession对象调用内部接口的API,并传入事务相关内容(mapper命名空间+id[方法名])

二.相关方法

  • 7.myBatis中调用Sql语句命令的执行方案

    1.采用mapper包只用于存放相应的Mapper文件,并对其中sql语句进行调用:

      (1).service类编写的代码:[命名空间+方法的id]
      session = myUtil02.getSession();
      List<student> list =session.selectList("test1.dao.selAll");
    
      (2).Mapper类中编写的代码:
      <mapper namespace="test1.dao">//命名空间可以不与这个Mapper路径一致
      <!-- resultType:返回值的类型,可以加上相关的JavaBean文件的全路径以声明该类型 -->
      <select id="selAll" resultType="student">
      	select * from stus
      </select>
      </mapper>
    
      (3).配置文件.xml中编写的代码(注册Mapper类)
        <mappers>
          <mapper resource="com/testMybatis/Mapper/studentMapper.xml"/>
        </mappers>
    

    2.采用接口映射,mapper包中存储Mapper文件以及其对应的Mapper接口(myBatis方案)

      原理:采取动态代理模式,通过该接口调用在Mapper文件所对应的方法,代码如下:
    
      SqlSession session = myBatisUtil.getSession();
      //对绑定接口进行声明
      BalanceMapper bm = session.getMapper(BalanceMapper.class);
      Account accOutSel =bm.checkID(accOut);
    
      注意处:(1).命名空间必须与接口路径一致,方法名id必须与接口方法名一致(类似于DAO)
      	  (2).在配置文件.xml中,mappers所填的标签为<package>	
    

    3.方法2的进一步简化版本,无需写Mapper文件,只需在接口方法上添加注解,适用于简单的CRUD:

      	实现查询
      	@Select("select * from teacher")
      	List<Teacher> selAll();
      	
      	实现新增
      	@Insert("insert into teacher
      	values(default,#{name})")
      	int insTeacher(Teacher teacher);
    
      	实现修改
      	@Update("update teacher set name=#{name} where
      	id=#{id}")
      	int updTeacher(Teacher teacher);
    
      	实现删除
      	@Delete("delete from teacher where id=#{0}")
      	int delById(int id);	
    
      注释:1.parameterType 控制参数类型:
      	 #{}获取参数内容
      	(1)使用索引,从 0 开始 #{0}表示第一个参数
      	(2)也可以使用#{param1}第一个参数
      	(3)如果只有一个参数(基本数据类型或 String),mybatis
      	   对#{}里面内容没有要求只要写内容即可. 2.2.2.4 如果参数是对象#{属性名}
      	(4)如果参数是 map 写成#{key}
    
      	2.`#{}`和 `${}` 的区别
      	` #{} `获取参数的内容支持 索引获取,param1 获取指定位置参数, 并且 SQL 使用?占位符
      	` ${} `字符串拼接不使用?,默认找${内容}内容的 get/set 方法,如
      	果写数字,就是一个数字
    
  • 8.pojo实体类的设计

    1.存放事务所产生的数据库查询结果(如学生信息表,单独的学生对象等等)

    2.存储业务所产生的事务结果总和(例如pageInfo,表格,错误信息等等)

    3.在注册文件xml中,可以对pojo类起别名,减少代码量,如:

      <typeAliases>
      	<typeAlias type="com.bjsxt.pojo.People" alias="peo"/>
      </typeAliases>
      //可以直接在returnType中写peo,代替包名+类名的写法
    
  • 9.缓存:

  •   	缓存
      	1. 应用程序和数据库交互的过程是一个相对比较耗时的过程
      	
      	2. 缓存存在的意义:让应用程序减少对数据库的访问,提升程序运行效率
      	
      	3. MyBatis 中默认 SqlSession 缓存开启
      	3.1 同一个 SqlSession 对象调用同一个<select>时,只有第一次访问
      	数据库,第一次之后把查询结果缓存到 SqlSession 缓存区(内存)中
      	3.2 缓存的是 statement 对象.(简单记忆必须是用一个<select>)
      	3.2.1 在 myabtis 时一个<select>对应一个 statement 对象
      	3.3 有效范围必须是同一个 SqlSession 对象
    
      	4. 缓存流程
      	4.1 步骤一: 先去缓存区中找是否存在 statement
      	4.2 步骤二:返回结果
      	4.3 步骤三:如果没有缓存 statement 对象,去数据库获取数据
      	4.4 步骤四:数据库返回查询结果
      	4.5 步骤五:把查询结果放到对应的缓存区中
      	
      	5. SqlSessionFactory 缓存
      	5.1 又叫:二级缓存
      	5.2 有效范围:同一个 factory 内哪个 SqlSession 都可以获取
      	5.3 什么时候使用二级缓存:
      	5.3.1 当数据频繁被使用,很少被修改
      	5.4 使用二级缓存步骤
      	5.4.1 在 mapper.xml 中添加
      	5.4.2 如果不写 readOnly=”true”需要把实体类序列化
      	<cache readOnly="true"></cache>
      	5.5 当 SqlSession 对象 close()时或 commit()时会把 SqlSession 缓存
      	的数据刷(flush)到 SqlSessionFactory 缓存区中
    
  • 10 动态sql:参照复习笔记及源码

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值