ssm-Mybatis学习-简单分析

Mybatis学习

1、什么是框架?

​ 它是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题。
​ 使用框架的好处:
​ 框架封装了很多的细节,使开发者可以使用极简的方式实现功能。大大提高开发效率。
2、三层架构
​ 表现层:
​ 是用于展示数据的
​ 业务层:
​ 是处理业务需求
​ 持久层:
​ 是和数据库交互的
3、持久层技术解决方案
​ JDBC技术:
​ Connection
​ PreparedStatement
​ ResultSet
​ Spring的JdbcTemplate:
​ Spring中对jdbc的简单封装
​ Apache的DBUtils:
​ 它和Spring的JdbcTemplate很像,也是对Jdbc的简单封装

以上这些都不是框架
	JDBC是规范
	Spring的JdbcTemplate和Apache的DBUtils都只是工具类
4、mybatis的概述

​ mybatis是一个持久层框架,用java编写的。
​ 它封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建连接等繁杂过程
​ 它使用了ORM思想实现了结果集的封装。

ORM:
	Object Relational Mappging 对象关系映射
	简单的说:
		就是把数据库表和实体类及实体类的属性对应起来
		让我们可以操作实体类就实现操作数据库表。

		user			User
		id			userId
		user_name		userName
今天我们需要做到
	实体类中的属性和数据库表的字段名称保持一致。
		user			User
		id			id
		user_name		user_name
5、mybatis的入门

​ mybatis的环境搭建
​ 第一步:创建maven工程并导入坐标
​ 第二步:创建实体类和dao的接口
​ 第三步:创建Mybatis的主配置文件
​ SqlMapConifg.xml
​ 第四步:创建映射配置文件
​ IUserDao.xml
​ 环境搭建的注意事项:
​ 第一个:创建IUserDao.xml 和 IUserDao.java时名称是为了和我们之前的知识保持一致。
​ 在Mybatis中它把持久层的操作接口名称和映射文件也叫做:Mapper
​ 所以:IUserDao 和 IUserMapper是一样的
​ 第二个:在idea中创建目录的时候,它和包是不一样的
​ 包在创建时:com.itheima.dao它是三级结构
​ 目录在创建时:com.itheima.dao是一级目录
​ 第三个:mybatis的映射配置文件位置必须和dao接口的包结构相同
​ 第四个:映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
​ 第五个:映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名

​ 当我们遵从了第三,四,五点之后,我们在开发中就无须再写dao的实现类。
mybatis的入门案例
​ 第一步:读取配置文件
​ 第二步:创建SqlSessionFactory工厂
​ 第三步:创建SqlSession
​ 第四步:创建Dao接口的代理对象
​ 第五步:执行dao中的方法
​ 第六步:释放资源

​ 注意事项:
​ 不要忘记在映射配置中告知mybatis要封装到哪个实体类中
​ 配置的方式:指定实体类的全限定类名

​ mybatis基于注解的入门案例:
​ 把IUserDao.xml移除,在dao接口的方法上使用@Select注解,并且指定SQL语句
​ 同时需要在SqlMapConfig.xml中的mapper配置时,使用class属性指定dao接口的全限定类名。
明确:
​ 我们在实际开发中,都是越简便越好,所以都是采用不写dao实现类的方式。
​ 不管使用XML还是注解配置。
​ 但是Mybatis它是支持写dao实现类的。

6、自定义Mybatis的分析:

​ mybatis在使用代理dao的方式实现增删改查时做什么事呢?
​ 只有两件事:
​ 第一:创建代理对象
​ 第二:在代理对象中调用selectList
在这里插入图片描述

自定义mybatis能通过入门案例看到类
class Resources
class SqlSessionFactoryBuilder
interface SqlSessionFactory
interface SqlSession

OGNL表达式:

​ Object Graphic Navigation Language
​ 对象 图 导航 语言
​ 它是通过对象的取值方法来获取数据。在写法上把get给省略了。
比如:我们获取用户的名称
​ 类中的写法:user.getUsername();
​ OGNL表达式写法:user.username
mybatis中为什么能直接写username,而不用user.呢:
​ 因为在parameterType中已经提供了属性所属的类,所以此时不需要写对象名

1、mybatis中的连接池以及事务控制 原理部分了解,应用部分会用
mybatis中连接池使用及分析
mybatis事务控制的分析
2、mybatis基于XML配置的动态SQL语句使用 会用即可
mappers配置文件中的几个标签:




3、mybatis中的多表操作 掌握应用
一对多
一对一(?)

多对多

连接池:

​ 我们在实际开发中都会使用连接池。
​ 因为它可以减少我们获取连接所消耗的时间。
2、mybatis中的连接池
​ mybatis连接池提供了3种方式的配置:
​ 配置的位置:
​ 主配置文件SqlMapConfig.xml中的dataSource标签,type属性就是表示采用何种连接池方式。
​ type属性的取值:
​ POOLED 采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现(从池中拿一个,用完了close还回去)
​ UNPOOLED 采用传统的获取连接的方式,虽然也实现Javax.sql.DataSource接口,但是并没有使用池的思想。(每次创建一个连接)
​ JNDI 采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所能拿到DataSource是不一样。
​ 注意:如果不是web或者maven的war工程,是不能使用的。
​ 我们课程中使用的是tomcat服务器,采用连接池就是dbcp连接池。

mybatis中的事务
  • ​ 面试会问
    ​ 什么是事务
    ​ 事务的四大特性ACID
    ​ 不考虑隔离性会产生的3个问题
    ​ 解决办法:四种隔离级别

    它是通过sqlsession对象的commit方法和rollback方法实现事务的提交和回滚

mybatis中的多表查询

​ 表之间的关系有几种:
​ 一对多
​ 多对一
​ 一对一
​ 多对多
​ 举例:
​ 用户和订单就是一对多
​ 订单和用户就是多对一
​ 一个用户可以下多个订单
​ 多个订单属于同一个用户

​ 人和身份证号就是一对一
​ 一个人只能有一个身份证号
​ 一个身份证号只能属于一个人

​ 老师和学生之间就是多对多
​ 一个学生可以被多个老师教过
​ 一个老师可以交多个学生
特例:
​ 如果拿出每一个订单,他都只能属于一个用户。
​ 所以Mybatis就把多对一看成了一对一。

mybatis中的多表查询:
示例:用户和账户
一个用户可以有多个账户
一个账户只能属于一个用户(多个账户也可以属于同一个用户)
步骤:
1、建立两张表:用户表,账户表
让用户表和账户表之间具备一对多的关系:需要使用外键在账户表中添加
2、建立两个实体类:用户实体类和账户实体类
让用户和账户的实体类能体现出来一对多的关系
3、建立两个配置文件
用户的配置文件
账户的配置文件
4、实现配置:
当我们查询用户时,可以同时得到用户下所包含的账户信息
当我们查询账户时,可以同时得到账户的所属用户信息

​ 示例:用户和角色
​ 一个用户可以有多个角色
​ 一个角色可以赋予多个用户
​ 步骤:
​ 1、建立两张表:用户表,角色表
​ 让用户表和角色表具有多对多的关系。需要使用中间表,中间表中包含各自的主键,在中间表中是外键。
​ 2、建立两个实体类:用户实体类和角色实体类
​ 让用户和角色的实体类能体现出来多对多的关系
​ 各自包含对方一个集合引用
​ 3、建立两个配置文件
​ 用户的配置文件
​ 角色的配置文件
​ 4、实现配置:
​ 当我们查询用户时,可以同时得到用户所包含的角色信息
​ 当我们查询角色时,可以同时得到角色的所赋予的用户信息

Mybatis中的延迟加载

​ 问题:在一对多中,当我们有一个用户,它有100个账户。
​ 在查询用户的时候,要不要把关联的账户查出来?
​ 在查询账户的时候,要不要把关联的用户查出来?

​ 在查询用户时,用户下的账户信息应该是,什么时候使用,什么时候查询的。
​ 在查询账户时,账户的所属用户信息应该是随着账户查询时一起查询出来。

什么是延迟加载
在真正使用数据时才发起查询,不用的时候不查询。按需加载(懒加载)
什么是立即加载
不管用不用,只要一调用方法,马上发起查询。

在对应的四种表关系中:一对多,多对一,一对一,多对多
一对多,多对多:通常情况下我们都是采用延迟加载。
多对一,一对一:通常情况下我们都是采用立即加载。

Mybatis中的缓存

​ 什么是缓存
​ 存在于内存中的临时数据。
​ 为什么使用缓存
​ 减少和数据库的交互次数,提高执行效率。
​ 什么样的数据能使用缓存,什么样的数据不能使用
适用于缓存
​ 经常查询并且不经常改变的。
​ 数据的正确与否对最终结果影响不大的。
不适用于缓存
​ 经常改变的数据
​ 数据的正确与否对最终结果影响很大的。
​ 例如:商品的库存,银行的汇率,股市的牌价。
​ Mybatis中的一级缓存和二级缓存

一级缓存

​ 它指的是Mybatis中SqlSession对象的缓存。
​ 当我们执行查询之后,查询的结果会同时存入到SqlSession为我们提供一块区域中。
​ 该区域的结构是一个Map。当我们再次查询同样的数据,mybatis会先去sqlsession中
​ 查询是否有,有的话直接拿出来用。
​ 当SqlSession对象消失时,mybatis的一级缓存也就消失了。

二级缓存:

​ 它指的是Mybatis中SqlSessionFactory对象的缓存。由同一个SqlSessionFactory对象创建的SqlSession共享其缓存。
​ 二级缓存的使用步骤:
​ 第一步:让Mybatis框架支持二级缓存(在SqlMapConfig.xml中配置)
​ 第二步:让当前的映射文件支持二级缓存(在IUserDao.xml中配置)
​ 第三步:让当前的操作支持二级缓存(在select标签中配置)

@Test
    public void findById() {
        SqlSession sqlSession1 = factory.openSession();
        UserDao dao1 = sqlSession1.getMapper(UserDao.class);
        User user1 = dao1.findById(1);
        System.out.println(user1);
        sqlSession1.close();

        SqlSession sqlSession2 = factory.openSession();
        UserDao dao2 = sqlSession2.getMapper(UserDao.class);
        User user2 = dao2.findById(1);
        System.out.println(user2);
        sqlSession2.close();

        System.out.println(user1 == user2);
    }

执行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l6zoEu0r-1598260418096)(G:\图片素材\java\1597024671731.png)]

Mybatis中的注解开发

​ 环境搭建
​ 单表CRUD操作(代理Dao方式)
​ 多表查询操作
class);
User user2 = dao2.findById(1);
System.out.println(user2);
sqlSession2.close();

    System.out.println(user1 == user2);
}

**执行结果**

[外链图片转存中...(img-l6zoEu0r-1598260418096)]

#### Mybatis中的注解开发

​	环境搭建
​	单表CRUD操作(代理Dao方式)
​	多表查询操作
​	缓存的配置
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值