Mybatis返回主键ID

Mybatis返回注解ID

    • 1.使用场景
    • 2.代码实例
    • 3.扩展Mybatis常用标签

1.使用场景

开发工作很经常会碰到主从表的结构,从表里面有主表ID的关联列。当新增表数据时,插入主表的同时也要插入从表,并且从表中的关联列要是对应的主表ID值。而整个增加的方法会放在同一个事务里面做事务管理,就无法插入主表后去查询该主键ID。这时就需要Mybatis的返回主键标签selectKey,下面以新增订单的操作为例:

2.代码实例

Service方法实现

    @Override@Transactional(rollbackFor = Exception.class)public void saveTYwChemicalmonitor(Orders orders) {this.checkOrders(orders);//获取登录人信息PersonVo personVo = authComponent.getCurrentUserInfoById();orders.setFstatus(1);orders.setFcreatorid(personVo.getId().toString());ordersDao.insertOrders(orders);List<Ordersentry> entryList = orders.getOrdersentries();for (Ordersentry ordersentry:entryList) {ordersentry.setOrdersid(orders.getFid());ordersDao.insertOrdersentry(ordersentry);}}

Mybatis数据库操作示例

    <insert id="insertOrders" parameterType="com.example.demo.entity.Orders">INSERT INTO 语句<selectKey keyProperty="id" order="AFTER" resultType="int">SELECT LAST_INSERT_ID()</selectKey></insert>

selectKey标签元素属性介绍

属性描述
keyProperty设置目标属性列,如果想得到多个列,可以用逗号隔开
order可以设置为 BEFORE 或 AFTER , BEFORE表示先生成 key 再执行插入语句,AFTER 则相反
resultType设置目标属性列的数据类型

主要注意的是上面的示例是以mysql为例,而oracle并不支持主键自增,是使用序列得到的主键值,然后再插入数据库中,所以oracle对应的代码是:

    <insert id="insertOrders" parameterType="com.example.demo.entity.Orders">INSERT INTO 语句<selectKey keyProperty="id" order="BEFORE" resultType="int">SELECT SEQ_ID.nextval from dual</selectKey></insert>

3.扩展Mybatis常用标签

if:判断标签,动态拼接sql,这里的trim()方法表示去掉首位空格

    <if test="name != null and name != ''">and fname like concat('%', trim(#{fname}), '%')</if>

foreach:循环标签,用于构件In条件,或者批量插入数据

    <select id="selectStudent" resultMap="BaseResultMap">select name,hobby from student where id in<foreach item="item" index="index" collection="list" open="(" separator="," close=")">#{item}</foreach></select><!----><insert id="insertAuthor" useGeneratedKeys="true"  keyProperty="id">insert into Author (username, password, email, bio) values<foreach item="item" collection="list" separator=",">(#{item.username}, #{item.password}, #{item.email}, #{item.bio})</foreach></insert>

choose:选择标签,有一个when成立,则choose结束。都没有成立的话则执行otherwise中的语法

	<select id="getStudentListChoose" parameterType="Student" resultMap="BaseResultMap">     SELECT * from STUDENT WHERE 1=1    <where>     <choose>     <when test="Name!=null and student!='' ">     AND name LIKE CONCAT(CONCAT('%', #{student}),'%')      </when>     <when test="hobby!= null and hobby!= '' ">     AND hobby = #{hobby}      </when>                   <otherwise>     AND AGE = 15  </otherwise>     </choose>     </where>     </select>  

sql include :定义和引用标签,当同一个mapper下的很多方法都会用到一些查询字段,或者where条件。将其定义为常量,提高代码的复用性和可读性

    <!-- 查询字段 --><sql id="Base_Column_List">ID,MAJOR,BIRTHDAY,AGE,NAME,HOBBY</sql><select id="selectStudent" resultMap="com.example.demo.entity.Student">SELECT<include refid="Base_Column_List" />FROMstudent<include refid="Example_Where_Clause" /></select>

感谢您的阅读,希望对您有所帮助,不足之处也希望多探讨!


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部