Mybatis简介
1 为什么使用Mybatis(优点)
1、解决了SQL语句和Java代码之间的耦合
2、使用数据库连接池连接数据库,连接数据库的效率比较快
3、数据库查询取值非常的方便
2什么是Mybatis
Mybatis是一个半自动的ORM框架
ORM:Object Relational Mapping
半自动:Mybatis框架是需要我们自己手写sql语句
Mybatis框架搭建详解
1 配置详解
全局配置文件mybatis.xml
1、<environments default="demo">
default配置当前所使用的环境,必须是<environment>的id值
2、可以有多个<environment>标签
<environment>可能使用的环境,会被<environments>引用
3、<transactionManager type="JDBC">
事务管理器类型
type属性可取值:
JDBC:底层事务管理与JDBC原有事务管理相同
MANAGED:Mybatis不去管理事务,交给其他容器进行管理
4、<dataSource type="POOLED">
POOLED:使用连接池技术,访问频率比较高时使用,连接池的使用可以降低服务器的压力,提高连接对象重用性
UNPOOLED:不使用连接池技术,每次对数据库访问时打开数据库连接,访问结束后关闭数据库连接
JNDI:Java命名目录接口,数据库的连接可以依赖于其他技术或应用
5、<mapper>常见属性
resource="*/*/xxx.xml",加载项目中资源,目录寻找
url=""加载互联网或本机的配置文件
mapper.xml中标签解释
1、<mapper>中namespace=""值相当于接口名
2、id属性:相当于方法名
3、resultType属性:返回值类型,如果返回值是集合,写集合的泛型
4、parameterType属性:参数类型,如果没有参数省略该属性
Myabtis框架搭建优化
1 配置别名
<typeAliases>
<!--单独给某一个文件起别名-->
<typeAlias type="文件路径" alias="别名" />
<!--给整个包下面的文件起别名,这时候别名的名称就是类的名称,不区分大小写-->
<package name="包路径" />
</typeAliases>
2 属性的名称配置
<properties resource="jdbc.properties"><properties/>
需要明白Mybatis也是支持属性文件的读取的,可以让代码的结构更加清晰
3 配置settings开启lo4j支持
1、日志的作用
(1)记录错误的信息到文件中
(2)有日志级别方便查看
2、Log4J的五种级别
(1)FATAL 严重错误
(2)ERROR 错误
(3)WARN 警告
(4)INFO 普通信息
(5)DEBUG 调试信息
3、DEBUG调试信息
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
Mapper层代码
1、Mybatis中parameterType这个属性是可以省略的,但是resultType是不可以省略的
2、#{}相当于占位符,${}相当于拼接
提交的两种方式
1、session.commit();
2、Sqlsession session = factory.openSession(true);
数据注入的方式
1、自动注入方式 Auto_Mapping(自己封装的实体属性和数据库的字段是一样的)
2、手动注入的方式 resultMap,解决自己封装和数据库的字段不一致的问题
resultType和resultMap使用场景
1、如果做的是单表查询并且封装的实体和数据库的字段一一对应,使用resultType
2、如果实体封装的属性和数据库的字段不一致,使用resultMap
3、使用的是多表的联合查询,使用resultMap
4、使用N+1查询,使用resultMap
Mybatis中的缓存
Mybatis中的缓存简介
缓存的好处: 只是查询才有缓存(增删改没有缓存),可以增快访问的速度
Sqlsession级缓存(一级缓存)默认是开启的,所有的操作是公用同一个Sqlsession对象并且执行的是同一条sql语句的时候才会使用缓存。
缓存的缺点
1、可能存在数据的脏读
2、执行修改、删除、添加,默认把缓存中的数据全部清空
Sqlsession一级缓存
使用Sqlsession对象操作数据库资源时,Sqlsession对象会先去其缓存区查找是否有现成的符合要求的数据,如果有则返回,没有则按照需求进行数据库操作获取符合要求的资源,并将资源返回给用户的同时在其缓存中缓存,当我们使用同一个Sqlsession对象操作同一个sql资源时,就可以从缓存中直接获取数据库资源数据了
factory的缓存(二级缓存)
使用方法
1、在mybatis.xml中开启二级缓存
2、在对应的mapper.xml文件中
3、关闭获得提交指定的sqlsession对象
注意
当用户查询时,会现在Factory对象自己的缓存中查看是否有现成的数据,有则直接返回,没有则继续查看sqlSession中是否有,有则返回,没有则去数据库中获取资源,将资源返回的同时在SqlSession的缓存中缓存一份,当该SqlSession对象被commit或者close时将其缓存的数据放入到Factory中。
查询数据顺序:
二级缓存–>
一级缓存–>
数据库–>
把数据保存到一级,当sqlsession关闭或者提交的时候,把数据放入到二级缓存中
Mybatis中的注解
@Select("")
@Insert("")
@Update("")
@Delete("")
注解使用的优缺点
1、使用注解没有实现Java代码和sql语句的解耦
2、进行多表的查询比较的麻烦
3、无法实现sql语句的动态拼接
Mybatis运行原理
在Mybatis运行开始时需要先通过Resources加载全局配置文件,下面需要实例化SqlSessionFactoryBuilder构建器,帮助SqlSessionFactory接口实现类DefaultSqlSessionFactory。
在实例化DefaultSqlSessionFactory之前需要先创建XmlConfigBuilder解析全局配置文件,并将解析结果存放在Configuration中,之后把Configuration传递给DefaultSqlSessionFactory,到此SqlSessionFactory工厂创建成功。由SqlSessionFactory工厂创建SqlSession,每次创建SqlSession时,都需要由TransactionFactory创建Transaction对象,同时还需要创建SqlSession的执行器Executor,最后实例化DefaultSqlSession,传递给SqlSession接口。根据项目需求使用SqlSession接口中的API完成具体的事务操作,如果事务执行失败,需要进行rollback回滚事务,如果事务执行成功提交给数据库,关闭SqlSession。