某个主键是由oracle中的序列生成的
<insert parameterType="Employee"> <!-- keyProperty: 表示将从序列获得的值赋予实体的哪个属性 order: 表示主键值生成的方式,可取值:BEFORE | AFTER 由于不同的数据库对插入的数据时主键生成方式是不同,例如: mysql and ms server: 主键生成方式为后生成方式。 oracle: 主键生成方式预生成. --> <!--调用数据库中的序列,并赋值给传入的Employee对象的empno属性 --> <selectKey keyProperty="empno" resultType="integer" order="BEFORE"> select EMP_SEQ.nextval from dual </selectKey> <!-- 如果使用这种整表插入的方式,那当数据库表的某些列可以为空值时,我将要告诉底层的JDBC驱动如何处理空值的情况,这不是mybatis所需要的, 而是底层有些JDBC驱动所需的特性,实际上就是让JDBC驱动去调用PrepareStatement.setNull()来设置空值 --> <!--如果是常用的数据类型int,date等,jdbcType可以省略不写 --> insert into EMPLOYEE values (#{empno},#{ename},#{job},#{mgr,jdbcType=INTEGER},#{hiredate,jdbcType=DATE},#{sal,jdbcType=DOUBLE},#{comm,jdbcType=DOUBLE},#{deptno,jdbcType=INTEGER}) </insert>复用sql语句
把insert要插入的列名和数值写在sql标签里,之后方便重用,之后重用的时候需要使用include子标签拼接sql语句
<!--insert into employee(ENAME,JOB..) values(xx,xx) --> <!--(ENAME,JOB..) --> <sql> <!-- suffixOverrides属性,会自动把多余的“,”删除 --> <trim prefix="(" suffix=")" suffixOverrides=","> empno, <if test="ename != null">ENAME,</if> <if test="job != null">JOB,</if> <if test="mgr != null">MGR,</if> <if test="hiredate != null">HIREDATE,</if> <if test="sal != null">SAL,</if> <if test="comm != null">COMM,</if> <if test="deptno != null">DEPTNO,</if> </trim> </sql> <!--(xx,xx,xx) --> <sql> <trim prefix="values(" suffix=")" suffixOverrides=","> #{empno}, <if test="ename != null">#{ename},</if> <if test="job != null">#{job},</if> <if test="mgr != null">#{mgr},</if> <if test="hiredate != null">#{hiredate},</if> <if test="sal != null">#{sal},</if> <if test="comm != null">#{comm},</if> <if test="deptno != null">#{deptno},</if> </trim> </sql> <insert parameterType="Employee"> <selectKey keyProperty="empno" resultType="integer" order="BEFORE"> select EMP_SEQ.nextval from dual </selectKey> insert into EMPLOYEE <!--拼接sql --> <include refid="insert_set_column"/> <include refid="insert_values"/> </insert> 更新 <update parameterType="Employee"> update EMPLOYEE <set> <if test="ename != null and ename.trim().length>0">ENAME=#{ename},</if> <if test="job != null and job.trim().length>0">JOB=#{job},</if> <if test="mgr != null">MGR=#{mgr},</if> <if test="hiredate != null">HIREDATE=#{hiredate},</if> <if test="sal != null">SAL=#{sal},</if> <if test="comm != null">COMM=#{comm},</if> <if test="deptno != null">DEPTNO=#{deptno},</if> </set> <!-- <where>如果带多条件的更依然可以使<where>元素动态生成where子句</where> --> where EMPNO=#{empno} </update> <update parameterType="Employee"> update EMPLOYEE <trim prefix="set" suffixOverrides=","> <if test="ename != null and ename.trim().length>0">ENAME=#{ename},</if> <if test="job != null and job.trim().length>0">JOB=#{job},</if> <if test="mgr != null">MGR=#{mgr},</if> <if test="hiredate != null">HIREDATE=#{hiredate},</if> <if test="sal != null">SAL=#{sal},</if> <if test="comm != null">COMM=#{comm},</if> <if test="deptno != null">DEPTNO=#{deptno},</if> </trim> <!-- <where>如果带多条件的更依然可以使<where>元素动态生成where子句</where> --> where EMPNO=#{empno} </update> 删除 <delete parameterType="Employee"> delete EMPLOYEE EMPNO=#{empno} <!--条件多的话也可以使用<where>...</where> --> </delete>w3c select标签、delete标签等详解
高级使用 1.动态代理我们之前,上面都是在Dao类中写上一段sqlsession.selectOne/selectList,还是比较麻烦
所以mybatis提供了一种简单的方法,使用动态代理(接口类)可以简化步骤
Mybatis中有这样的约定:
接口方法名与mapper中的id相同
接口方法参数与parameterType类型相同
接口方法的返回值类型与resultType类型相同
满足上面的条件,Mybatis就会将接口类中的方法和mapper中的sql语句一一对应起来,而不需要再次新建一个Dao,在Dao类里面编写方法
具体步骤:
1. 实体类编写
2. 新建接口类
如果方法的返回值为void,则mapper中就不需要定义resultType属性