一、簡(jiǎn)單的 insert 方法
1.UserMapper.xml
<insert id="insert" useGeneratedKeys="true" keyProperty="id" >
insert into sys_user(user_name,user_password,user_email,user_info,head_img,create_time)
values ( #{userName} , #{userPassword} , #{userEmail},
#{userInfo} , #{headImg, jdbcType=BLOB },
#{createTime, jdbcType= TIMESTAMP})
</insert>
1.指定特殊數(shù)據(jù)類型
(1)為了防止類型錯(cuò)誤,對(duì)于 些特殊的數(shù)據(jù)類型,建議指定具體的 jdbcType headimg 指定 BLOB 類型, createTime 指定 TIME STAMP 類型 (2)BLOB 對(duì)應(yīng)的類型是 ByteArrayinputStream ,就是二進(jìn)制數(shù)據(jù)流 由于數(shù)據(jù)庫(kù)區(qū)分 date、time、datetime 類型,但是 Java 中一般都使用 jave.util.Date 類型 因此為了保證數(shù)據(jù)類型的正確,需要手動(dòng)指定日期類型, date、time datetime 應(yīng)的 JDBC 類型分別為 DATE、TIME、TIMESTAMP2.<insert >元素,這個(gè)標(biāo)簽包含如下屬性
id :命名空間中的唯 標(biāo)識(shí)符,可用來(lái)代表這條語(yǔ)句 parameterType :即將傳入的語(yǔ)句參數(shù)的完全限定類名或別名 這個(gè)屬性是可選的,因?yàn)?MyBatis 可以推斷出傳入語(yǔ)句的具體參數(shù),因此不建議配置該屬性 flushCache :默認(rèn)值為 true ,任何時(shí)候只要語(yǔ)句被調(diào)用,都會(huì)清空一級(jí)緩存和二級(jí)緩存 timeout :設(shè)置在拋出異常之前,驅(qū)動(dòng)程序等待數(shù)據(jù)庫(kù)返回請(qǐng)求結(jié)果的秒數(shù) statementType :對(duì)于 STATEMENT PREPARED ALLABLE, MyBatis 會(huì)分別使用對(duì)應(yīng)的 Statement PreparedStatement Callable tatement ,默認(rèn) 值為PREPARED useGeneratedKeys :默認(rèn)值為false ,如果設(shè)置為true, MyBatis 使用 JDBC getGeneratedKeys 方法來(lái)取出由數(shù)據(jù)庫(kù)內(nèi)部生成的主鍵 keyProperty: MyBatis 通過(guò) getGeneratedKeys 獲取 鍵值后將要賦值的屬性名 如果希望得到多個(gè)數(shù)據(jù)庫(kù)自動(dòng)生成的列,屬性值也可以是以逗號(hào)分隔的屬性名稱列 keyColumn :僅對(duì)時(shí)INSERT和 UPDATE 有用 通過(guò)生成的鍵值設(shè)置 中的列名, 這個(gè) 設(shè)置僅在某些數(shù)據(jù)庫(kù)(如 PostgreSQL )中是必須的, 當(dāng)主鍵列不是 中的第 列時(shí) 要設(shè)置。如果希望得到多個(gè)生成的列,也可以是逗號(hào)分隔的屬性名稱列表 database Id :如果配置了 databaseidProvider會(huì)加載所有的不帶 databaseId 的或匹配當(dāng)前 databaseId 的語(yǔ)句 如果同時(shí)存在帶databaseId 和不帶 databaseid 的語(yǔ)句,后者會(huì)被忽略.
?2.UserMapperTest
@Test
public void testinsert() {
SqlSession sqlSession = getSqlSession();
try {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
SysUser user = new SysUser();
user.setUserName("test1");
user.setUserPassword("123456");
user.setUserEmail("test@mybatis.tk");
user.setUserInfo("test_info");
user.setHeadImg(new byte[]{1, 2, 3});
user.setCreateTime(new Date());
//只插入一條數(shù)據(jù)
int result=userMapper.insert(user);
Assert.assertEquals(1, result);
//id null ,沒(méi)有給 id 賦佳,并且沒(méi)有配置回寫 id 的值
Assert.assertNotNull(user.getId());
System.out.println(user.getId());
} finally {
sqlSession.rollback();
// sqlSession.commit();
sqlSession.close();
}
}
?1.只插入一條數(shù)據(jù)
Assert.assertEquals(1, result);2.回滾(不寫入數(shù)據(jù)庫(kù))文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-733459.html
sqlSession.rollback(); //修改數(shù)據(jù)庫(kù) sqlSession.commit();3.插入后判斷是否為空(為空/不為空,拋異常)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-733459.html
Assert.assertNotNull(user.getId()); Assert.assertNull(user.getId());
3.UserMapper
int insert(SysUser user);
二、返回主鍵自增的值
方法一:使用 JDBC 方式返回主鍵自增的值
<insert id="insert" useGeneratedKeys="true" keyProperty="id" >
useGeneratedKeys 設(shè)置為 true 后, MyBatis 會(huì)使用 JDBC getGeneratedKeys方 法來(lái)取出 由數(shù)據(jù)庫(kù)內(nèi)部生成的主鍵。獲得主鍵值后將其賦值給 keyProperty 配置的 id 屬性。 當(dāng)需要設(shè)置多個(gè)屬性時(shí),使用逗號(hào)隔開,這種情況下通常還需要設(shè)置 keyCo lumn 屬性 按順 序指定數(shù)據(jù)庫(kù)的列,這里列的值會(huì)和 keyProperty 配置的屬性一一對(duì)應(yīng)。由于要使用數(shù)據(jù)庫(kù) 返回的主鍵值,所以 上下兩部分的列中去掉了 id 列和對(duì)應(yīng)的#{ id }屬性。
?方法二:使用 selectKey 返回主鍵的值
<selectKey resultType="Long" order="AFTER" keyProperty="id">
SELECT LAST_INSERT_ID()
</selectKey>
1.selectKey 標(biāo)簽 keyColumn keyProperty 和上面 useGeneratedKeys 的用法含義相同 ,這 resultType 用于設(shè)置返回值類型 ,order 屬性的設(shè)置和使用的數(shù)據(jù)庫(kù)有關(guān) MySQL 數(shù)據(jù)庫(kù)中, order 屬性設(shè)置的值是 AFTER,因?yàn)楫?dāng)前記錄的主鍵值在 insert 語(yǔ)句 ,執(zhí)行成功后才能獲取 而在 Oracle 數(shù)據(jù)庫(kù)中, order 的值要設(shè)置為 BEFORE ,這是因?yàn)?Oracl 中需要先從序列獲取值,然后將值作為主鍵插入到數(shù)據(jù)庫(kù)中. 2.可以發(fā)現(xiàn), selectKey 元素放置的位置和之前 MySQL 例子中的不同,其實(shí)這個(gè)元素放置的位置不會(huì)影響 selectKey 中的方法在 insert 前面或者后面執(zhí)行的順序,影響執(zhí)行順序 order 屬性,這么寫僅僅是為了符合實(shí)際的執(zhí)行順序,看起來(lái)更直觀而已 selectKey 元素中的內(nèi)容。它內(nèi)容就是一個(gè)獨(dú)立的 SQL 語(yǔ)句, 在 Oracle 示例中, SELECT SEQ_ ID.nextval from dual是一個(gè)獲取序列的 SQL 語(yǔ)句。 MySQL 中的 SQL 語(yǔ)句 SELECT LAST_ INSERT_ ID ()用于獲取 數(shù)據(jù)庫(kù)中最后插入的數(shù)據(jù)的 ID 以下是其他 些支持主鍵自增的數(shù)據(jù)庫(kù)配置 electKey中回寫主鍵的 SQL ··DB2 使用 VALUES IDENTITY_VAL_LOCAL () ? MYSQL 使用 SELECT LAST_INSERT_ID () ? SQLSERVER 使用 SELECT SCOPE_IDENTITY ()。 ? CLOUDSCAPE 使用 VALUES IDENTITY_VAL_LOCAL () ? DERBY 使用 VALUES IDENTITY_VAL_LOCAL () ? HSQLDB 使用 CALL IDENTITY() SYBASE 使用 SELECT @@IDENTITY ? DB2 MF 使用 SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMYl ? FORMIX 使用 select dbinfo ('sqlea.sqlerrdl') from systables where tabid=l
到了這里,關(guān)于mybatis實(shí)戰(zhàn):四、insert 用法(普通插入、返回主鍵自增的值)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!