mybatis怎么对有外键的表进行插入数据

mybatis怎么对有外键的表进行插入数据,第1张

有外键的情况应该先添加主表数据,再添加副表数据。

如:有以下两张表

班级表:

CLASSID NAME

1 一班

2 二班

学生表:

SID NAMECLASSID

1 张三 1

2 李四 1

3 王五 2

其中学生表中的CLASSID是班级表CLASSID的外键。

现在要求在学生表中添加一条SID=4,NAME=赵六,CLASSID=3的数据,那么只能先在班级表中加入一条新数据。

1

insert into 班级表 values (3,'三班')

然后再在学生表中添加:

1

insert into 学生表 values (4,'赵六',3)

mybatis自增主键配置

mybatis进行插入 *** 作时,如果表的主键是自增的,针对不同的数据库相应的 *** 作也不同。基本上经常会遇到的就是 Oracle Sequece 和 Mysql 自增主键。主要说明下在mybatis中对于自增主键的配置。

1、不返回自增主键值:

如果考虑到插入数据的主键不作为其他表插入数据的外键使用,可以考虑这种方式。

Oracle Sequence 配置

<sql id='TABLE_NAME'>TEST_USER</sql>

<sql id='TABLE_SEQUENCE'>SEQ_TEST_USER_ID.nextval</sql>

 <!-- 注意这里直接调用sequence的nextval函数 -->

 <insert id="insert" parameterType="User">

     insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)

         values ( <include refid="TABLE_SEQUENCE" /> ,#{name}, #{age} )

 </insert>

当插入语句如上配置时,那么针对如下语句

 User user = new User()

 user.setName("test")

 user.setAge(24)

 userMapper.insert(user)

 System.out.println(user.id) // user.id 为空

user.id为空,也就是说如上的配置并不能在完成插入 *** 作后将插入时的主键值存放到保存的对象中。

2、Mysql自增主键配置

由于mysql数据库中,可以设置表的主键为自增,所以对于Mysql数据库在mybatis配置插入语句时,不指定插入ID字段即可。主键的自增交由Mysql来管理。

<sql id='TABLE_NAME'>TEST_USER</sql>

<!-- 注意这里的插入SQL中是没有指明ID字段的! -->

<insert id="insert" parameterType="User">

    insert into <include refid="TABLE_NAME" /> (NAME,AGE)

        values (#{name}, #{age} )

</insert>

同样,针对Mysql如此配置mybaits,插入完成后user.id为空。

插入后获取自增主键值:

上述的情况能满足大部分情况,但有时候我们会遇到类似一对多的那种表结构,在插入多端数据时,需要获取刚刚保存了的一段的主键。那么这个时候,上述的配置就无法满足需要了。为此我们需要使用mybatis提供的<selectKey />来单独配置针对自增逐渐的处理。

1、Oracle Sequence 配置:

<sql id='TABLE_NAME'>TEST_USER</sql>

 <sql id='TABLE_SEQUENCE'>SEQ_TEST_USER_ID.nextval</sql>

 <!-- 注意这里需要先查询自增主键值 -->

 <insert id="insert" parameterType="User">

     <selectKey keyProperty="id" resultType="int" order="BEFORE">

         select <include refid="TABLE_SEQUENCE" /> from dual

     </selectKey>

     insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)

         values ( #{id}, #{name}, #{age} )

 </insert>

当使用了<selectKey />后,在实际的插入 *** 作时,mybatis会执行以下两句SQL:

select SEQ_TEST_USER_ID.nextval from dual // 语句1

 insert into (ID,NAME,AGE) values ( ?, ?, ? ) // 语句2

在执行插入 语句2 之前,会先执行 语句1 以获取当前的ID值,然后mybatis使用反射调用User对象的setId方法,将 语句1 查询出的值保存在User对象中,然后才执行 语句2 这样就保证了执行完插入后

User user = new User()

 user.setName("test")

 user.setAge(24)

 userMapper.insert(user)

 System.out.println(user.id) // user.id 不为空

user.id是有值的。

2、Mysql自增主键配置

针对于Mysql这种自己维护主键的数据库,可以直接使用以下配置在插入后获取插入主键,

<sql id='TABLE_NAME'>TEST_USER</sql>

 <insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="User">

     insert into <include refid="TABLE_NAME" /> ( NAME, AGE )

         values ( #{name}, #{age} )

 </insert>

当然,由于Mysql的自增主键可以通过SQL语句

select LAST_INSERT_ID()

来获取的。因此针对Mysql,Mybatis也可配置如下:

<sql id='TABLE_NAME'>TEST_USER</sql>

 <!-- 注意这里需要先查询自增主键值 -->

 <insert id="insert" parameterType="User">

     <selectKey keyProperty="id" resultType="int" order="BEFORE">

         SELECT LAST_INSERT_ID()

     </selectKey>

     insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)

         values ( #{id}, #{name}, #{age} )

 </insert>

只不过该中配置需要额外的一条查询SQL

小结

当数据插入 *** 作不关心插入后数据的主键(唯一标识),那么建议使用 不返回自增主键值 的方式来配置插入语句,这样可以避免额外的SQL开销.

当执行插入 *** 作后需要立即获取插入的自增主键值,比如一次 *** 作中保存一对多这种关系的数据,那么就要使用 插入后获取自增主键值 的方式配置.

Dao层

int updateByList(List list)

Mappe层

批量修改

<update id="updateByList" parameterType="java.util.List">

<foreach collection="list" item="item" index="index" separator="">

update jt_fin_repayment_plan

<set >

erestTotal != null" >

ORG_INTEREST_TOTAL = #{item.orgInterestTotal},

</if>

<if test="item.delFlag != null" >

DEL_FLAG = #{item.delFlag},

</if>

<if test="item.state != null" >

STATE = #{item.state},

</if>

<if test="item.createBy != null" >

CREATE_BY = #{item.createBy},

</if>

<if test="item.createTime != null" >

CREATE_TIME = #{item.createTime},

</if>

<if test="item.updateBy != null" >

UPDATE_BY = #{item.updateBy},

</if>

UPDATE_TIME = #{NOW(),

</set>

where REPAYMENT_ID = #{item.repaymentId}

</foreach>

</update>

----------------------------------------------------------------------------------------------------------

dao层

//批量添加

int addList(List list)

Map层

批量添加

<insert id="addList" parameterType="java.util.List">

insert into jt_fin_adjust_rates_project_history (

ID,ADJUST_RATES_ID,PROJECT_ID,START_WHOLE,

END_WHOLE,START_WITHOUT,END_WITHOUT,PROJECT_DATE,

KEEP,AUDIT_FLAG,STATUS,REMARK,DEL_FLAG,

CREATE_BY,CREATE_TIME,UPDATE_TIME,UPDATE_BY

)

values

<foreach collection="list" separator="," item="item" index="index">

((select UUID()), #{item.adjustRatesId},#{item.projectId},#{item.startWhole},

#{item.endWhole},#{item.startWithout},#{item.endWithout},#{item.projectDate},

#{item.keep},#{item.auditFlag},#{item.status},#{item.remark},#{item.delFlag},

#{item.createBy},sysdate(), #{item.updateTime}, #{item.updateBy})

</foreach>

</insert>

注意:我的id VARCHAR类型 主键 不能递增 在这里我用的是UUID生成的

原本,想写一个批量添加,回显id但是没实现就不写了,有大佬可以补充一下


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/7994646.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-12
下一篇 2023-04-12

发表评论

登录后才能评论

评论列表(0条)

保存