|
MyBatis insert 標(biāo)簽用來定義插入語句,執(zhí)行插入操作。當(dāng) MyBatis 執(zhí)行完一條插入語句后,就會返回其影響數(shù)據(jù)庫的行數(shù)。 下面通過一個示例演示 insert 標(biāo)簽的具體用法。 1. 修改 WebsiteMapper.xml,增加插入語句,代碼如下。 <!-- 增加網(wǎng)站信息 -->
<insert id="addWebsite" parameterType="string"> insert into website(name)
values(#{name})</insert>12345復(fù)制代碼類型:[java]2. 在 WebsiteMapper 接口中定義一個 add() 方法,代碼如下。 public int addWebsite(String name);1復(fù)制代碼類型:[java] 參數(shù)為 Sting 類型的字符串;返回值為 int 類型,即執(zhí)行 SQL 后,插入記錄的行數(shù)。 3. 測試代碼如下。 //插入 name 為開課吧4 的記錄String name = "開課吧4";int i = websiteMapper.addWebsite(name);
System.out.println("共插入了 " + i + " 條記錄");1234復(fù)制代碼類型:[java]4. 執(zhí)行測試代碼,控制臺輸出如下。 共插入了 1 條記錄1復(fù)制代碼類型:[java] insert 標(biāo)簽常用屬性insert 標(biāo)簽中常用的屬性如下表。
注意:insert 標(biāo)簽中沒有 resultType 屬性,只有查詢操作才需要對返回結(jié)果類型進行相應(yīng)的指定。 傳遞多個參數(shù)在上面的示例中,我們在插入語句中只使用了一個 String 類型的參數(shù),而在實際的開發(fā)過程中,我們的插入語句往往需要使用多個參數(shù),Mybatis 為我們提供以下 3 種方式,來實現(xiàn)給映射器傳遞多個參數(shù): 使用 Map 傳遞參數(shù) 使用注解傳遞參數(shù) 使用 JavaBean 傳遞參數(shù) 使用 Map 傳遞參數(shù) 我們可以將參數(shù)封裝到一個 Map 對象中,然后傳遞給 MyBatis 的映射器,示例如下。 1. 在 WebsiteMapper 接口中,定義一個 addWebsiteByMap() 方法,并使用 Map 傳遞參數(shù),方法如下。 int addWebsiteByMap(Map<String, String> params);1復(fù)制代碼類型:[java] 2. 在 WebsiteMapper.xml 中,使用 insert 標(biāo)簽定義一條插入語句,并接收通過 Map 傳遞的參數(shù),配置如下。 <!--接收 Map 參數(shù)-->
<insert id="addWebsiteByMap" parameterType="map"> insert into Website (name, url) values (#{name}, #{url})</insert>1234復(fù)制代碼類型:[java]3. 測試代碼如下。 Map<String, String> params = new HashMap<>();
params.put("name", "開課吧");
params.put("url", "https://topic./");
int i = websiteMapper.addWebsiteByMap(params);
System.out.println("通過 Map 成功向數(shù)據(jù)庫中添加了 " + i + " 條記錄");12345復(fù)制代碼類型:[html]4. 執(zhí)行測試代碼,控制臺輸出如下。 通過 Map 成功向數(shù)據(jù)庫中添加了 1 條記錄1復(fù)制代碼類型:[java] 使用注解傳遞參數(shù)我們還可以使用 MyBatis 提供的 @Param 注解給注解器傳遞參數(shù),示例代碼如下。 1. 在 WebsiteMapper 接口中,定義一個 addWebsiteByParam() 方法,并使用 @Param 注解傳遞參數(shù),方法如下 int addWebsiteByParam(@Param("name") String name, @Param("url") String url);1復(fù)制代碼類型:[java]2. 在 WebsiteMapper.xml 中使用 insert 標(biāo)簽定義一條插入語句,并接收通過 @Param 注解傳遞的參數(shù),配置如下。 <!--接收 @Param 注解傳遞的參數(shù)-->
<insert id="addWebsiteByParam"> insert into Website (name, url) values (#{name}, #{url})</insert>1234復(fù)制代碼類型:[java]3. 測試代碼如下。 int i = websiteMapper.addWebsiteByParam("kaikeba", "topic./");
System.out.println("通過 @Param 注解成功向數(shù)據(jù)庫中添加了 " + i + " 條記錄");12復(fù)制代碼類型:[html]4. 執(zhí)行測試代碼,控制臺輸出如下。 通過 @Param 注解成功向數(shù)據(jù)庫中添加了 1 條記錄1復(fù)制代碼類型:[java] 使用 JavaBean 傳遞參數(shù)在參數(shù)過多的情況下,我們可以將參數(shù)通過 setter 方法封裝到 JavaBean(實體類)對象中 ,傳遞給映射器。 1. 在 WebsiteMapper 接口中,定義一個 addWebsiteByJavaBean() 方法,并使用 JavaBean 傳遞參數(shù),方法如下。 int addWebsiteByJavaBean(Website website);1復(fù)制代碼類型:[java] 2. 在 WebsiteMapper.xml 中使用 insert 標(biāo)簽定義一條插入語句,并接收通過 JavaBean 傳遞的參數(shù),配置如下。 <!--接收通過 JavaBean 傳遞的參數(shù)-->
<insert id="addWebsiteByJavaBean" parameterType="com.kaikeba.topic.po.Website"> insert into Website (name, url) values (#{name}, #{url})</insert>//1234復(fù)制代碼類型:[java]3. 測試代碼如下。 //創(chuàng)建 JavaBean 對象Website website = new Website();//通過 setter 方法將參數(shù)封裝website.setName("kaikeba JavaBean");
website.setUrl("topic.");int i = websiteMapper.addWebsiteByJavaBean(website);
System.out.println("通過 JavaBean 成功向數(shù)據(jù)庫中添加了 " + i + " 條記錄");1234567復(fù)制代碼類型:[java]4. 執(zhí)行測試代碼,控制臺輸出如下。 通過 JavaBean 成功向數(shù)據(jù)庫中添加了 1 條記錄1復(fù)制代碼類型:[java] 區(qū)別以上 3 種方式的區(qū)別如下: 使用 Map 傳遞參數(shù)會導(dǎo)致業(yè)務(wù)可讀性的喪失,繼而導(dǎo)致后續(xù)擴展和維護的困難,所以在實際應(yīng)用中我們應(yīng)該果斷廢棄該方式。 使用 @Param 注解傳遞參數(shù)會受到參數(shù)個數(shù)的影響。當(dāng) n≤5 時,它是最佳的傳參方式,因為它更加直觀;當(dāng) n>5 時,多個參數(shù)將給調(diào)用帶來困難。 當(dāng)參數(shù)個數(shù)大于 5 個時,建議使用 JavaBean 方式。 主鍵(自動遞增)回填我們知道,MySQL、SQL Server 等數(shù)據(jù)庫表可以采用自動遞增的字段作為其主鍵,當(dāng)向這樣的數(shù)據(jù)庫表插入數(shù)據(jù)時,即使不指定自增主鍵的值,數(shù)據(jù)庫也會根據(jù)自增規(guī)則自動生成主鍵并插入到表中。 一些特殊情況下,我們可能需要將這個剛剛生成的主鍵回填到請求對象(原本不包含主鍵信息的請求對象)中,供其他業(yè)務(wù)使用。此時,我們就可以通過在 insert 標(biāo)簽中添加 keyProperty 和 useGeneratedKeys 屬性,來實現(xiàn)該功能。 下面我們通過一個示例,來演示主鍵(自動遞增)回填功能。 1. 為 WebsiteMapper.xml 中 id 為 addWebsite 的 insert 標(biāo)簽添加 keyProperty 和 useGeneratedKeys 屬性,具體代碼如下: <!--添加一個網(wǎng)站信息,成功后將主鍵值返回填給id(po的屬性)-->
<insert id="addWebsite" parameterType="net.biancheng.po.Website" keyProperty="id" useGeneratedKeys="true"> insert into Website (name,url) values(#{name},#{url})</insert>1234復(fù)制代碼類型:[java]2. 測試代碼如下: // 添加一個網(wǎng)站信息Website addsite = new Website();//插入的對象中不包含主鍵 id addsite.setName("kaikeba ");
addsite.setUrl("https://topic./");//執(zhí)行插入int num = websiteMapper.addWebsite(addsite);
System.out.println("添加了 " + num + " 條記錄");//獲取回填的主鍵System.out.println("添加記錄的主鍵是:" + addsite.getId());12345678910復(fù)制代碼類型:[java]3. 執(zhí)行測試代碼,控制臺輸出如下。 添加了 1 條記錄 添加記錄的主鍵是:312復(fù)制代碼類型:[java] 自定義主鍵如果在實際項目中,若數(shù)據(jù)庫不支持主鍵自動遞增(例如 Oracle),或者取消了主鍵自動遞增的規(guī)則,我們可以使用 MyBatis 的 標(biāo)簽自定義生成主鍵,具體配置代碼如下。 <!-- 添加一個網(wǎng)站,#{name}為 com.kaikeba.po.Website 的屬性值 -->
<insert id="insertWebsite" parameterType="com.kaikeba.po.Website">
<!-- 先使用selectKey標(biāo)簽定義主鍵,然后再定義SQL語句 -->
<selectKey keyProperty="id" resultType="Integer" order="BEFORE"> select if(max(id) is null,1,max(id)+1) as newId from Website
</selectKey>
insert into Website (id,name,url) values(#{id},#{name},#{url})</insert>12345678復(fù)制代碼類型:[java]標(biāo)簽中屬性說明如下: keyProperty:用于指定主鍵值對應(yīng)的 PO 類的屬性。 order:該屬性取值可以為 BEFORE 或 AFTER。BEFORE 表示先執(zhí)行 標(biāo)簽內(nèi)的語句,再執(zhí)行插入語句;AFTER 表示先執(zhí)行插入語句再執(zhí)行 標(biāo)簽內(nèi)的語句。 |
|
|