关于mybatis最基本的动态sql

看着老司机的代码,密密麻麻的,特别是sql,吓死宝宝了。对于刚出道的小菜鸟只好自己总结。自己的写了个小项目练练手。




一切只看这个xml文件里的内容。

<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"      
 "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="com.lyl.mapper.UserDao">
<sql id="Base_Column_List">
TAB_USER.ID,TAB_USER.NAME,AGE,SEX,ADDRESS
</sql>
<sql id="Base_Column_List_Role">
R.ID R_ID,R.NAME R_NAME,R.USERID
</sql>
<resultMap id="baseResultMap" type="project.entity.User">
<result column="ID" property="userId" />
<result column="NAME" property="userName" />
<result column="AGE" property="age" />
<result column="SEX" property="sex" />
<result column="ADDRESS" property="address" />
<collection property="roles" javaType="list" ofType="project.entity.Role">
<id column="R_ID" property="rId" javaType="int" jdbcType="INTEGER" />
<result column="R_NAME" property="rName" javaType="string"
jdbcType="NVARCHAR" />
<result column="USERID" property="userId" javaType="int"
jdbcType="INTEGER" />
</collection>
</resultMap>
<select id="selectUsersByName" parameterType="project.entity.User"
resultMap="baseResultMap">
SELECT
<include refid="Base_Column_List" />
FROM TAB_USER
<where>
<if test="userName!=null">
NAME=#{userName}
</if>
</where>
</select>
<select id="selectUsersById" parameterType="project.entity.User"
resultMap="baseResultMap">
SELECT
<include refid="Base_Column_List" />
FROM TAB_USER
<trim prefix="WHERE" prefixOverrides="AND|OR">
<if test="userId!=null">
ID=#{userId}
</if>
</trim>
</select>
<insert id="save" parameterType="project.entity.User">
INSERT INTO TAB_USER
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="userId!=null">
ID,
</if>
<if test="userName!=null">
NAME,
</if>
<if test="age!=null">
AGE,
</if>
<if test="sex!=null">
SEX,
</if>
<if test="address!=null">
ADDRESS,
</if>
</trim>
<trim prefix="VALUES(" suffix=")" suffixOverrides=",">
<if test="userId!=null">
#{userId,jdbcType=INTEGER,javaType=java.lang.Integer},
</if>
<if test="userName!=null">
#{userName,jdbcType=NVARCHAR,javaType=java.lang.String},
</if>
<if test="age!=null">
#{age,jdbcType=INTEGER,javaType=java.lang.Integer},
</if>
<if test="sex!=null">
#{sex,jdbcType=CHAR,javaType=java.lang.Character},
</if>
<if test="address!=null">
#{address,jdbcType=NVARCHAR,javaType=java.lang.String},
</if>
</trim>
</insert>


<update id="update" parameterType="project.entity.User">
UPDATE TAB_USER
<trim prefix="set" suffixOverrides="," suffix="">
<if test="userName!=null">
NAME=#{userName},
</if>
<if test="address!=null">
ADDRESS=#{address},
</if>
</trim>
<where>
<if test="userId!=null">
ID=#{userId}
</if>
</where>
</update>


<select id="sforeach" resultMap="baseResultMap">
SELECT
<include refid="Base_Column_List" />
FROM TAB_USER
WHERE ID IN
<foreach collection="list" index="index" item="item" open="("
separator="," close=")">
#{item}
</foreach>
</select>


<select id="sparamerTypeMap" parameterType="map" resultMap="baseResultMap">
SELECT
<include refid="Base_Column_List" />
FROM TAB_USER
<where>
<choose>
<when test="userId==3">
<![CDATA[AGE=3]]>
</when>
<when test="userId==2">
<![CDATA[AGE=2]]>
</when>
<when test="userId==4">
<![CDATA[NAME LIKE '%'||#{userName}||'%']]>
</when>
<otherwise>
<![CDATA[AGE=1]]>
</otherwise>
</choose>
</where>
</select>
<!-- 字段名相同时处理 -->
<select id="scollection" resultMap="baseResultMap">
SELECT
<include refid="Base_Column_List" />
,
<include refid="Base_Column_List_Role" />
FROM TAB_USER
LEFT JOIN ROLE R
ON
TAB_USER.ID=R.USERID
</select>
<!-- 主键生成策略 -->
<!-- 使用序列 -->
<insert id="batchInsert2"  parameterType="project.entity.Emp">
<!-- select sys_guid() as bId from dual; -->
<selectKey keyProperty="bId" order="BEFORE" resultType="int">
select seq_emp.nextval as bId from dual
</selectKey>
INSERT INTO EMP
<trim prefix="(" suffix=")" suffixOverrides=",">
BID,EMPNAME,AGE,SEX,CREATETIME,SALARY,
</trim>
<trim prefix=" VALUES (" suffix=")" suffixOverrides=","> 
#{bId},#{empName},#{age},#{sex},#{createTime},#{salary}
</trim>
</insert>
<!-- 批量插入数据,主键自动生成 -->
<insert id="batchInsert"  parameterType="list">
INSERT INTO EMP
<trim prefix="(" suffix=")" suffixOverrides=",">
BID,EMPNAME,AGE,SEX,CREATETIME,SALARY,
</trim>
SELECT seq_emp.nextval, e.* FROM
<foreach collection="list" item="item" index="index" open="(" close=")" separator="union all">
SELECT 
#{item.empName},#{item.age},#{item.sex},#{item.createTime},#{item.salary}
FROM DUAL
</foreach>
e
</insert>
<!--UUID生成主键  -->
<insert id="saveStu" parameterType="project.entity.Student">
<selectKey keyProperty="stuId" order="BEFORE" resultType="java.lang.String">
SELECT SYS_GUID() FROM DUAL
</selectKey>
INSERT INTO STUDENT 
<trim prefix="(" suffixOverrides="," suffix=")">
STUID,STUNAME,
</trim>
<trim prefix=" VALUES (" suffixOverrides="," suffix=")">
#{stuId},#{stuName},
</trim>
</insert>

</mapper>

整体内容都复制如上:

一、

<sql id="Base_Column_List">
TAB_USER.ID,TAB_USER.NAME,AGE,SEX,ADDRESS
</sql>
<sql id="Base_Column_List_Role">
R.ID R_ID,R.NAME R_NAME,R.USERID
</sql>

这两个<sql>相当于把需要的字段举例出来,以便后面使用。

比如,根据id使用它,相当于粘贴里面的内容信息一样。

<!-- 字段名相同时处理 -->
<select id="scollection" resultMap="baseResultMap">
SELECT
<include refid="Base_Column_List" />
,
<include refid="Base_Column_List_Role" />
FROM TAB_USER
LEFT JOIN ROLE R
ON
TAB_USER.ID=R.USERID
</select>

二、

<resultMap id="baseResultMap" type="project.entity.User">
<result column="ID" property="userId" />
<result column="NAME" property="userName" />
<result column="AGE" property="age" />
<result column="SEX" property="sex" />
<result column="ADDRESS" property="address" />
<collection property="roles" javaType="list" ofType="project.entity.Role">
<id column="R_ID" property="rId" javaType="int" jdbcType="INTEGER" />
<result column="R_NAME" property="rName" javaType="string"
jdbcType="NVARCHAR" />
<result column="USERID" property="userId" javaType="int"
jdbcType="INTEGER" />
</collection>
</resultMap>

这里的代码就是对数据库里的字段名和类的属性不一致时做处理,里面的collection就是User里有role集合。组合关系嘛。




三、做非空判断--使用<if test="类的属性名称">,把where写成<where>主要还是当条件不满足时不会出现语法错误。比如:select * from TAB_USER where ;

<select id="selectUsersByName" parameterType="project.entity.User"
resultMap="baseResultMap">
SELECT
<include refid="Base_Column_List" />
FROM TAB_USER
<where>
<if test="userName!=null">
NAME=#{userName}
</if>
</where>
</select>

四、

<select id="selectUsersById" parameterType="project.entity.User"
resultMap="baseResultMap">
SELECT
<include refid="Base_Column_List" />
FROM TAB_USER
<trim prefix="WHERE" prefixOverrides="AND|OR">
<if test="userId!=null">
ID=#{userId}
</if>
</trim>
</select>

这里用到trim:

trim 属性
                prefix:前缀覆盖并增加其内容
                suffix:后缀覆盖并增加其内容
                prefixOverrides:前缀判断的条件
                suffixOverrides:后缀判断的条件

通俗点讲,prefixOverrides是个标记,prefix这个就是专门覆盖那个标记的。同理。比如上句,where就是替换and或者or的。

下面的这个更容易理解。

<insert id="save" parameterType="project.entity.User">
INSERT INTO TAB_USER
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="userId!=null">
ID,
</if>
<if test="userName!=null">
NAME,
</if>
<if test="age!=null">
AGE,
</if>
<if test="sex!=null">
SEX,
</if>
<if test="address!=null">
ADDRESS,
</if>
</trim>
<trim prefix="VALUES(" suffix=")" suffixOverrides=",">
<if test="userId!=null">
#{userId,jdbcType=INTEGER,javaType=java.lang.Integer},
</if>
<if test="userName!=null">
#{userName,jdbcType=NVARCHAR,javaType=java.lang.String},
</if>
<if test="age!=null">
#{age,jdbcType=INTEGER,javaType=java.lang.Integer},
</if>
<if test="sex!=null">
#{sex,jdbcType=CHAR,javaType=java.lang.Character},
</if>
<if test="address!=null">
#{address,jdbcType=NVARCHAR,javaType=java.lang.String},
</if>
</trim>
</insert>

正确的ADDRESS,后面不需要逗号了。但是我这里有,suffixOverrides=“,”找到这个逗号,suffix=")" 将其替换成")"。这样就代码正确了。

五、select * from 表名 where  xx in ()这种语法结构的使用:

<select id="sforeach" resultMap="baseResultMap">
SELECT
<include refid="Base_Column_List" />
FROM TAB_USER
WHERE ID IN
<foreach collection="list" index="index" item="item" open="("
separator="," close=")">
#{item}
</foreach>
</select>

一般Dao层传过来的是个集合list,separator是分隔符,item="item"i,tem是集合中的元素对象。


六、<![CDATA[]]>标签,这个在这里不是注释的意思。是说明这段代码是纯文本。比如像这个>(大于号),<(小于号)在这里就是表示大于号小于号的意思。不是表示尖括号<>的一半。

<select id="sparamerTypeMap" parameterType="map" resultMap="baseResultMap">
SELECT
<include refid="Base_Column_List" />
FROM TAB_USER
<where>
<choose>
<when test="userId==3">
<![CDATA[AGE=3]]>
</when>
<when test="userId==2">
<![CDATA[AGE=2]]>
</when>
<when test="userId==4">
<![CDATA[NAME LIKE '%'||#{userName}||'%']]>
</when>
<otherwise>
<![CDATA[AGE=1]]>
</otherwise>
</choose>
</where>
</select>

七、当查询的时候两个类属性名完全相同时,

<!-- 字段名相同时处理 -->
<select id="scollection" resultMap="baseResultMap">
SELECT
<include refid="Base_Column_List" />
,
<include refid="Base_Column_List_Role" />
FROM TAB_USER
LEFT JOIN ROLE R
ON
TAB_USER.ID=R.USERID
</select>

比如我的,角色role类有id,user类也有id。如果使用上面的第二个介绍,按正常想都是:

参考第二个:

<collection property="roles" javaType="list" ofType="project.entity.Role">
<id column="R_ID" property="rId" javaType="int" jdbcType="INTEGER" />
<result column="R_NAME" property="rName" javaType="string"
jdbcType="NVARCHAR" />
<result column="USERID" property="userId" javaType="int"
jdbcType="INTEGER" />
</collection>

这里面的column="R_ID"应该写成column="id"才是吧。但是这样不出来的。出来的这个id是user的id。所以我就在定义

<sql id="Base_Column_List_Role">的时候给他取了个别名。后面就用的是别名了。刚才注意到了没有呢。。。
R.ID R_ID,R.NAME R_NAME,R.USERID
</sql>


八、主键生成策略:

<!-- 主键生成策略 -->
<!-- 使用序列 -->
<insert id="batchInsert2"  parameterType="project.entity.Emp">
<!-- select sys_guid() as bId from dual; -->
<selectKey keyProperty="bId" order="BEFORE" resultType="int">
select seq_emp.nextval as bId from dual
</selectKey>
INSERT INTO EMP
<trim prefix="(" suffix=")" suffixOverrides=",">
BID,EMPNAME,AGE,SEX,CREATETIME,SALARY,
</trim>
<trim prefix=" VALUES (" suffix=")" suffixOverrides=","> 
#{bId},#{empName},#{age},#{sex},#{createTime},#{salary}
</trim>
</insert>

注意bid在哪里出现就应该不出错了。就不详细说,没意思。



<!--UUID生成主键  -->
<insert id="saveStu" parameterType="project.entity.Student">
<selectKey keyProperty="stuId" order="BEFORE" resultType="java.lang.String">
SELECT SYS_GUID() FROM DUAL
</selectKey>
INSERT INTO STUDENT 
<trim prefix="(" suffixOverrides="," suffix=")">
STUID,STUNAME,
</trim>
<trim prefix=" VALUES (" suffixOverrides="," suffix=")">
#{stuId},#{stuName},
</trim>
</insert>


九、

<!-- 批量插入数据,主键自动生成 -->
<insert id="batchInsert"  parameterType="list">
INSERT INTO EMP
<trim prefix="(" suffix=")" suffixOverrides=",">
BID,EMPNAME,AGE,SEX,CREATETIME,SALARY,
</trim>
SELECT seq_emp.nextval, e.* FROM
<foreach collection="list" item="item" index="index" open="(" close=")" separator="union all">
SELECT 
#{item.empName},#{item.age},#{item.sex},#{item.createTime},#{item.salary}
FROM DUAL
</foreach>
e
</insert>


根据语法。insert into 表名(列名1,列名2,....) select * from 表名语法。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值