MyBatis(五) insert、update、delete 、主键回填、返回matched行数和affected行数、参数配置#{},${}

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Ditto_zhou/article/details/80921538

insert元素

<insert id="insertStudent" parameterType="student">
   insert into student_info (stu_age,stu_sex,stu_name) values 
   (#{stuAge},#{stuSex},#{stuName})
  </insert>

属性和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 id="insertStudent" parameterType="student" keyProperty="stuId" 
  useGeneratedKeys="true"
  >
   insert into student_info (stu_age,stu_sex,stu_name) values 
   (#{stuAge},#{stuSex},#{stuName})
  </insert>

其他规则主键生成(比如说序列生成)

借助seletkey元素:  

keyProperty表示主键字段,resultType是返回的主键类型

order 属性可选 (before,after) 默认是before,表示insert前或者insert后获取key

之后也是通过调用对象的get主键方法获取主键值。

<selectKey keyProperty="stuId" resultType="int" order="BEFORE">
   select if(max(stu_id) is null,1,max(stu_id)+2) from student_info	
  </selectKey>

如果是序列只要将上面的sql片段替换   select 序列.nextval from dual

完整使用

<insert id="insertStudent" parameterType="student" 
  >
  <selectKey keyProperty="stuId" resultType="int" order="BEFORE">
   select if(max(stu_id) is null,1,max(stu_id)+2) from student_info	
  </selectKey>
   insert into student_info (stu_age,stu_sex,stu_name) values 
   (#{stuAge},#{stuSex},#{stuName})
  </insert>

update 和delete元素

Mybatis执行完update和delete也会返回影响的行数。存在返回行数的值有问题的,检查defaultExecutorType的参数设置,可以进行设为simple,simple就是默认值。

<update id="updateStudentInfo" parameterType="student">
  	update student_info 
  	set stu_name = #{stuName} where stu_id = #{stuId}
  </update>
  <delete id="deleteStudentbyId" parameterType="int">
  	delete from student_info where stu_id = #{id}
  </delete>

获取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语句本省的内容。

<sql id="studentColumns">
  	${prefix}.stu_id,${prefix}.stu_Age,${prefix}.stu_Sex,${prefix}.stu_Name 
  </sql>
 <include refid="studentColumns">
    	<property name="prefix" value="m"/>
    </include>

参考博客:https://www.jianshu.com/p/daccc3ad6867


展开阅读全文

没有更多推荐了,返回首页