MyBatis之insert——主鍵自增和自定義主鍵

一、實現描述:我們在寫程序時,時常會遇到這樣的問題:插入一條數據,但因有主鍵的存在,而有時候會報“違反唯一性約束”的錯誤,下面呢,我們就來利用MyBatis來解決這個問題。

二、此文使用的數據庫爲MySQL,如需要使用其他數據庫,請做適當更改即可。

三、根據主鍵的自增在MyBatis中進行配置實現,實現如下:

<insert id="insertRole" parameterType="role" useGeneratedKeys="true" keyProperty="id">
   insert into t_role(role_name,note) values (#{roleName},#{note})
</insert>
解析:

1、我們使用keyProperty屬性指定id爲主鍵字段,同時使用useGeneratedKeys屬性告訴MyBatis這個主鍵是否使用數據庫的內置規則生成。

2、其中,在數據庫中設置id的自增規則,如下所示:

mysql>alter table t_role change id id int primary key auto_increment;
3、在上面配置中,我們指定了id列爲自增字段,因此我們建立POJO,這樣的話,使用MyBatis的主鍵回填功能,實現正確的插入操作(無需設置id的值,MyBatis會用數據庫的設置進行處理)。
4、測試:

sqlSession = SqlSessionFactoryUtil.openSqlSession();
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
Role role = new Role();
role.setRoleName("test4");
role.setNote("test4Note");
roleMapper.insertRole(role);
System.err.println(role.getId());

四、自定義主鍵生成規則實現

實例如下:

<insert id="insertRole" parameterType="role" useGeneratedKeys="true" keyProperty="id">
    <selectKey keyProperty="id" resultTyle="int" order="BEFORE">
             select if(max(id) is null, 1, max(id) + 2) as newId from t_role
     </selectKey>
     insert into t_role(id,role_name,note) values(#{id},#{roleName},#{note});
</insert>
解析:上面顯示的爲MyBatis定義自增規則的配置,其實上面的selectKey配置類似於數據庫中的觸發器,order=“BEFORE”規定了在執行語句之前執行newId的查找,然後在執行插入語句。

這樣我們就利用自定義的主鍵規則實現了數據的新增。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章