这个其实是有好几种问题的,先把网上那种先 生成key,再返回的到实体类中的
使用数据库自定义函数nextval(‘student’) ,生成一个key,并把他设置到传入的实体类中的studentId属性上。在执行完此方法后,把该 key 赋值给 studentId属性
<insert id="createStudent" parameterType="data.model.StudentEntity" keyProperty="studentId">
<selectKey keyProperty="studentId" resultType="String" order="BEFORE">
select nextval('student')
</selectKey>
INSERT INTO STUDENT_TBL(STUDENT_ID, STUDENT_SEX, STUDENT_PHOTO)
VALUES (#{studentId}, #{studentSex},
#{studentPhoto, javaType=byte[], jdbcType=BLOB, typeHandler=org.apache.ibatis.type.BlobTypeHandler})
</insert>
再是一种 ID 是自增长的
这里参数我传入的是 map
设置 useGeneratedKeys=”true” 自增长
keyProperty=”ID” 这个ID 实际就是指的数据库自增长的那个字段,在insert完成后会默认填充给他,执行完成后 在map里面取到对应的key获取value就可以了
<insert id="insertTaxiOrder" parameterType="map" useGeneratedKeys="true" keyProperty="ID" >
INSERT INTO tb_TaxiOrderInfo ( UserID, DriverID, StartAddress)
VALUES (#{userID}, 0, #{StartAdd}})
</insert>
属性 描述 取值
1.keyProperty selectKey 语句生成结果需要设置的属性。
2.resultType 生成结果类型,MyBatis 允许使用基本的数据类型,包括String 、int, map类型。
3.order
3.1:BEFORE,会先选择主键,然后设置keyProperty,再执行insert语句;
3.2:AFTER,就先运行insert 语句再运行selectKey 语句。
4.statementType MyBatis 支持STATEMENT,PREPARED和CALLABLE 的语句形式, 对应Statement ,PreparedStatement 和CallableStatement 响应
2.1这个我传入的参数是 map形式的,在mapper中的sql语句中可以用 if进行判断 参数值是否为null,才会看是否执行if中的代码块,数字也是可以的
<select id="registerCYUser" parameterType="map" resultType="map">
SELECT WorkStaffID, ISNULL(PWD,'') AS PWD, WorkType
from tb_WorkStaff
WHERE
WorkType = #{WorkType}
<if test="CarNum != null">
AND
CarNum = #{CarNum}
<if test="CarNum == null">
AND
CarNum = #{CarNum}
</if>
</select>
2.2 如果参数传入的是实体类,也可以这样判断
网上的就下面这样拿过来,在if中进行判断
<select id="StudentLis" resultMap="studentResult" parameterType="model.StudentEntity">
SELECT ST.STUDENT_ID, ST.STUDENT_NAME,
FROM STUDENT_TBL ST
WHERE
<if test="studentSex != null and studentSex != '' ">
AND ST.STUDENT_SEX = #{studentSex, jdbcType=INTEGER}
</if>
<if test="placeEntity != null and placeEntity.placeId != null and placeEntity.placeId != '' ">
AND ST.PLACE_ID = #{placeEntity.placeId, jdbcType=VARCHAR}
</if>
</select>
2.3 if 和 set 使用组合 更新 update
<update id="updateZSInfo" parameterType="map">
UPDATE tb_OrdinaryUser
<set>
<if test="UserName != null">
UserName = #{UserName},
</if>
<if test="Phone != null">
Phone = #{Phone},
</if>
<if test="Email != null">
Email = #{Email},
</if>
</set>
WHERE userID = #{UserId}
</update>
3.1 trim 替代 where
<select id="if_trim" resultMap="studentEntity">
SELECT ST.STUDENT_ID,
ST.STUDENT_NAME,
FROM STUDENT_TBL ST
<trim prefix="WHERE" prefixOverrides="AND|OR">
<if test="studentName !=null ">
ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName, jdbcType=VARCHAR}),'%')
</if>
<if test="studentSex != null and studentSex != '' ">
AND ST.STUDENT_SEX = #{studentSex, jdbcType=INTEGER}
</if>
<if test="studentBirthday != null ">
AND ST.STUDENT_BIRTHDAY = #{studentBirthday, jdbcType=DATE}
</if>
</trim>
</select>
3.2 trim代替 set
<update id="update_trim" parameterType="StudentEntity">
UPDATE STUDENT_TBL
<trim prefix="SET" suffixOverrides=",">
<if test="studentName != null and studentName != '' ">
STUDENT_TBL.STUDENT_NAME = #{studentName},
</if>
<if test="studentSex != null and studentSex != '' ">
STUDENT_TBL.STUDENT_SEX = #{studentSex},
</if>
</trim>
WHERE STUDENT_TBL.STUDENT_ID = #{studentId}
</update>
4.1 choose 是集合 when 和 otherwise 使用的
<!-- 6 choose(判断参数) - 按顺序 将判断成功进入第一个进入 when执行的语句 作为where条件 如果when 都没有进入 ,就会进入 otherwise 中执行-->
<select id="choose" resultMap="studentEntity" parameterType="StudentEntity">
SELECT ST.STUDENT_ID,
ST.STUDENT_NAME,
FROM STUDENT_TBL ST
<where>
<choose>
<when test="studentName !=null ">
ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName, jdbcType=VARCHAR}),'%')
</when >
<when test="studentBirthday != null ">
AND ST.STUDENT_BIRTHDAY = #{studentBirthday, jdbcType=DATE}
</when >
<otherwise>
</otherwise>
</choose>
</where>
</select>
这个比自己在外部for循环执行,效率会快很多。
foreach一共有三种类型,分别为List,,Map三种
item :
循环体中的具体对象。支持属性的点路径访问,如item.age,item.info.details。
具体说明:在list和数组中是其中的对象,在map中是value。
该参数为必选。
collection:
要做foreach的对象,作为入参时,
1.List 对象默认用list代替作为键
2. 数组对象有array代替作为键
3. Map对象有map默认的键。
当然在作为入参时可以使用@Param(“keyName”)来设置键,设置keyName后,list,array将会失效。 除了入参这种情况外,还有一种作为参数对象的某个字段的时候。
举个例子:
1.如果User有属性List ids。入参是User对象,那么这个collection = “ids”
2.如果User有属性Ids ids;其中Ids是个对象,Ids有个属性List id;入参是User对象,那么collection = “ids.id”上面只是举例,具体collection等于什么,就看你想对那个元素做循环。该参数为必选。
3.separator: 元素之间的分隔符,例如在in()的时候,separator=”,”会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。open: foreach代码的开始符号,一般是(和close=”)”合用。常用在in(),values()时。该参数可选。
4.close: foreach代码的关闭符号,一般是)和open=”(“合用。常用在in(),values()时。该参数可选。
5.index: 在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选。
5.1 传入 数组
实质就是循环 aa 实体类中的 list,中的一个list
<select id="foreach_array" resultMap="bb" parameterType="aa">
SELECT xx._ID,
xx._NAME,
FROM XXXX xx
WHERE xx._ID
IN
<foreach collection="array" item="classId" open="(" separator="," close=")">
#{classId}
</foreach>
</select>
5.2 配合 in 使用 参数传入一个list
<select id="countByUserList" resultType="_int" parameterType="list">
select count(*) from users
<where>
id in
<foreach item="item" collection="list" separator="," open="(" close=")" index="">
#{item.id, jdbcType=NUMERIC}
</foreach>
</where>
</select>
5.3 批量插入
方式1
insert into aa ( depart1, depart2 ) values
<foreach collection="list" item="item" index="index"
separator=",">
( #{item.depart1}, #{item.depart2} )
</foreach>
方式2
insert into table(aa,bb) <foreach collection="list" item="item" index="index" separator="union all"> select #{item.hkgs,aa=VARCHAR}, #{item.bb,jdbcType=VARCHAR}, } from dual </foreach>
5.4 批量删除
<delete id="dd" parameterType="list">
DELETE FROM LD_USER WHERE ID in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</delete>
5.5 批量修改
<update id="update" parameterType="list">
update table set age = '0' where no in
<foreach collection="list" item="nos" open="(" separator="," close=")">
#{nos}
</foreach>
</update>
5.6 批量条件查询
<select id="sel" resultType="int">
select count(*) from aa where
<foreach item="item" index="key" collection="map"
open="" separator="AND" close="">
${key} = #{item}</foreach>
</select>
$ {} 是原样输出, #{} 是取值