-
查询
<select id="selectPerson" parameterType="int" resultType="hashmap"> SELECT * FROM PERSON WHERE ID = #{id} </select>
id: 表示命名空间中唯一标识符,可以被用来引用这条语句
parameterType:传入这条语句的参数的类型,这个属性是可选的,mybatis可以根据TypeHandler推断出具体传入语句的参数,默认值为unset
resultType:返回值类型的完全限定名或别名,如果是集合的情形,则应该是集合属性的类型,而不是集合本身
-
增删改
增删改基本同查询,需要注意的是,增删改没有resultType属性,不能指定返回值类型,但可以使用整形(int long)或布尔型(bool)来判断受影响的行数。
useGeneratedKeys:(仅对insert 与 update 有用)这会使Mybatis 使用JDBC 调用getGeneratedKeys 方法来取出数据库内部生成的主键(比如:像mysql,sql server这种数据库的自增字段,Oracle没有自增字段),默认值为false
keyProperty:(仅对 insert 和 update 有用)唯一标记一个属性,mybatis会通过getGeneratedKeys方法的返回值或insert语句的字标签selectKey (Oracle没有自增字段,它使用selectKey 这种方式)设置它的键值 ,默认值为unset,如果希望得到多个生成的列,可以指定逗号分隔的列表
<selectKey keyProperty="id" resultType="int" order="BEFORE">
select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1
</selectKey>
order=“BEFORE”:表示这条语句在insert 语句之前执行
- 参数处理
-
单个参数mybatis不会做特殊处理,直接用#{任意名称} 即可取到值
-
多个参数mybatis 会做处理,将所有参数封装成一个Map,默认key 分别为param1…param2…,取值时使用#{param1 或 索引下标}
-
多个参数的情况可以使用@Param 注解指定封装成Map时的key
-
多个参数都是数据模型对应属性的情况,可以直接传入POJO,取值时使用#{POJO 对应属性名}
-
多个参数没有对应POJO 的情况,则可以使用传入Map,取值时使用#{Map 对应的key}
-
多个参数没有对应POJO 的情况还可以构造一个TO(Transfer Object),然后直接传入即可
-
public Employee getEmp(@Param(“id”) Integer id, String lastName);
取值:id ==> #{id/param1} lastName ==> #{param2}
- public Employee getEmp(Integer id, @Param(“e”) Employee emp);
取值:id ==> #{param1} lastName ==> #{param2.lastName/e.lastName}
- 对于集合与数组类型,即使只有一个参数也会封装成Map
- public Employee getEmp(List ids);
取值:取第一个id值,#{list[0]}
- #{} 与${} 的区别
- #{} 相当与原生JDBC 中 PrepareStatement 的方式,是预编译的方式,可以防止sql注入
- ${} 相当于原生JDBC 中Statement 的方式,是直接拼接的方式,有安全问题
- 大部分情况下都应该使用#{},只有在PrepareStatement 方式中占位符? 无法使用的情况下,才使用${},如分库分表的情况下
- 参数处理其他情况
- jdbcType:指定映射的数据库类型,如字段为空时,默认被映射为OTHER类型, Oracle 不支持,所以要指定为NULL类型。也可以在全局配置文件中指定JdbcTypeForNull 字段值为NULL
- 对于返回值为集合或Map的情况
- 对于集合注意resultType 指定为集合元素类型即可,接口方法返回值声明为集合类型
- 对于将一个数据模型映射为Map的情况,resultType 指定为map(mybatis 内置别名),接口方法返回值声明为Map,返回Map的key即数据模型属性名
- 对于将一组数据模型映射为Map的情况,resultType 指定为数据模型类型,用@MapKey 注解在接口方法上指定Map 的key