MyBatis:
MyBatis
简介:
MyBatis实际上是IBatis3.0版本以后的持久化层框架【也就是和数据库打交道的框架】,IBatis2.0之前统称为IBatis、IBatis3.0之后
统称为:MyBatis
MyBatis框架和原生JDBC、JDBCTemplate相比的优势:
1.MyBatis是一个框架,包含缓存、逆向工程等
2.包含动态sql
3.java代码【处理业务逻辑】和sql语句【数据交互】分离开来
java---->编译
sql---->编译
4.直接将数据库中表之间的关系映射为java类对象之间的关系
5.MyBatis是一个半自动化的ORM【Object Relationship Mapping】的框架
MyBatis工作原理:
1.配置MyBatis的环境变量:mybatisConfig.xml(全局配置文件),配置了mybatis的运行环境信息mapper.xml文件即sql映射文件
2.创建接口类及对应的映射文件
3.创建SqlSessionFactory
4.根据SqlSessionFactory创建会话SqlSession
5.通过mapper.xml映射文件,对应接口中相应的方法,并将参数映射到sql中
6.通过mapper.xml将sql执行的结果返回
#{}和${}的区别:
#{}:相当于sql语句中的占位符,不会出现sql注入的问题,相当于javaweb中的preparestatement预编译
${}:会把参数直接拼入sql语句中,会出现sql注入的问题,相当于javaweb中的statement,
但对于不支持预编译的获取表名、排序字段、模糊查询的使用这个
创建Mapper接口,修改Mapper.xml文件
1.如何绑定:
以前的sql配置文件的namespace可以随便写,现在不能随便写,需要指定为接口的全限类名,然后此时接口和sql配置文件做了绑定,
然后还要将select标签的id和方法名进行绑定
2.总结:
1.借口式编程:
原生:dao ------> DaoImpl
MyBatis:xxMapper ------> xxMapper.xml
2.SqlSession代表和数据库的一次会话,用完必须关闭
3.SqlSession和Connection一样,都是非线程安全的,每次使用都是去获取新的连接对象,不要将这对象定义在类变量中使用
4.mapper借口没有实现类,但是MyBatis这个接口生成一个代理对象
5.两个重要的配置文件:
MyBatis的全局配置文件:包含数据库连接池信息,事务管理器信息等...系统运行环境信息
sql映射文件:保存了每一个sql语句的映射信息
MyBatis全局配置文件:
MyBatis的配置文件包含了影响MyBatis行为甚深的设置(setting)和属性(properties)信息。文档的顶层结构如下:
configuration配置
properties属性:可以加载properties配置文件的信息
可以使用properties来引入外部properties配置文件的内容
resources:引入类路径下的资源
url:引入网路路径或者磁盘路径下的资源文件
setting设置:可以设置MyBatis的全局属性
包含很多重要的设置项:
setting:用来设置每一个设置
name:设置项名
value:设置项取值
如:驼峰式命名
.mapUnderscopeToCameICase:自动完成数据表标准列名和持久化类标准属性名之间的映射
typeAliases:类型命名
作用: A type alias is simply a shorter name for a Java type
typeAliases:别名处理器,可以为我们的java类型起别名,别名不区分大小写
typeAlias:为某个java类型起别名
type:指定要起别名的类型全类名;默认别名就是类名小写
alias:执行新的别名
package:为某个包下的所有类批量起别名
name:指定包名(为当前包以及下面所有的后代包的每一个类都起一个默认别名[类名小写])
不建议使用别名,建议使用全类名,看sql语句是怎么被封装为java对象是较为简单
typeHandlers:类型处理器
负责如何将数据库的类型和java对象类型之间转换的工具类
如:将数据库中的varchar类型和java类对象的String数据类型转换
plugins插件
environments环境变量
用于配置MyBatis的开发环境,MyBatis可以配置多种环境,default指定使用某种环境。可以达到快速切换环境
environment:配置一个具体的环境信息,必须有两个标签,id代表环境的唯一表示
transactionManager事务管理器
type:事物管理器的类型,type="[JDBC|MANAGED]",这两个都是别名
在Configuration类中的可以查看具体类!但是Spring对事务的控制才是最终的管理方案!
JDBC:这个配置就是直接使用了JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务
MANAGED:这个配置几乎没做什么,他从来不提交和回滚一个连接,而是让容器来管理事务的整个生命周期
综上:如果要配置事务管理器,就配置为JDBC。表示使用本地的JDBC事务。
当然也可以自定义事务管理器:只需要和人家一样实现TransationFactory接口
type:指定为全类名
dataSource数据源
type:type="[UNPOOLED|POOLED|JNDI]"
unpooled:无数据库连接池
pooled:有数据库连接池
JNDI:
自定义数据源:实现DataSourceFactory接口,type也是全类名
引申:如何自定义第三方数据源,参考Configuration中的POOLED类实现
需要自定义一个类继承UnpooledDataSourceFactory类,然后在构造器中初始化该对应的dataSource属性
databaseIdProvider数据库厂商标识
MyBatis is able to execute different statements depending on your database vendor
MyBatis可以根据不同的数据库厂商执行不同的语句
这样在执行不同数据库的时候、就会执行不同数据库的语句了!优点:在service层值需要调用一个
mybatis的方法,而不需要关注底层选择使用的数据库
mappers映射器
Mappers:将sql映射注册到全局配置文件中
mapper:注册一个sql映射
注册配置文件:
resources:引用类路径下的sql映射文件
mybatis/mapper/EmployeeMapper.xml
url:引用网路路径或者磁盘路径下的sql映射文件
url="file://var/mappers/AuthorMapper.xml"
注册接口:
class:引用(注册)接口
1.有sql映射文件,映射文件名必须和接口同名,并且与接口放在同一个目录下
2.没有sql映射文件,所有的sql都是利用注解写在接口上
推荐:
比较重要的,复杂的Dao接口我们来写sql映射文件
不重要,简单的Dao接口为了开发快速可以使用注解
最后是全局配置文件中标签实际上是有顺序的!
MyBatis的接口方法参数
参数类型为一个参数
参数类型为两个参数或者多个参数
参数类型为Map
参数类型为POJO
参数类型为Collection和List,不能为set
MyBatis查看发送的sql语句:
1.需要导入log4j的jar包或者maven依赖
2.需要在类路径下加入log4j.xml文件
MyBatis各种返回值类型:
返回值类型为:Integer/Long/Boolean
返回值类型为POJO
返回值类型为List列表
返回值类型为Map
一条记录
多条记录
返回为一个ResultMap:自定义结果集映射规则
MyBatis的关联关系:
一对一,多对一,一对多,多对多
对一关联关系[三种解决方案]:
1.resultMap的result标签连缀的方式
2.使用association标签,一步到位
3.使用association标签,分步查询
对于第三种存在懒加载机制[按需加载,也叫懒加载]:
对多关联关系[两种解决方案]:
2.使用association标签,一步到位
2.使用association标签,分步查询
动态sql:
if:字符判断
choose(when otherwise):分支选择
trim(where,set):字符串截取,其中where标签封装查询条件,set标签封装修改条件
foreach
MyBatis缓存机制:
缓存是为了加快查询效率
一级缓存:sqlSession级别的缓存,默认是开启的,无法关闭
myBatis一级缓存:sqlSession级别的缓存,自动开启
一级缓存的四种情况:
1.sqlSession对象不同
2.sqlSession对象相同,但是查询条件不同
3.sqlSession对象、查询条件相同,但是在两次查询之间,对数据表进行了增删改查操作
4.sqlSession对象、查询条件相同,但是在两次查询之间,手动清空
二级缓存:Mapper接口级别[namesoace],默认是关闭的,需要手动开启
1.在MaBatis的全局配置文件中开启二级缓存
2.在对应的sql用社文件中加入<cache>标签
3.必须是在一级缓存关闭的情况下,二级缓存才能使用
4.放入到二级缓存中的对象所在的类必须是实现了序列化接口