记录一下在实习中使用mybatis所用到的一些功能和应该注意的一些小事项(踩过的坑)
循环里不要写操作数据库的方法,因为这样你循环多少次,就会访问多少次数据库,如果库中数据量庞大容易造成服务崩坏。所以如果要操作多条数据尽量使用批量操作
注意事项
- 不要手写sql
- 书写SQL DML语句需要注意的地方
- 字段和表名看好不要写错了
- 字段的数据类型和你要写入的数据类型要一致
- 不要超过字段数据类型的范围
- 不要违反数据库字段的约束,比如:非空,值唯一,有默认值
- 在可以操作数据库的地方,执行一遍后,确认无误后复制粘贴过来
- XML文件里的SQL语句就不要写分号了,批量更新语句有分号的时候就报错了。
批量插入
Mybatis的预Sql:Preparing: insert into student(student_id, name, age, gender, major, enrollment_year) values (?,?,?,?,?,?) , (?,?,?,?,?,?)
所以foreach就要写在values的后面,而且只需要一个separator=","来声名是用逗号进行隔开的
<foreach collection="list" item="el" separator=",">
批量插入,collection不是要与传来的参数保持一致,是参数的类型
item是当前集合的迭代对象,insert的value每个字段值都要写成el.字段
批量插入示例
<!-- 批量插入-->
<insert id="bulkInsertStudent">
insert into student(student_id, name, age, gender, major, enrollment_year)
values
<foreach collection="list" item="item" separator=",">
(#{item.studentId},#{item.name},#{item.age},#{item.gender},#{item.major},#{item.enrollmentYear})
</foreach>
</insert>
批量更新
<foreach collection="list" item="eC" separator=";">
批量更新
批量更新,collection不是要与传来的参数保持一致,是参数的类型
separator是分号,用来多个更新sql语句的隔离
只有中间是数据库字段的名称,其余需要迭代对象.字段名,
逗号只有最后一行不加,其余行要加
Mybatis的预SQL(实际就是多条语句中间以分号进行分割,一次性执行多条语句)
update student SET name=?, age=?, enrollment_year=? where student_id = ? ;
update student SET name=?, age=?, enrollment_year=? where student_id = ?
<!-- 批量更新加动态更新-->
<!-- 必要情况下检验String类型的字段是不是空字符串-->
<update id="bulkUpdateStudent">
<foreach collection="list" item="item" separator=";">
update student
<set>
<if test="item.name !=null">name=#{item.name},</if>
<if test="item.age !=null">age=#{item.age},</if>
<if test="item.gender !=null">gender=#{item.gender},</if>
<if test="item.major !=null">major=#{item.major},</if>
<if test="item.enrollmentYear !=null">enrollment_year=#{item.enrollmentYear}</if>
</set>
where student_id = #{item.studentId}
</foreach>
</update>
批量查询
Mybatis的预SQL语句 postman参数:[2,3,4,5]
Preparing: select * from student where student_id in ( ? , ? , ? , ? )
查询示例
<!-- foreach进行批量查询-->
<select id="selectByList" resultType="cn.hechongyang.entry.pojo.Student">
select * from student where student_id in
<foreach collection="list" item="item" separator="," open="(" close=")">
#{item}
</foreach>
</select>
可以对查询的多个字段在Mapper就进行起别名,方便返回到service直接进行操作
xml文件里的DML方法可选参数
parameterType 参数类型 xml文件里parameterType,是集合里单个数据的类型
resultType 返回值类型 xml文件里resultType,是集合里单个数据的类型
如果parameterType是Map的话,那么collection就是map里的导入集合的key
如果parameterType是list的话,那么collection就是这个集合的类型就是collection=list
疑问
参数类型不写,为啥也不会报错
接口传来的数据字段,你要使用实体类来接收的话实体类的属性字段要与传来的保持一致
或者你可以使用注解来起别名,标明是和接口传来的数据。