mybatis就是一个封装来jdbc的持久层框架,它和hibernate都属于ORM框架,但是具体的说,hibernate是一个完全的orm框架,而mybatis是一个不完全的orm框架。Mybatis让程序员只关注sql本身,而不需要去关注如连接的创建、statement的创建等操作。
映射文件的命名:Userinfo.xml是ibatis的命名方式,
mybatis推荐的命名方式XXXMapper.xml UserinfoMapper
namespace:命名空间,分类标识sql语句,起到sql隔离的作用,如果在mapper代理开发中namespace有特殊的含义
id属性作用:标识映射文件中的sql,将sql语句封装到mapped statement对象中,所以称为statement的id
parameterType:指定输入参数类型
#{}:表示一个占位符,会自动拼接字符串;
#{userId}:其中的userId表示接收的输入参数,参数名称就是userId,如果输入参数是简单类型,#{}中的参数名可以任意,可以为value或者其他
${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中,使用${}容易引起sql注入
${value}:接受输入参数的内容,如果传入类型是简单类型,${}中只能用value,但是#{}就没有这个限制
注意!!!见解:无论是#,还是$,他们都是从parameterType里面取出属性,如果是嵌套对象,那么就从嵌套的对象里面继续取属性
eg:如下的demo,就是从嵌套的对象里面继续取属性
resultType:指定sql输出结果的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象
SQL片段:sql片段可以让代码有更高的可重用性,Sql片段需要先定义后使用
在select里面引入SQL片段:
eg:
Mapper代理使用的是jdk的代理策略。
Mapper代理的开发规范
1、 mapper接口的全限定名要和mapper映射文件的namespace值一致。
2、 mapper接口的方法名称要和mapper映射文件的statement的id一致。
3、 mapper接口的方法参数类型要和mapper映射文件的statement的parameterType的值一致,而且它的参数是一个。
4、 mapper接口的方法返回值类型要和mapper映射文件的statement的resultType的值一致。
1.id属性作用:标识映射文件中的sql,将sql语句封装到mapper的statement对象中,所以称为statement的id
2.parameterType:指定输入参数类型
3.#{}:表示一个占位符,${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中
4.#{userId}:其中的userId表示接收的输入参数,参数名称就是userId,如果输入参数是简单类型,#{}中的参数名可以任意,可以为value或者其他
${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中,使用${}容易引起sql注入,${value}:接受输入参数的内容,
如果传入类型是简单类型,${}中只能用value
5.resultType:指定sql输出结果的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象
注意:如果使用resultType作为输出映射,数据库表字段和实体对象属性名称不一致的将获取不到值
将插入数据的主键返回,返回到user对象中
SELECT LAST_INSERT_ID():得到刚insert进去记录的主键值,只适用于自增主键
keyProperty:将查询到主键值设置到parameterType指定的对象的哪个属性
order:SELECT LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序
resultType:指定SELECT LAST_INSERT_ID()的结果类型
eg:
SELECT LAST_INSERT_ID()
insert into userinfo (userId,userName,userpass,usertype,address) values(#{userId},#{userName},#{userPass},#{userType},#{address})
主键返回值UUID
order:如果主键自增,那么为after;如果主键不自增,那么为before
UUID函数是mysql的函数
eg:
select UUID()
insert into userinfo (userId,userName,userpass,usertype,address) values(#{userId},#{userName},#{userPass},#{userType},#{address})
主键返回值序列
order:只要不是自增主键,那么就设置为before
序列也就是sequence,它是Oracle的主键生成策略
eg:
select seq.nextval from dual
insert into
userinfo (userId,userName,userpass,usertype,address)
values
(#{userId},#{userName},#{userPass},#{userType},#{address})
properties(属性)用于配置属性信息
settings(全局参数设置)用于配置MyBatis的运行时方式
mybatis全局配置参数,全局参数将会影响mybatis的运行行为
typeAliases(类型别名)配置类型别名,可以在xml中用别名取代全限定名
typeHandlers(类型处理器)配置类型处理器
objectFactory(对象工厂)
plugins(插件)配置拦截器,用于拦截sql语句的执行
environments(环境信息集合)
environment(单个环境信息)配置数据源信息、连接池、事务属性等
也就是使用哪个
transactionManager(事务)
dataSource(数据源)
mappers(映射器)配置SQL映射文件
使用resultType来进行一对一结果映射,查询出的列的个数和映射的属性的个数要一致。而且映射的属性要存在与一个大的对象中,它是一种平铺式的映射,即数据库查询出多少条记录,则映射成多少个对象。
注意:如果使用resultType作为输出映射,数据库表字段和实体对象属性名称不一致的将获取不到值
association指定一对一的关系 property="属性名称" javaType="该属性的全限定类名"
association是用于一对一和多对一,而collection是用于一对多的关系
eg:
collection :一对多映射,多对多映射是一对多映射的特例
property="集合的名称" ofType="集合中元素的类型,该属性的全限定类名"
eg:
mybatis延迟加载又叫懒加载,也叫按需加载。也就是说先加载主信息,在需要的时候,再去加载从信息。
在mybatis中,resultMap标签的association标签和collection标签具有延迟加载的功能。
Mybatis的缓存,包括一级缓存和二级缓存
一级缓存指的就是sqlsession,在sqlsession中有一个数据区域,是map结构,这个区域就是一级缓存区域。
一级缓存中的key是由sql语句、条件、statement等信息组成一个唯一值。一级缓存中的value,就是查询出的结果对象。
二级缓存指的就是同一个namespace下的mapper,二级缓存中,也有一个map结构,这个区域就是一级缓存区域。
一级缓存中的key是由sql语句、条件、statement等信息组成一个唯一值。一级缓存中的value,就是查询出的结果对象。
一级缓存是默认使用的。
二级缓存需要手动开启。
整合ehcache
Mybatis本身是一个持久层框架,它不是专门的缓存框架,所以它对缓存的实现不够好,不能支持分布式。
Ehcache是一个分布式的缓存框架。