1、insert返回主键id
自增主键:
方法一:通过设置useGeneratedKeys,keyProperty参数,keyProperty表示将获取到的主键值id返回到bean Employee中某个字段(字段名称必须与“id”一致)。
<insert id="addEmp" parameterType="com.mybatis.domain.Employee"
useGeneratedKeys="true" keyProperty="id">
insert into tbl_employee(last_name,gender,email) values(#{lastName},#{gender},#{email})
</insert>
方法二:通过设置<selectKey>标签返回,order参数After代表insert执行之后返回主键id,before代表insert执行之后返回主键id。
<insert id="addEmp" parameterType="com.mybatis.domain.Employee"> <selectKey keyProperty="id" order="AFTER" resultType="Integer"> SELECT LAST_INSERT_ID() </selectKey> insert into tbl_employee(last_name,gender,email) values(#{lastName},#{gender},#{email}) </insert>
非自增主键
获取uuid为主键的值:
<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User"> <selectKey keyProperty="id" order="BEFORE" resultType="Integer"> SELECT uuid() </selectKey> insert into user(id,username,birthday,sex,address) values(#{id},#{username},#{birthday},#{sex},#{address}) </insert>
获取列的下一个值:
<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User"> <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String"> SELECT 序列名.nextval() </selectKey> insert into user(id,username,birthday,sex,address) value(#{id},#{username},#{birthday},#{sex},#{address}) </insert>
2、mybatis ${} 防sql注入
#{}是经过预编译的(),是安全的;打印sql如下
select id, username, password, role from user where username= ? and password=?
当username传入 1,password传入为 “zz;drop table user;” 时执行的sql为:
select id, username, password, role from user where username= “1” and password=“zz;drop table user;”
drop table user 语句不会再编译。
${}是未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入。
当username传入 1,password传入为 “zz;drop table user;” 时执行的sql为:
select id, username, password, role from user where username= 1 and password=zz;drop table user;
drop table user 语句会再编译,将表user删除。