mybatis学习(二):XML映射文件-insert, update 和 delete

insert, update 和 delete

  1. 标签属性

    属性描述
    id命名空间中的唯一标识符,可被用来代表这条语句。
    parameterType将要传入语句的参数的完全限定类名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器推断出具体传入语句的参数,默认值为未设置(unset)。
    parameterMap这是引用外部 parameterMap 的已经被废弃的方法。请使用内联参数映射和 parameterType 属性。
    flushCache将其设置为 true 后,只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值:true(对于 insert、update 和 delete 语句)。
    timeout这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为未设置(unset)(依赖驱动)。
    statementTypeSTATEMENT,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 的语句;如果带或者不带的语句都有,则不带的会被忽略。
  2. 返回自增主键

    例如mysql等数据库,支持数据库自增。

    useGeneratedKeyskeyPropertykeyColumn`使用(使用的是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
    
  3. 返回非自增主键

    对于一些数据库不支持自增ID,比如Oracle数据库使用的序列,然后赋值给id字段,再执行数据库插入操作

    使用 selectKey 标签

    属性描述
    keyPropertyselectKey 语句结果应该被设置的目标属性。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
    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>
    
    
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值