Mybatis 基础
- mybatis 配置文件配置 mapper 映射文件配置 resultType 类型别名
a. 单个类,属性可指定别名,不指定即为类名,不区分大小写 b. 包引入,属性可指定别名,不指定即为类名,不区分大小写 - mybatis 配置文件引入项目映射文件mapper.xml 文件
a. 单个mapper 映射文件 b. 包引入 ⅰ. mapper 接口所在的包要和映射文件所在的包一致 ⅱ. mapper 接口要和映射文件的名字一致 - idea Resource 创建多级包目录: /home/Azure/resource,/斜线分割, 不能 . 点号分割
- idea 中设置核心配置文件模版(比如 .xml 文件)
a. 来源 : 引用官方手册中的示例配置文件 b. setting -> Editor -> Code Style ->File and Code Templates 点击 + , 输入Name模版名 , Extension 选择文件类型, 粘贴配置文件信息 - 配置文件引入 properties 文件
- idea 创建 properties 文件
创建properties文件: new -> Reource Bundle, 输入文件名 - mybatis 获取参数值的两种方式#{}, ${}
a. ${} :本质是字符串拼接 b. #{}: 本质是占位符赋值 - mybatis 获取参数值的各种情况
a. mapper 接口方法的参数为单个的字面量类型 ⅰ. 可以直接使用#{}, ${} 以任意名称获取参数值, 但是注意使用 ${} 需要添加单引号 b. mapper 接口方法的参数为多个时,此时会将参数放在一个 map 中,有两种方式,可以直接使用#{}, ${} 以下key获取参数值, 但是注意使用 ${} 需要添加单引号 ⅰ. 以 arg0, arg1 …为键, 值为参数值 ⅱ. 以param0, param1… 为健, 值为参数值 c. mapper 接口方法的参数存在多个时,可以手动将这些参数放在一个 map 中存储,接口方法的参数为自定义的 map ⅰ. 可以直接使用#{}, ${} 以key获取参数值, 但是注意使用 ${} 需要添加单引号 ⅱ. 键即为手动定义的key值,参数为 value 值 d. mapper 接口方法的参数是实体类类型的参数,占位符 #{username}, username 即为 实体类中的属性 ⅰ. 可以直接使用#{}, ${} 以属性名获取参数值, 但是注意使用 ${} 需要添加单引号 e. 使用 @Param 注解命名参数,mybatis 会将参数放在map 中, key是@Param 注解 value 值 ⅰ. mapper 接口方法参数(@Param(username) String username) ⅱ. 以param0, param1… 为健, 值为参数值 - mybatis 的各种查询
a. 若查询出来的数据只有一条, ⅰ. 可以通过实体类对象 ⅱ. 集合接收 ⅲ. Map 接收,key,value 键值对 b. 若查询出来的数据存在多条, ⅰ. 可以通过集合接收,不能通过实体类对象接收,会 保 TooManyResultsException 异常 ⅱ. List - mybatis resultType 设置的默认别名,官方文档已经给出的默认的别名
- mybatis 模糊查询
a. 使用 ‘%${username}%’ b. 使用拼接函数 concat(‘%’,#{username},‘%’) c. “%”#{username}“%” - 批量删除
a. 使用 ${} , 不能使用 #{} ,原因是使用 #{} 会自动带上单引号 - 动态传输表名
a. 使用 ${} , 不能使用 #{} ,原因是使用 #{} 会表名自动带上单引号 - 添加功能获取自增的主键
a. useGeneratedKeys=“true”, 使用了自增的主键id b. keyProperty=“id”, 将a 返回的自增Id 通过实体对象中某一个属性返回 - 自定义映射
a. 使用字段别名 b. 设置全局配置,配置文件开启驼峰命名下划线映射成驼峰 settings标签 ⅰ. c. 使用 resultMap 自定义字段属性映射关系 - 多表查询(多对一)
a. 级联赋值 b. c. 分步查询 ⅰ. 通过第一步查询返回的结果,作为第二步查询的条件 ⅱ. ⅲ. fetchType: 当开启了全局的延迟加载,可通过此属性手动控制延迟加载的效果,fetchType=‘lazy|eager’, 默认延迟加载,eager 立即加载 - 多表查询(一对多)
a. 使用 ofType 是集合中存放元素的类型 b. 分步查询 ⅰ. ⅱ. fetchType: 当开启了全局的延迟加载,可通过此属性手动控制延迟加载的效果,fetchType=‘lazy|eager’, 默认延迟加载,eager 立即加载 - 延迟加载
a. 全局配置开启延迟加载 - 动态SQL
a. : 根据标签中 test 属性判断参数是否满足SQL拼接 ⅰ. username=#{username} b. : ⅰ. 动态生成 where 关键字 ⅱ. 将 标签中内容前多余的 and/ or 去掉 ⅲ. 无法将 标签中内容后的 and/ or 去掉 c. :标签中有内容会生效,标签中没有内容不会生效 ⅰ. prefix/suffix:将 trim 标签中内容前面或者后面添加指定内容 ⅱ. prefixOverrides/suffixOverrides/:将 trim 标签中内容前面或者后面去掉指定内容 d. choose,when, otherwise = if… else if… else… ⅰ. choose
- when(匹配满足的第一条件):至少一个
- otherwise(不满足when时, 就会执行): 至多一个
e. foreach ⅰ. in 批量删除 <foreach collection=‘strArr’ item=‘str’ separator=‘分隔符,’, open=‘(’ close=‘)’> : open=‘(’ close=‘)’ 以什么符号开始什么符号结束 ⅱ. or 批量删除 ⅲ. 批量新增 insert into emp values (#{str.username}, #{str.password}) f. sql 片段 ⅰ. 定义str1,str2,str3 ⅱ. 引用 - mybaits 缓存
a. 一级缓存默认开启,作用范围是同一个SqlSession ⅰ. 使用缓存失效的四种情况
- 操作不同的 SqlSession
- 同一个 SqlSeesion 查询条件不同
- 同一个 SqlSeesion 在执行两次查询之间执行了增删改操作
- 同一个 SqlSeesion 在执行两次查询之间手动清空了缓存
b. 二级缓存需要手动开启,作用范围比一级缓存 S去lSession 范围大,二级缓存是 SqlSessionFactory ,需要满足以下条件 ⅰ. 在配置文件中设置全局配置属性 cacheEnabled=‘true’, 默认为 true ⅱ. 在映射文件中设置标签 ⅲ. 二级缓存必须在 SqlSession 关闭或者提交之后才有效 ⅳ. 查询的实体类必须实现序列化接口 c. 失效(一级和二级同时失效) ⅰ. 两次查询之间执行了任意的增删改操作 - mybatis 缓存查询的顺序
a. 先查二级缓存,二级缓存可能存在其他程序已经查出来的数据可以直接使用 b. 二级缓存没有命中,则查一级缓存 c. 一级缓存没有命中,则查数据库 d. SqlSession 关闭之后,一级缓存写入二级缓存 - mybatis 整合第三方缓存(EHCache)
- mybatis 逆向工程
a. 根据条件查询 ⅰ. EmpExample example = new EmpExample(); - mybatis 分页插件
a. 需要在查询功能之前开启分页:PageHelper.startPage(int pageNum, int pageSize) b. 在查询功能之后获取分页相关信息: PageInfo page = new PageInfo<>(list , 5), list 表示分页数据, 5表示当前导航分页的数量
|