insert, update 和 delete
-
标签属性
属性 描述 id
命名空间中的唯一标识符,可被用来代表这条语句。 parameterType
将要传入语句的参数的完全限定类名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器推断出具体传入语句的参数,默认值为未设置(unset)。 parameterMap
这是引用外部 parameterMap 的已经被废弃的方法。请使用内联参数映射和 parameterType 属性。flushCache
将其设置为 true 后,只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值:true(对于 insert、update 和 delete 语句)。 timeout
这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为未设置(unset)(依赖驱动)。 statementType
STATEMENT,PREPARED 或 CALLABLE 的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。 useGeneratedKeys
(仅对 insert 和 update 有用)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段),默认值:false。 keyProperty
(仅对 insert 和 update 有用)唯一标记一个属性,MyBatis 会通过 getGeneratedKeys 的返回值或者通过 insert 语句的 selectKey 子元素设置它的键值,默认值:未设置( unset
)。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。keyColumn
(仅对 insert 和 update 有用)通过生成的键值设置表中的列名,这个设置仅在某些数据库(像 PostgreSQL)是必须的,当主键列不是表中的第一列的时候需要设置。如果希望使用多个生成的列,也可以设置为逗号分隔的属性名称列表。 databaseId
如果配置了数据库厂商标识(databaseIdProvider),MyBatis 会加载所有的不带 databaseId 或匹配当前 databaseId 的语句;如果带或者不带的语句都有,则不带的会被忽略。 -
返回自增主键
例如mysql等数据库,支持数据库自增。
useGeneratedKeys
、
keyProperty、
keyColumn`使用(使用的是mysql数据库,支持自增)<insert id="InsertUser1" parameterType="com.zm.entity.User"> insert into tb_users(name,password,age) values(#{name},#{password},#{age}) </insert> <!-- useGeneratedKeys="true" 表示允许获取数据库中自增的主键 keyProperty="id" 表示 获取的自增主键值赋值给JavaBean对象的哪个属性 keyColumn="id" 表示 数据库中的主键字段 --> <insert id="InsertUser2" parameterType="com.zm.entity.User" useGeneratedKeys="true" keyProperty="id" keyColumn="id"> insert into tb_users(name,password,age) values(#{name},#{password},#{age}) </insert>
测试代码
@Test public void test13() { SqlSession session = sqlSessionFactory.openSession(); UserMapper mapper = session.getMapper(UserMapper.class); User user = new User(); user.setName("lucy"); user.setPassword("abcd123"); user.setAge(18); //不使用`useGeneratedKeys` int i = mapper.InsertUser1(user); System.out.println("插入数据影响条数"+i); session.commit(); System.out.println("用户ID为:"+user.getId()); session.close(); } @Test public void test14() { SqlSession session = sqlSessionFactory.openSession(); UserMapper mapper = session.getMapper(UserMapper.class); User user = new User(); user.setName("lucy"); user.setPassword("abcd123"); user.setAge(18); //使用`useGeneratedKeys` int i = mapper.InsertUser2(user); System.out.println("插入数据影响条数"+i); session.commit(); System.out.println("用户ID为:"+user.getId()); session.close(); }
测试结果:
插入数据影响条数1 用户ID为:null 插入数据影响条数1 用户ID为:12
-
返回非自增主键
对于一些数据库不支持自增ID,比如Oracle数据库使用的序列,然后赋值给id字段,再执行数据库插入操作
使用
selectKey
标签属性 描述 keyProperty
selectKey 语句结果应该被设置的目标属性。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。 keyColumn
匹配属性的返回结果集中的列名称。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。 resultType
结果的类型。MyBatis 通常可以推断出来,但是为了更加精确,写上也不会有什么问题。MyBatis 允许将任何简单类型用作主键的类型,包括字符串。如果希望作用于多个生成的列,则可以使用一个包含期望属性的 Object 或一个 Map。 order
这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先生成主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 中的语句 - 这和 Oracle 数据库的行为相似,在插入语句内部可能有嵌入索引调用。 statementType
与前面相同,MyBatis 支持 STATEMENT,PREPARED 和 CALLABLE 语句的映射类型,分别代表 PreparedStatement 和 CallableStatement 类型。 <insert id="InsertUser_mysql" parameterType="com.zm.entity.User"> <!-- keyProperty="id" 表示 获取的自增主键值赋值给JavaBean对象的哪个属性 resultType="Long" 结果类型。表示select的结果,设置为javaBean中主键属性的类型 order="AFTER" AFTER|BEFORE BEFORE表示先执行selectKey中的语句(生成主键)再执行insert语句 AFTER表示先执行insert语句在执行selectKey中的语句(获得主键 Mysql数据库: select LAST_INSERT_ID():mysql函数,当前连接session中,查询最后一次插入的ID(线程安全) select max(id)方式在多线程情况下回出现错误。推荐使用LAST_INSERT_ID()函数 ORacle数据库: 1.序列方式,给表创建序列,通过select 序列.NEXTVAL或者select 序列名.currval 2.UUID主键,select SYS_GUID() as userId from DUAL --> <selectKey keyProperty="id" resultType="Long" order="AFTER"> select LAST_INSERT_ID() </selectKey> insert into tb_users(name,password,age) values(#{name},#{password},#{age}) </insert>