一、流程:
1、根据xml配置文件(全局配置文件)创建一个sqlSessionFactory对象
2、sql映射文件,配置了每一个sql,以及sql的封装规则
3、用sqlSessionFactory获取SQLSession实例,能执行已经映射的sql语句
4、将sql映射文件注册在全局配置文件中
二、理解
1、SQLSession和connection一样是非线程安全,每次使用都应该去获取新的对象
2、mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象
三、全局配置文件属性
1、properties标签:来引入外部properties配置文件的内容
1)resource:引入类路径下的资源
2)URL:引入网络路径或者磁盘路径下的资源
2、settings标签:包含很多重要的设置项
3、typeAliases标签:别名处理器,可以为我们的java类型起别名
1)typeAlias:为某个java类型起别名
type:指定要起别名的类型全类名,默认别名是类名小写
alias:指定新的别名
2)package:为某个包下的所有类批量起别名
name:指定包名(为当前包以及下面所有的后代包的每一个类都起一个默认别名)
**批量起别名情况下,用@Alias注解给某个类起别名
4、typeHandlers标签:类型处理器
5、plugins标签:插件
6、environments标签:多种环境配置,default指定使用某种环境
1)environment:某个具体的环境信息,ID代表当前环境的唯一标识
transactionManager:必须,事务管理器,type(JDBC/MANAGER)
DataSource:必须,数据源,type(UNPOOLED/POOLED/JNDI)
7、databaseIdProvider标签:支持多数据库厂商
8、mappers标签:将sql映射注册到全局配置中
1)mapper:注册一个sql映射
resource:引用类路径下的sql映射文件
url:引用网络路径或者磁盘路径下的sql映射文件
class:直接注册接口
1、有sql映射文件,映射文件名必须和接口同名,映射文件和接口在同一目录下
2、sql用注解写在接口上
四、映射文件
1、获取自增主键值,映射文件添加 useGeneratedKeys=”true”(使用自增主键获取主键值策略)和 KeyProperty(指定对应的主键属性,就是mybatis获取主键值后,将这个值封装给javaBean的哪个属性)。
2、order:BEFORE—》当前sql在插入sql之前运行
AFTER—》当前sql在插入sql之后运行
3、参数处理:
单个参数:#{参数名}
多个参数:1)多个参数会被封装成map,key:param1.。。param2 ;
value:传入的参数值
#{param1},#{param2}或者#{1},#{0}取出对应的value
2)命名参数:明确指定封装参数时map的key:@Param("id")<br />多个参数会被封装成一个map:<br />key:使用@Param注解指定的值<br />value:参数值<br /> #{key}例如:#{id},取出对应的参数值<br />3)如果多个参数正好是业务逻辑的数据模型,可以直接传入POJO,#{属性名}:取出传入POJO的属性值。<br />4)如果多个参数不是业务模型中的数据,没有对应的POJO,可以传入map,#{key}:取出map中对应的值。<br />5)如果多个参数不是业务模型的数据,但是经常使用,可以编写一个TO(Transfer Object)数据传输对象。<br />例:Page{<br />int index;
int size;
}
4、取值:
#{},${}区别:
#{}:是以预编译的形式,将参数设置到sql语句中,PrepareStatement,防止sql注入
${}:取出的值直接拼接在sql语句中,会有安全问题。
select from table where id=${id} and name = #{name};
Preparing: select from table where id=1 and name = ?;
原生sql不支持占位符的地方,可以使用${}取值。
5、返回值:
如果返回值是一个集合(list),resultType 要写集合中的元素类型。
返回值map:resultType=map,一条记录的map
多条记录的map:
需要在mapper的方法中添加@MapKey(“id”)指定某个属性(id)作为key
Map
6、resultMap:自定义结果集映射规则
type:自定义规则的java类型
id:唯一id,方便引用
<resultMap type="com.cui.User" id="myUser">
主键列的封装规则
7、联合查询:1)级联属性封装结果集<br /> 2)association:指定联合的JavaBean对象,定义关联对象的封装规则。<br />property:指定哪个属性是联合的对象<br />javaType:指定这个属性对象的类型
3) associatin:分步查询
select:表明当前属性是调用select指定的方法查出的结果
column:指定将哪一列的值传给这个方法
4)延迟加载:在分段查询基础上加两个配置。全局配置开启lazyLoadingEnabled=true
aggressiveLazyLoading=false
5) 嵌套结果集:
collection:定义关联集合类型的属性的封装规则
ofType:指定集合里面元素的类型
四、动态SQL
1、if标签:
test:判断表达式(OGNL),特殊字符需要转义
2、where标签:
标签中放入动态判断条件。where 只会去掉第一个多出来的and或者or。
3、trim标签:
属性:prefix:前缀,trim标签体中是整个字符串拼串后的结果,给拼串后的整个字符串加一个前缀。
prefixOverrides:前缀覆盖,去掉整个字符串前面多余的字符。
suffix:后缀,给拼串后的整个字符串加一个后缀。
suffixOverrides:后缀覆盖,去掉整个字符串后面多余的字符。
4、choose标签:判断,只会进入其中一个。
5、set标签:
更新条件放入set标签中。
6、foreach标签:
1)集合的遍历
collection:指定要遍历的集合,list类型的参数会特殊处理封装在map中,map的key就叫list
item:将当前遍历出的元素赋值给指定的变量
separator:每个元素之间的分隔符
open:遍历出所有结果拼接一个开始的字符
close:遍历出所有结果拼接一个结束的字符
index:索引。遍历list的时候是索引
遍历map的时候index表示的是map的key,item就是map的值
#{变量名}就能取出变量的值也就是当前遍历出的元素。
#{item_id}
2)批量保存
7、两个内置参数:
_parameter:代表整个参数
单个参数:_parameter就是这个参数
多个参数:参数会被封装为一个map,_parameter就是代表这个map
_databaseId:如果配置了databaseIdprovider标签。_databaseId就是代表当前数据库的别名。
8、bind标签:
可以将OGNL表达式的值绑定到一个变量中,方便后来引用这个变量的值。
select from user
where lastName like #{_lastName}
参数为 aa ,预编译后的SQL为:select from user where lastName like “%aa%”;
9、sql标签:
抽取可重用的SQL片段,方便后面引用。
使用include标签引用外部定义的SQL片段。