java: ------ Mybatis框架

一、概述

1.现在JDBC代码的问题

1) 存在大量的冗余代码,不同表的DAO操作,操作步骤相同只是SQL语句不同
2) 给?占位符设置麻烦,需要手动完成
3) 针对查询结果的处理比较麻烦,需要手动封装实体
4) SQL语句 写在JAVA代码中,导致SQL的维护麻烦

2.概念

MyBatis框架是一个基于java的 持久层框架,主要用于 对数据库进行增删改查 等操作。
是对现有JDBC-DAO层代码的合理封装,可以自动完成对象关系映射 (ORM),极大的简化开发,提高开发效率。

3.与JDBC的对比

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cRz8e7tf-1594363100300)(assets/1570718159192.png)]

二、环境搭建

1.导jar包

在这里插入图片描述

2.配置文件

在这里插入图片描述

在这里插入图片描述

事务管理用JDBC在这里插入图片描述

连接池:用POOLED在这里插入图片描述

3.测试环境

三、第一个程序(查一个)

开发步骤(查1个) :
	1. 根据表结构,定义实体类(同JDBC)
	2. 创建DAO接口(同JDBC)
	3. 使用mapper映射文件,实现接口【重点】
	4. 注册mapper文件(在mybatis-config.xml核心配置文件)【重点】
	5. 测试

1.创建实体类

同JDBC。
注意:必须有 默认的公共无参构造方法!

2.创建DAO接口

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dNnyjgoQ-1594363100307)(assets/1570724180041.png)]

3.创建mapper文件

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uZrVyqEJ-1594363100308)(assets/1570724894284.png)]

4.注册mapper文件

在mybatis-config.xml中,注册mapper文件

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1rJ9Yi04-1594363100309)(assets/1570725181408.png)]

5.测试

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hkzJcGnl-1594363100310)(assets/1570726530879.png)]

注意:

  • 查询默认不参加事务
  • 增删改需要控制事务
注意:查询时,MyBatis根据"查询结果的字段名" 给"同名属性" 赋值! 如果没找到同名属性,则赋值失败!

在这里插入图片描述

  • 注解:给sql语句字段起别名 别名==实体类的属性名

四、其它CRUD操作

1.查所有

在这里插入图片描述

2.模糊查询

在这里插入图片描述

3.删除

  • 增删改注意要加事务

在这里插入图片描述
在这里插入图片描述
​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-baNW0Ozc-1594363100312)(assets/1570728184307.png)]

4.添加

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bq1t8xO1-1594363100313)(assets/1570728013662.png)]

5.增强添加

使用序列自动生成主键值,并且添加成功后,于获取新添加的主键值。

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xBImV0e5-1594363100313)(assets/1570728907182.png)]

6.修改

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UHyl6qto-1594363100314)(assets/1570728128170.png)]

五、MyBatisUtil工具类的封装

借鉴jdbcUtil工具类的封装。

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MbkPPWn6-1594363100314)(assets/1570729110992.png)]

六、方法的多参处理

1.特殊字符的处理

​ 1) 使用实体引用

在这里插入图片描述

  • 小于号<需要替换 大于号>不需要替换
<select id="" >
	select ... from ... where price &lt; #{price}
</select>
  1. 使用CDATA
<select id="" >
	<![CDATA[
		select ... from ... where price < #{price}
	]]>
</select>

2.分页查询

  • Mybatis中如果mapper需要从dao层接受多个参数 在dao层的参数需要使用@Param(“别名”)分别给多个参数定义名称
  • #{}中只能取值,不能做运算
    在这里插入图片描述

七、JDBC业务层的修改

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Oe78KNd-1594363100316)(assets/1570726929881.png)]

八、mybatis对null值的处理

mybatis3.x中,往数据库添加/修改字段值时,如果内容是null,会出现异常信息,如下图所示:无效的1111

在这里插入图片描述

解决方法:在mapper文件是给字段赋值时使用jdbcType,语法:#{属性名,jdbcType=类型}

在这里插入图片描述

九、核心配置文件的补充

1.类型别名

  • 不建议使用 找错 维护不方便
    ​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sDeFPPBv-1594363100318)(assets/1570809093661.png)]

2.引入小配置文件

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3HywzFHo-1594363100319)(assets/1570809423168.png)]

十、mybatis的关系映射

1.DB中表和表的关系

数据库中,两张表有关联关系,需要使用外键(Foreign Key)进行定义。
	1.一对一		学生 和 电脑
	2.一对多(多对一)	班级 和 学生  (学生和班级)
	3.多对多		学生 和 课程

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XJZWUNTI-1594363100319)(assets/1570813830270.png)]

2.单向多对一

DB中,两张表的关联关系  使用 外键定义!
mybatis中的关系 使用 关系属性!

2.1定义关系属性

在这里插入图片描述

2.2定义dao接口

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-juJztQHB-1594363100320)(assets/1570815372748.png)]

2.3查询结果的手动映射

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yVFhTmbg-1594363100321)(assets/1570816302896.png)]

在这里插入图片描述

经典出错案例:

  • 没用在mybatis-config.xml中注册mapper.xml的文件位置

在这里插入图片描述

2.4添加功能

添加页面:1) 使用下拉列表 列出 所有班级 以供选择,其中每项的value属性值是 班级编号
         2) 下拉列表的名称是 对象名.关系属性名.主属性名

在这里插入图片描述

Dao接口:
    public void insertStudent(Student stu);
mapping映射文件:
	在SQL语句中,给FK字段指定值时 使用 #{关系属性名.主属性名}

在这里插入图片描述

3.单向一对多

3.1定义关系属性

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WLdV5b5g-1594363100324)(assets/1570818137833.png)]

3.2定义dao接口

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2IGNbVZF-1594363100325)(assets/1570818173119.png)]

3.3查询结果的手动映射

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rUJOyTMS-1594363100326)(assets/1570818362419.png)]
在这里插入图片描述

十一、一对一

1.DB中表的关系

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lrBeOzlt-1594363100327)(assets/1570989225183.png)]

2.mybatis的关系映射

2.1定义关系属性

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CipCshbr-1594363100328)(assets/1570990756452.png)]

2.2定义dao接口

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FdZ2BMhh-1594363100329)(assets/1570991211466.png)]

2.3查询结果的手动映射

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cBIDJYyx-1594363100329)(assets/1570991332623.png)]

2.4添加功能

添加页面:

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yMurP2e7-1594363100330)(assets/1570991397434.png)]

业务类的处理:

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SpPaHPBY-1594363100331)(assets/1570992100782.png)]

mapper文件:

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-786Q6ozk-1594363100332)(assets/1570992183581.png)]

十二、多对多

1.DB中表的关系

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kVCVIZhW-1594363100333)(assets/1570990191981.png)]

2.mybatis的关系映射

2.1定义关系属性

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wvilLkw9-1594363100334)(assets/1570990996828.png)]

2.2定义dao接口

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t7aqhmuQ-1594363100335)(assets/1570991028711.png)]

2.3查询结果的手动映射

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z5qq8k2M-1594363100335)(assets/1570991141287.png)]

  • 修改跳转前查一个,页面超链接标签的href中内容

在这里插入图片描述

  • 修改查所有查一个跨包跳转
  • forward跳转特点:共用一个request作用域
  • 页面显示当前用户所在分组
    在这里插入图片描述

十三、动态SQL

1.SQL片段的复用

在这里插入图片描述

2.where标签【重点】

where标签的动态SQL 在开发中 使用在高级搜索功能上。

在这里插入图片描述

第二种写法(使用trim标签):

在这里插入图片描述

3.set标签

在这里插入图片描述

第二种写法(使用trim标签):

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y05qERi7-1594363100339)(assets/1571033028541.png)]

4.foreach标签

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U8vKME68-1594363100340)(assets/1571033697156.png)]

十四、缓存

1.缓存

缓存,是计算机中的内存存储空间。
    内存存储--优:读写效率高
             缺:存储量小、不能永久存储
    硬盘存储--优:存储量大,永久存储
             缺:读写效率低
    目前数据库中数据 是存储在硬盘中,所以效率低。
    
好处:使用缓存可以提高 减少与DB的交互次数,从而提高 DB操作的效率
     (用 空间 换 时间)

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OjB7dJ5A-1594363100341)(assets/1571035362268.png)]

2.mybatis的缓存分类

mybatis的缓存分类:
	一级缓存:SqlSession级别---默认使用
			基于同一个SqlSession的操作 可以缓存起来进行使用 提高效率)
	二级缓存:SqlSessionFactory级别--默认没使用
			基于同一个SqlSessionFactory的操作 可以缓存起来使用 提高效率)

3.mybatis二级缓存的使用

mybatis二级缓存的使用步骤(共三步):
步骤1> 配置启用mybatis的缓存

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0e9QytkP-1594363100341)(assets/1571034553949.png)]

步骤2> 在Mapper映射文件中使用缓存

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NMflsyAR-1594363100342)(assets/1571034607820.png)]

步骤3> 实体类必须实现Serializable接口

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XImPHQim-1594363100343)(assets/1571034654315.png)]

注意:1) session.close() 时,往缓存中 存内容;
     2) session.commit() 时,清空 已有缓存中的 数据。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值