在数据变更语句 insert,update 和 delete 时,我们想要知道更新的那条语句的对应的字段(一般就是id),我们可以使用selectKey标签。
selectKey标签属性:
keyProperty | selectKey 语句结果应该被设置到的目标属性。如果生成列不止一个,可以用逗号分隔多个属性名称。 |
keyColumn | 返回结果集中生成列属性的列名。如果生成列不止一个,可以用逗号分隔多个属性名称。 |
resultType | 结果的类型。通常 MyBatis 可以推断出来,但是为了更加准确,写上也不会有什么问题。MyBatis 允许将任何简单类型用作主键的类型,包括字符串。如果生成列不止一个,则可以使用包含期望属性的 Object 或 Map。 |
order | 可以设置为 BEFORE 或 AFTER 。如果设置为 BEFORE ,那么它首先会生成主键,设置 keyProperty 再执行插入语句。如果设置为 AFTER ,那么先执行插入语句,然后是 selectKey 中的语句 - 这和 Oracle 数据库的行为相似,在插入语句内部可能有嵌入索引调用。 |
statementType | 和前面一样,MyBatis 支持 STATEMENT ,PREPARED 和 CALLABLE 类型的映射语句,分别代表 Statement , PreparedStatement 和 CallableStatement 类型。 |
<!--
keyColumn:表示你要查询哪些字段,多个用,隔开
keyProperty:表示将查询的字段的结果赋值给哪个属性,多个用,隔开
resultType:查询到的结果的类型
order:表示在在之前还是之后执行这个查询,一般是之后AFTER
标签体里面写查询语句,一般就查自增长的id,固定语句select last_insert_id();
-->
<insert id="addMember" parameterType="com.angen.pojo.Member">
insert into dlq_member values(null,#{phone},#{username},#{password})
<selectKey
keyColumn="id"
keyProperty="id"
resultType="int"
order="AFTER">
select last_insert_id();
</selectKey>
</insert>
以上配置完成后,我们可以通过执行添加方法后,然后通过pojo类的对象.getId即可获得自增id.
模糊查询
<select id="searchByName" resultType="com.angen.pojo.Member">
select * from dlq_member where `username` like concat("%",#{username},"%")
</select>
或者
<select id="searchByName" resultType="com.angen.pojo.Member">
select * from dlq_member where username like "%${value}%"
</select>
${}和#{}的区别
${}一定要写在引号里面,#{}一定不能写在引号里面。
无论是${}还是${}里面都是写属性名
${}是直接拼接进入sql语句,而#{}是以预处理语句?占位符的方式。所以#{}可以防止sql注入
select标签里面的resultType属性是对结果集进行自动映射,结果集中的字段名对应我们的pojo类中的成员变量名。但是如果有时候不是对应的,或者我们进行联表查询的时候,结果集和pojo类中的成员变量名不一致,那么我们就需要使用select中的resultMap属性,和resultMap标签进行手动映射。
<!--
resultMap属性:
id:与select标签中的resultMap对应即可,唯一标识
type:表示对哪个pojo类进行映射
resultMap子标签:
id标签:表示对主键进行映射
property:pojo类中的属性名
column:数据库中的字段名
result标签:表示对其他非主键进行映射
-->
<resultMap id="infos" type="Member">
<id property="id" column="id" />
<result property="username" column="username"></result>
</resultMap>
动态sql
if标签
<select id="findActiveBlogWithTitleLike"
resultType="Blog">
SELECT * FROM BLOG
WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
</if>
</select>
上面这段表示:如果传过来的title是空,那么就不执行if标签里面的语句。
<select id="findByUsernameAndPhone" parameterType="Member" resultType="com.angen.pojo.Member">
select * from member where and 1=1
<if test="username != null and username.length > 0">
and username=#{username}
</if>
<if test="phone !=null and phone.length > 0">
and phone=#{phone}
</if>
</select>
上面这段,多条件if判断,可以使用where标签的形式来写,如下:
where的作用是如果where标签中的if条件有一个成立,那么才会加上where关键字,并且把第一个and自动去掉。
<select id="findByUsernameAndPhone" parameterType="Member" resultType="com.angen.pojo.Member">
select * from member
<where>
<if test="username != null and username.length > 0">
and username=#{username}
</if>
<if test="phone !=null and phone.length > 0">
and phone=#{phone}
</if>
</where>
</select>
根据多个id批量查询的案例
/**
* 根据多个id查询
*/
List<Member> findByids(List<Integer> ids);
<!--
foreach 标签:
collection要遍历的对象,如果要遍历的对象是一个集合那么就写list
item 遍历出来的每一个元素
index 遍历出来每一个元素的下标
separator指定分割符,在两个字符之间添加
open表示在拼接的语句之前
close表示在拼接的语句之后
-->
<select id="findByids" parameterType="integer" resultType="com.angen.pojo.Member">
select * from dlq_member
<foreach collection="list" item="id" index="i" separator=","
open="where id in (" close=")">
#{id}
</foreach>
</select>
sql标签和include标签
<!--
sql标签
可以定义sql片段,然后可以反复使用,在需要使用的地方使用include标签
-->
<sql id="selectAll">
select * from dlq_member
</sql>
<select id="searchByName" resultType="com.angen.pojo.Member">
<include refid="selectAll"></include>
where username like "%${value}%"
</select>
sql标签定义字段
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.nuris.hub.project.tongduns.mapper.QueryLogMapper">
<resultMap id="BaseResultMap" type="QueryLog">
<id property="logseq" column="logseq" jdbcType="INTEGER" />
<result property="spiderid" column="spider_type_id" jdbcType="INTEGER" />
<result property="userid" column="user_id" jdbcType="VARCHAR" />
<result property="organid" column="organ_no" jdbcType="VARCHAR" />
<result property="name" column="query_name" jdbcType="VARCHAR" />
<result property="type" column="query_certtype" jdbcType="VARCHAR" />
<result property="number" column="query_certno" jdbcType="VARCHAR" />
<result property="querydate" column="query_date" jdbcType="VARCHAR" />
<result property="querytime" column="query_time" jdbcType="VARCHAR" />
<result property="queryreason" column="query_reason" jdbcType="VARCHAR" />
<result property="querystatus" column="query_status" jdbcType="VARCHAR" />
<result property="desc" column="log_desc" jdbcType="VARCHAR" />
<result property="spiderAcc" column="spider_acc" jdbcType="VARCHAR" />
</resultMap>
<!--LOGSEQ,SPIDER_TYPE_ID,USER_ID,ORGAN_NO,QUERY_NAME,QUERY_CERTTYPE,QUERY_CERTNO,QUERY_DATE,QUERY_TIME,
QUERY_REASON,QUERY_STATUS,LOG_DESC,SPIDER_ACC-->
<sql id="BaseColumnList">
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="logseq != null and logseq !=''">LOGSEQ,</if>
<if test="spiderid != null and spiderid !=''">SPIDER_TYPE_ID,</if>
<if test="userid != null and userid !=''">USER_ID,</if>
<if test="organid != null and organid !=''">ORGAN_NO,</if>
<if test="name != null and name !=''">QUERY_NAME,</if>
<if test="type != null and type !=''">QUERY_CERTTYPE,</if>
<if test="number != null and number !=''">QUERY_CERTNO,</if>
<if test="querydate != null ">QUERY_DATE,</if>
<if test="querytime != null ">QUERY_TIME,</if>
<if test="queryreason != null and queryreason !=''">QUERY_REASON,</if>
<if test="querystatus != null and querystatus !=''">QUERY_STATUS,</if>
<if test="desc != null and desc !=''">LOG_DESC,</if>
<if test="spiderAcc != null and spiderAcc !=''">SPIDER_ACC,</if>
</trim>
</sql>
<!--#{logseq},#{spiderid},#{userid},#{organid},#{name},#{type},#{number},-->
<!--#{querydate},#{querytime},#{queryreason},#{querystatus},#{desc},#{spiderAcc}-->
<sql id="BaseColumnValueList">
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="logseq != null and logseq !=''">#{logseq},</if>
<if test="spiderid != null and spiderid !=''">#{spiderid},</if>
<if test="userid != null and userid !=''">#{userid},</if>
<if test="organid != null and organid !=''">#{organid},</if>
<if test="name != null and name !=''">#{name},</if>
<if test="type != null and type !=''">#{type},</if>
<if test="number != null and number !=''">#{number},</if>
<if test="querydate != null ">#{querydate},</if>
<if test="querytime != null ">#{querytime},</if>
<if test="queryreason != null and queryreason !=''">#{queryreason},</if>
<if test="querystatus != null and querystatus !=''">#{querystatus},</if>
<if test="desc != null and desc !=''">#{desc},</if>
<if test="spiderAcc != null and spiderAcc !=''">#{spiderAcc},</if>
</trim>
</sql>
<sql id="TableClause">TB_CRPT_USER_QUERYLOGS</sql>
<delete id="deleteByReportnum" parameterType="String">
delete from <include refid="TableClause" />
</delete>
<insert id="insert" parameterType="QueryLog">
<!-- 获取序列值 -->
<selectKey keyProperty="logseq" resultType="INTEGER" order="BEFORE">
select SEQ_USER_QUERYLOGS_LOGSEQ.nextval
from sysibm.dual
</selectKey>
<!-- 插入实体类 -->
insert into
<include refid="TableClause" />
<include refid="BaseColumnList" />
<include refid="BaseColumnValueList" />
</insert>
</mapper>
foreach标签,一般在批量添加数据的时候运用
<insert id="insertGradeInfos" parameterType="java.util.List">
INSERT INTO TB_GR_RATINGINFO(RECODENO, REPORTID, PC010Q01, PC010Q02, PC010S01, ADD_DATE, ADD_TIME)
VALUES
<foreach collection="list" item="item" index="index" separator=",">
(SEQ_ZX2_RATINGINFO_RECORDNO.nextval, #{item.reportId}, #{item.PC010Q01}, #{item.PC010Q02},
#{item.PC010S01}, current date,current time)
</foreach>
</insert>
版权声明:本文为qq_42572322原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。