insert元素
insert into student_info (stu_age,stu_sex,stu_name) values
(#{stuAge},#{stuSex},#{stuName})
属性和select元素的基本一样,比较特殊是下面属性
useGeneratedKeys | 使用JDBC的getGeneratedKeys取出数据库内部生成的主键,要使 用必须给keyProperty或者keyColumn赋值 |
true/false,默认是false |
keyProperty | 表示pojo的那个属性的作为主键 | 如果是联合主键逗号隔开。 |
keyColumn | 指明第几列是主键,不能和keyProperty同时使用,只接受整型参数(1,2,3等等) | 如果是联合主键的是逗号隔开 如1,2 |
加上 useGeneratedKey = "true" , keyProperty = "javaBean的主键字段",在insert 对象后,直接调用对象的主键字段的
get方法获取主键
insert into student_info (stu_age,stu_sex,stu_name) values
(#{stuAge},#{stuSex},#{stuName})
其他规则主键生成(比如说序列生成)
借助seletkey元素:
keyProperty表示主键字段,resultType是返回的主键类型
order 属性可选 (before,after) 默认是before,表示insert前或者insert后获取key
之后也是通过调用对象的get主键方法获取主键值。
select if(max(stu_id) is null,1,max(stu_id)+2) from student_info
如果是序列只要将上面的sql片段替换 select 序列.nextval from dual
完整使用
select if(max(stu_id) is null,1,max(stu_id)+2) from student_info
insert into student_info (stu_age,stu_sex,stu_name) values
(#{stuAge},#{stuSex},#{stuName})
update 和delete元素
Mybatis执行完update和delete也会返回影响的行数。存在返回行数的值有问题的,检查defaultExecutorType的参数设置,可以进行设为simple,simple就是默认值。
update student_info
set stu_name = #{stuName} where stu_id = #{stuId}
delete from student_info where stu_id = #{id}
获取matched行数
默认情况下,返回的就是matched 行数。也就是查询条件匹配的行数。
defaultExecutorType有三个执行器SIMPLE、REUSE和BATCH。其中BATCH可以批量更新操作缓存SQL以提高性能,但是有个缺陷就是无法获取update、delete返回的行数。defaultExecutorType的默认执行器是SIMPLE。
int count = mapper.insertStudent(stu);
如果有SQL片段,update student_info set sex = '1' where id =1; 数据库里面执行会影响一条记录
当mybatis第一次执行的时候返回的1
当mybatis第二次执行的时候返回的也是1,其实我们想要获取的是更改的记录数。也就是Affected rows.
如何获取Affected rows
因为mybatis返回的默认是匹配的行数,而不是受影响的行数,如何设置返回的是受影响的行数,
加上useAffectedRows参数为true
jdbc:mysql://${jdbc.host}/${jdbc.db}?useAffectedRows=true
Mybatis的入参配置
入参的时候可以指定下面这些参数。
javaType是可选的,如果不指定,会自动检测.
#{age,jdbcType=TINYINT,javaType=Integer,typeHandler=...}
#{}: 入参,mybatis会做预编译处理,比较安全,适合传入的形参,sql语句具体需要的参数值
${} : mybatis不会做预编译处理,不安全,适合传入SQL语句本省的内容。
${prefix}.stu_id,${prefix}.stu_Age,${prefix}.stu_Sex,${prefix}.stu_Name
参考博客:https://www.jianshu.com/p/daccc3ad6867