Mybatis学习笔记

Posted by lizubing1992 on 12-13,2018

1.简介

Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心。

  映射文件中有很多属性,常用的就是parameterType(输入类型)、resultType(输出类型)、resultMap()、rparameterMap()。
parameterType(输入类型)

2.#{}与${}区别

  #{}实现的是向prepareStatement中的预处理语句中设置参数值,sql语句中#{}表示一个占位符即?。就是一个占位符

使用占位符#{}可以有效防止sql注入,在使用时不需要关心参数值的类型,mybatis会自动进行java类型和jdbc类型的转换。#{}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。

  ${}和#{}不同,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换,
  
  ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。使用${}不能防止sql注入,但是有时用${}会非常方便,

3.foreach使用

  向sql传递数组或List,mybatis使用foreach解析,如下:
  如果我们需要传入多个ID来查询多个用户的信息,这也就可以使用foreach。我们先考虑下如果只写sql语句是如下:

 SELECT * FROM USERS WHERE username LIKE '%张%' AND (id =10 OR id =89 OR id=16)

 SELECT * FROM USERS WHERE username LIKE '%张%'  id IN (10,89,16)

  通过POJO传入List,映射文件如下:

 <if test="ids!=null and ids.size>0">
    <foreach collection="ids" open=" and id in(" close=")" item="id" separator="," >
         #{id}
    </foreach>
 </if>

index:为数组的下标。

 
item:为数组每个元素的名称,名称随意定义

  
open:循环开始

  
close:循环结束

  
separator:中间分隔输出

4. trim 属性

trim标签有点类似于replace效果。

prefix:前缀覆盖并增加其内容

suffix:后缀覆盖并增加其内容

prefixOverrides:前缀判断的条件

suffixOverrides:后缀判断的条件

5. choose标签

MyBatis Mapper.xml的choose标签的作用类似于java中的switch语句,使用choose标签时为了避免使用大量的if元素。choose元素包含了when元素(对应于java中的case语句),otherwise元素则对应java中的default语句。

6.resultMapconstructor - 用于在实例化类时,注入结果到构造方法中

idArg - ID 参数;标记出作为 ID 的结果可以帮助提高整体性能
arg - 将被注入到构造方法的一个普通结果

id – 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能

result – 注入到字段或 JavaBean 属性的普通结果

association – 一个复杂类型的关联;许多结果将包装成这种类型
嵌套结果映射 – 关联可以指定为一个 resultMap 元素,或者引用一个

collection – 一个复杂类型的集合
嵌套结果映射 – 集合可以指定为一个 resultMap 元素,或者引用一个

discriminator – 使用结果值来决定使用哪个 resultMap
case – 基于某些值的结果映射
嵌套结果映射 – 一个 case 也是一个映射它本身的结果,因此可以包含很多相 同的元素,或者它可以参照一个外部的 resultMap
对于非自增id,需要使用uuid生成函数生成之后再insert插入

7.要点

sqlSessionFactory 会话工厂 工具类使用
sqlSession 会话
connecter 连接

批量别名的定义,使用package 默认类名,大小写都可以

映射文件的加载,使用class时mapper.java,mapper.xml放在同一个packag里面

sql片段针对单表处理的
多表查询的时候外键使用外键所在的javabean注入即可

8.sqlSession

SqlSession 是一个面向用户的接口

SqlSession中提供了很多操作数据库的方法 如selectOne selelctList

SqlSession又是线程不安全的,在SqlSession实现类中除了有接口中的方法还有数据域的属性,不好做单例

SqlSession 最佳的应用场合在方法体,定义局部变量使用,这样会安全点

9.开发规范

9.1 在mapper.xml中 namespace 命名空间等于mapper的接口地址

9.2 mapper.java 接口中的方法名和mapper.xml中的stateMent的id一致

9.3 mapper.java 接口中的参数类型和mapper中的statment 中的paramTyp指定的类型一致

9.4 mapper.java接口中的返回值类型和mapper.xml中的statement的resultType类型一致

9.5 修改完之后需要在mapperConfig.xml文件中配置

10. hibernate-mappring

一对多的关系,需要在多的一方加入关系为一的一方的对象属性

11.userGeneratedKeys:使用自增 keyProperty与之配套使用


0评论