1.mybatis返回主键的值:{
insert into sys_user(
id,user_name,user_password,user_email,
user_info,head_img,create_time
)
values(
#{id},#{userName},#{userPassword},#(userEmail),
#{userInfo},#{headImg,jdbcType=BLOB},#{createTime,jdbdType=TIMESTAMP}
)
·Mysql:{
1)适用于主键值自增(数据库主键数据类型为int或者Long){
·修改配置文件
insert into sys_user(
id,user_name,user_password,user_email,
user_info,head_img,create_time
)
values(
#{id},#{userName},#{userPassword},#(userEmail),
#{userInfo},#{headImg,jdbcType=BLOB},#{createTime,jdbdType=TIMESTAMP}
)
·在对应的接口中将方法的返回值设定为对应的返回值。
}
2)适用于所有的情况:{
·修改配置文件
insert into sys_user(
id,user_name,user_password,user_email,
user_info,head_img,create_time
)
values(
#{id},#{userName},#{userPassword},#(userEmail),
#{userInfo},#{headImg,jdbcType=BLOB},#{createTime,jdbdType=TIMESTAMP}
)
SELECT LAST_INSERT_ID()
·在对应的接口中将方法的返回值设定为对应的返回值即可
}
}
Oracle:{
·修改配置文件
SELECT SEQ_ID.nextval from dual
insert into sys_user(
id,user_name,user_password,user_email,
user_info,head_img,create_time
)
values(
#{id},#{userName},#{userPassword},#(userEmail),
#{userInfo},#{headImg,jdbcType=BLOB},#{createTime,jdbdType=TIMESTAMP}
)
·在对应的接口中将方法的返回值设定为对应的返回值即可
}
注意:类似于Mysql第二种方式,或者是Oracle的返回主键值的方式标签执行的顺序仅仅和改标签配置的
order属性值相关,和它在insert语句的前后顺序无关;
其他一些支持逐渐自增数据库配置selectKey中回写主键的sql可查阅《Mybatis从入门到精通 刘增辉著》第二章,p42.
}
2.使用map或者@Param注解来解决多个接口参数的问题{
·当接口对应的方法中只有一个参数时,Mybatis并不关心参数叫什么名字就会把这个唯一的参数值拿来使用;
·当接口对应的方法中有多个入参时,若没有使用@Param注解来标识参数名,那么Mybatis默认可用的参数名只有
[0,1,param1,param2]
·当多接口参数中使用了@Param注解来标识参数名,那么Mybatis便可识别对应在注解中标识的参数.
}
3.mybatis 模糊查询(like):{
·普通SQL
·动态SQL
}
4.动态SQL:{
1)if{
·在where子句中使用if(例如上述笔记的like模糊查询)
·在UPDATE中使用if{
update sys_user
set
user_name = #{userName},
user_password = #{userPassword},
user_email = #{userEmail},
user_info = #{userInfo},
head_img = #{headImg,jdbcType=BLOB},
id = #{id}
where id=#{id}
}
·在INSERT动态插入中使用if:{
insert into sys_user(
id,user_name,user_password,
user_email,
user_info,head_img,create_time
)
values(
#{id},#{userName},
#(userEmail),
#{userInfo},#{headImg,jdbcType=BLOB},#{createTime,jdbdType=TIMESTAMP}
)
}
}
2)choose提供if...else、if...else...的逻辑:{
需求:当参数id有值的时候优先使用id进行查询,当id没有值的时候就判断userName是否有值,如果用户名有值
就使用用户名查询,如果用户名也没有值那就使SQL查询无结果。
}
3)where、set、trim{
1)where{
}
5.mybatis二级缓存配置:{
}
6.mybatis高级映射:{
1)mybatis单表查询:{
·单表查询时可以使用字段别名来实现查询返回结果集和JavaBean的映射;
·可以通过配置resultMap来实现映射;
·如果数据库字段和JavaBean符合转驼峰规则,通过在mybatis中配置全局属性:
}
2)一对一映射:{
eg:{
package com.hsun.mybatis.model.SysUser;
public class User{
private String userName;
private String userPassword;
private SysRole role;//SysRole是一个实体类
//setter、getter
}
·使用别名映射
selcet
u.user_name,
u.user_password,
r.id "role.id",
r.role_name "role.roleName"
from sys_user u
inner join sys_user_role ur on u.id = ur.user_id
inner join sys_role r on ur.role_id = r.id
where u.id = #{id}
注意:上述方法中sys_role 查询列的别名都是"role."前缀,通过这种方式,将role的属性都映射到了
SysUser的role属性上。
·使用resultmap映射
注意:该种配置在property属性中使用“role."前缀,column部分为了避免不同表中存在相同的列,所有可能重名
的列都加了"role_"前缀,使用这种配置的时候还要在查询时使用不同的别名。查询语句如下:
selcet
u.user_name,
u.user_password,
r.id role_id,
r.role_name
from sys_user u
inner join sys_user_role ur on u.id = ur.user_id
inner join sys_role r on ur.role_id = r.id
where u.id = #{id}
·使用resultMap标签的association标签来配置一对一映射
注意:
·property:实体类中的属性名,必选项,
·javaType:属性对应的Java类型。
·resultMap:可以使用现有的resultMap,而不需要在association标签中配置result
·columnPrefix:查询列的前缀,配置前缀后,在子标签result的column可以省略前缀。
但是在查询时,role对应的查询列都要使用别名并且别名必须是以此处配置的前缀开头的。
·在mybatis中不同命名空间下的resultMap也是可以引用的,引用时需要加上”命名空间.resultMap的id属性“
例如:有关role的属性全部配置到RoleMapper.xml 文件中,其中有一个resultMap的id为roleMap,那么在
UserMapper.xml文件中引用的方式如下:
}
·association标签嵌套查询:{
·association标签的嵌套查询常用的属性如下:{
select:另一个映射查询的id,mybatis会额外执行这个查询获取嵌套对象的结果.
column: 列名(或别名),将主查询中列的结果作为嵌套查询的参数,配置方式如:
column={prop1=col1,prop2=col2},prop1,prop2将作为嵌套查询的参数.
·fetchType:数据加载方式,可选值为lazy和eager,分别为延迟加载和积极加载,这个配置
会会覆盖全局的lazyLoadingEnabled配置。
}
}
}
3)一对多映射:{
使用collection集合的嵌套映射:
或者:
}
}
7.mybatis 部分常用settings配置:{
}