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>
感谢您的阅读,希望对您有所帮助,不足之处也希望多探讨!
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
