Mapper
mapper接口和映射文件要保证两个一致
1.mapper接口的全类名和映射文件的namespace一致
2.mapper接口中的方法的方法名要和映射文件中的sql的id保持一致
mapper.xml文件 查询的时候需要增加属性
id:和方法名必须一致
resultType:设置结果类型,即查询的数据要转换为的java类型
resultMap:自定义的映射,处理多对一或一对多的映射关系
environments:配置连接数据库的环境
属性: default:设置默认使用的环境ID
environment:设置一个具体的连接数据库的环境
属性: id:设置环境的唯一标识,不能重复
transactionManager:设置事物管理器
属性: type:设置事物管理的方式。
有两种属性“JDBC/MANAGED”
JDBC:表示使用JDBC原生的事物管理方式
MANAGED:被管理,例如spring
DataSource:设置数据源
属性: type:设置数据源的类型
type=“POOLED/UNPOOLED/JNDI”
POOLED:表示使用数据库连接池
UNPOOLED:表示不使用数据库连接池
JNDI:表示使用上下文中的数据源
示例:<environments default="development”>
<environment id="development”>
<transactionManager type="JDBC/MANAGED”>
<dataSource type="POOLED/UNPOOLED/JNDI”>
<properties resource="jdbc.propertes"/> 引入 properties 文件,此后就可以在当前文件中使用${key}的方式访问value
<typeAliases>
<typeAlias type="com.example.comman.User" alias="别名"></typeAlias >
typeAliases:设置类型别名,为某个具体的类型设置一个别名,在mybatis范围中,可以使用别名表示一个具体的类型。
</typeAliases>
查询的数据有多条时,并将每条数据转换为map集合,两种方法
-
将mapper接口方法的返回值设置为泛型是map的list集合
List<Map<String,Object>> getMap();
结果{passward=1230} -
可以将每条数据转换的map集合放在一个大的map中,但是必须要通过@MapKey注解。将查询的的某个字段的值作为大的map集合的键。
@MapKey(“Id”)
Map<String,Object> getMap();
结果{1={passward=1230},2={}}
<insert 插入自增主键的操作
useGeneratedKeys=true //获取自增主键
keyProperty=“”//将添加的数据的自增主键为实体类类型的参数的属性值
resultMap中各字段的讲解
resultMap:设置自定义的映射关系
id:唯一标识
type:处理映射关系的实体类的类型
常用的标签
ID:处理主键和实体类中属性的映射关系
result:处理普通字段和实体类中属性的映射关系
column:设置映射关系的字段名,必须是sql查询出的某个字段
propert:设置映射关系中的属性的属性名,必须是处理的实体类类型的属性名
字段名和属性名不一致的情况,处理映射关系如下
1.为查询的字段设置别名,和属性名保持一致
2.当字段符合MySQL的要求使用_,而属性符合java的要求使用驼峰
此时可以在Mybatis的核心配置文件中设置一个全局配置,可以自动将下划线映射为驼峰
3.使用resultMap自定义映射处理
处理多对一的映射关系:
-
级联方式处理
-
association
-
分步查询
<association property=“”
select="分步查询的另一个方法的类"设置分布查询sql的唯一标识
column="dept_id"传输另一个方法所需的参数,由本方法查询得出>
//开启驼峰映射 <setting name="mapUnderscoreToCamelCase" value="true” /> //开启懒加载 <setting name="lazyLoadingEnabled" value="true” /> //开启按需加载 <setting name="aggressiveLazyLoading" value="true” />
动态sql:
1.if
通过test属性中的表达式判断标签中的内容是否有效(是否会拼接到sql中)
2.where
a.若where标签中有条件成立,会生成where关键字
b.会自动将where标签中内容前多余的and去掉,到那时其中内容后多余的and无法去掉
c.若where标签中没有任何一个条件成立,则where没有任何功能
3.trim
prefix,suffix:在标签中内容前面或后面添加指定内容
prefixoverrides,suffixoverrides:在标签中内容前面或后面去掉指定内容
4.choose,when,otherwise
相当于java中的if...else if.....else
when至少设置一个,otherwise最多设置一个
5.foreach
collection:设置要循环的数组或集合
item:用一个字符串表示数组或集合中的每一个数据
separator:设置每次循环的数据之间的分隔符
open:循环的所有内容以什么开始
close:循环的所有内容以什么为结束
6.sql片段
可以记录一段sql,在需要用的地方进行引用
<sql id="emp">emp_id,emp_name</sql>
需要用的地方进行引用<include refid="emp"></include>
Mybatis的一级缓存
Mybatis的一级缓存是SqlSession级别的,即通过同一个SqlSession查询的数据会被缓存。下一次查询相同的条件时直接从缓存中获取。
使一级缓存失效的四种方法:
1.不同的SqlSession对应不同的一级缓存
2.同一个SqlSession但是查询的条件不同
3.同一个SqlSession两次查询期间执行了任何一次增删改操作
4.同一个SqlSession两次查询期间手动清空了缓存