参考博主 “看尽事态炎凉”
mybatis快速入门:
1、什么是mybatis
mybatis支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。Mybatis几乎避免了所有的JDBC代码和手工设置参数以及抽取结果集。Mybatis使用简单的xml或注解来配置和映射基本体,将接口和Java的POJOs映射成数据库中的记录。
2、特点
支持定制sql、存储过程、以及高级映射
实现自动对SQL的参数设置
实现自动对结果集进行解析和封装
通过xml或者注解进行配置和映射,大大减少代码量
数据源的连接信息通过配置文件进行配置
3、和jdbc及hibernate进行对比
可以发现,Mybatis是对JDBC进行了简单的封装,帮助用户进行SQL参数的自动设置,以及结果集与java对象的自动映射。与hibernate相比,配置更加简单、灵活、执行效率高、但是正因为如此,所以没有实现完全自动化,需要手写SQL,这是优点也是缺点。
4、整体架构
(1)配置文件
全局配置文件:mybatis-config.xml 作用:配置数据源,引入映射文件
映射文件: XxMapper.xml 作用:配置sql语句、参数、结果集封装类型等等
现在全局配置文件一般都是换成了配置文件application-mybatis.properties
(2)SqlSeeesionFactory
作用:获取SqlSession
通过newSqlSessionFactoryBuilder().build(inputStream)来构建,inputStream读取配置文件的io流
(3)SqlSession
作用:执行CRUD操作
(4)Executor
执行器,SqlSession通过调用它来完成具体的CRUD
他是一个接口,提供了两种实现:缓存的实现、数据库的实现
(5)Mapped Statement
在映射文件中配置,包含3部分内容:
具体的sql,sql执行所需要的参数类型,sql执行结果的封装类型
参数类型和结果集封装类型包括3种:HashMap、基本数据类型、pojo
5、mybatis-config.xml配置
mybatis-config.xml讲究严格的顺序,具体顺序遵循文档的顺序
*configuration配置
properties 属性
settings 设置
typeAliases 类型命名
typeHandlers 类型处理器
objectFactory 对象工厂
plugins 插件
environments 环境
*environment 环境变量
*transactionManager 事务管理器
*dataSource 数据源
databaseldProvider 数据库厂商标识
mappers 映射器
6、properties属性读取外部资源
通过properties引入外部资源文件之后,就可以通过¥{xxx}的方式使用资源文件里的参数了
7、typeAliases
使用类的全路径配置别名
and user_name like '%' #{userName} '%' ```(2)choose、when、otherwise
<select id="findUser" parameterType="com.offcn.pojo.User" resultType="User">
select * from user where sex = 1
<!--
choose:条件选择
when:test-判断条件,一旦有一个when成立,后续的when都不再执行
otherwise:所有的when都不成立时才会执行
-->
<choose>
<when test="userName!=null and userName.trim()!=''">and user_name like '%' #{userName} '%'</when>
<when test="age!=null">and age = #{age}</when>
<otherwise>and user_name = 'zhangsan' </otherwise>
</choose>
</select>
(3)where、set
<select id="findUser" parameterType="com.offcn.pojo.User" resultType="User">
select * from user
<!--
自动添加where关键字
有一定的纠错功能,去掉sql语句块之前多余的一个and|or
通常结合if或者choose使用
-->
<where>
<if test="userName!=null and userName.trim()!=''">and user_name like '%' #{userName} '%'</if>
<if test="age!=null">and age = #{age}</if>
</where>
</select>
(4)foreach
<select id="findUser" parameterType="com.offcn.pojo.User" resultType="User">
select * from user where id in
<!--
foreach:遍历集合
collection:接收的集合参数
item:遍历的集合中的一个元素
separator:分隔符
open:以什么开始
close:以什么结束
-->
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</select>
总结:
*if判断 test-判断条件,OGNL表达式
*Choose when(判断,test,一旦一个when成立,后续不再执行)otherwise(所有when都不成立,才会执行)
*where:添加where关键字,去掉动态SQL之前多余的一个and|or
*Set:添加set关键字,去掉动态sql之后多余的一个逗号
*Foreach:collection-接收集合参数 item:遍历的集合中的一个元素 separator:分隔符 open:以什么开始 close:以什么结束
15、mybatis中resultType和resultMap该如何选择
resultType自动映射结果集
resultMap自定义映射结果集 (一般常用)