Mybatis
什么是框架
框架是一种半成品软件,就是一组组件,供你完成你的系统(形象的来说就是使用别人已经搭好的舞台,你来表演)。它是程序员在软件开发过程中的一套解决方案,不同的框架解决的问题可能不一样。使用框架的好处是封装了很多的细节,使开发者可以使用极简的方法实现功能。大大提高了开发效率。
概述
Mybatis通过xml或者注解的方式将要执行的各种statement配置起来,并通过java对象和statement中的sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。采用ORM思想解决了实体和数据映射的问题(其实就是实体类属性和数据库表的列名通过使用反射的方式来根据名称获取每一个属性,并把赋值进去)。封装了JDBC技术
JDBC的三个重要对象
- Connection
- PrepareStatement
- ResultSet
- 步骤
1、加载驱动,获取连接
2、语句
3、预处理
4、参数设置
5、执行
环境
主要通过maven中注入一些jar包(具体可以看官方文档)
配置文件
另外dao配置也就是我们所说的mapper,配置在resource下,一般和源文件中的路径一样。(注意下图还要配置返回类型)
总体上来讲:
注意的是:
案例操作
1、读取配置文件
2、创建SqlSessionFactory工厂
3、使用工厂生产SqlSession对象
4、使用SqlSession创建Dao接口的代理对象
5、使用代理对象执行方法
6、释放资源
注解使用
注意如下:
实现类实现
开发一般不用:
自定义
这是开发中比较常用的一种开发方式,通过配置mapper来完成。此方式主要用于比较复杂的数据操作。它的信息在Mybatis中封装在一个Map集合下,如下图所示:
代理
代理方法的一些底层思想
涉及类或接口
自定义类或接口
-
Resources
-
SqlSessionFactoryBuilder
-
SqlSessionFactory
接口:
实现:
-
SqlSession
接口
实现
代理实现
注解
mapper配置
其中如果用’%${value}%'这种形式的话,Mybatis底层用的是如下所说的原理。
如果用#{name}的形式的话,Mybatis底层用到的是如下所示的原理。
显示插入之后返回值的情况:
数据库属性和实体类属性对应不上:
1、用起别名的方法
如在sql中用as,或者如下:
2、配置数据库和属性的对应关系如下
自己实现dao
一般Mybatis已经帮我们实现好代码了,开发的过程中不用自己再写。
外部资源
执行过程
实力比较强的时候,可以看看源码。
连接池原理
连接池就是用于存储连接的一个容器(其实就是一个集合对象,该集合必须是线程安全的,不能存在两个线程拿到同一个连接,集合还必须实现队列的特性:先进先出)。
Mybatis中
连接池类型如下:
POOLED 采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范 的实现
UNPOOLED 采用传统的获取连接的方式,虽然也实现Javax.sql.DataSource接口,但是并没有使用池的思想。
JNDI 采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所能拿到DataSource是不一样。注意:如果不是web或者maven的war工程,是不能使用的。一般我们使用的是tomcat服务器,采用连接池就是dbcp连接池。
其中POOLED的就是它拿到的连接不会关闭,直接放回连接池,UNPOOLED是直接关闭的。
POOLED原理
1、如果空闲池还有连接,直接拿一个来用,否则第二
2、看看活动连接池中,是否达到最大数量,如果没有就new一个,否则第三
3、判断在里面哪个是最先进来的(Oldest)把它返回获取。
动态SQL
如:
if ,
choose(when,otherwise) ,
trim(where,set) ,
foreach
例如:
一对多
或者多对一都差不多的,注意在各自的实体类中要看看是否说明了他们对应各自对应关系的。配置中如下。
多对多
多对多的处理和一对多的类似,主要把各自的实体类声明关系(对应的的集合),配置差不多,sql语句的区别。
缓存
适用范围
适用于缓存:
经常查询并且不经常改变的。
数据的正确与否对最终结果影响不大的。
不适用于缓存:
经常改变的数据
数据的正确与否对最终结果影响很大的。
例如:商品的库存,银行的汇率,股市的牌价。
关系
一对多,多对多:通常情况下我们都是采用延迟加载。
多对一,一对一:通常情况下我们都是采用立即加载。
懒加载
一级
概念
Mybatis中SqlSession对象的缓存。
当我们执行查询之后,查询的结果会同时存入到SqlSession为我们提供一块区域中。
该区域的结构是一个Map。当我们再次查询同样的数据,mybatis会先去sqlsession中
查询是否有,有的话直接拿出来用。当SqlSession对象消失时,mybatis的一级缓存也就消失了。
注意
一级缓存是SqlSession范围的缓存,当调用SqlSession的修改,添加,删除,commit(),close()等方法时,就好清空一级缓存。
二级
原理
它指的是Mybatis中SqlSessionFactory对象的缓存。由同一个SqlSessionFactory对象创建的SqlSession共享其缓存。
使用
步骤:
第一步:让Mybatis框架支持二级缓存(在SqlMapConfig.xml中配置)
第二步:让当前的映射文件支持二级缓存(在IUserDao.xml中配置)
第三步:让当前的操作支持二级缓存(在select标签中配置)
注意:二级缓存每次查询都会创建一个新的对象。
注解开发
类型
@Select 查询
@Insert 增加
@Update 修改
@Delete 删除
注意:如果你用注解开发的时候,再用xml的话会报错。如下:
一般的应用:
二级缓存:
到目前为此,该文章就写到这了,如果大家是想学会学好的话
关于这个Mybatis知识建议去看官方文档。